roslaunch
roslaunch是ros自帶的一個庫,使用roslaunch可以同時運行多個節點,通過編寫launch文件來配置各個節點
roslaunch的使用
以turtlesim為例
首先保證環境變量中是否有catkin_ws工作空間的路徑
echo $ROS_PACKAGE_PATH
若無,則進入該工作空間的根目錄,執行
source devel/setup.bash
之后在任意目錄下都可以進入之前創建的程序包
roscd beginner_tutorials
新建launch文件夾,在里面創建launch文件
mkdir launch
gedit turtlemimic.launch
拷貝以下launch文件的內容:
http://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
launch文件的格式是XML
下面先簡單說一下各個標簽、屬性的意思:
多個組的節點
-
group 標簽, 里面包含的是一個組內的定義,其屬性
- ns(namespace)定義了組名,用於區分不同組
-
node 標簽,里面包含的是一個節點的定義,屬性:
- pkg說明該node所在pkg的名字
- type說明該node的名字
- name相當於為當前的node起一個別名(可以不起別名,默認值與type屬性一致,但有時會造成歧義,比如在組內定義兩個同類型的節點時會用同一個名字(因為都是同一個'type')
- output指定輸出的位置
- args指定一些具體的參數,比如rosbag的play node需要指定文件路徑,也可以為node里面的一些topic改名字(應該說是連接到新名字)
-
node 標簽里面的子標簽 remap,為該node里面訂閱(或發布的topic) 重定向
上面文件在做什么?
首先分別在兩個組中各自建立了一個turtlesim_node,然后只控制組1的節點,讓組2的節點跟着組1的節點一起運動
以組1為例,group標簽定義了一個組,組的名字在ns屬性中給出 為"turtlesim1",該組內定義了一個node標簽,說明組內只有一個節點,該節點是ros包(pkg屬性)"turtlesim"里面的(type屬性)"turtlesim_node"節點(的一個實例) ,該節點的名字(name屬性)為"sim"
定義了兩個組之后,又定義了一個mimic(模仿)節點,用於使組2的節點模仿組1的節點運動,通過remap將input(輸入)話題重新映射到turtlesim1的turtle1話題,將output(輸出)話題映射到turtlesim2,意味着將turtlesim1/turtle1 topic作為mimic節點的input topic,而turtlesim2/turtle1 topic作為mimic節點的output topic
關於remap標簽的另一個例子
比如想同時用多張圖片跑一套算法,可以為每張img定義一個組:
以組1為例,每個組定義兩個節點:
- 一個節點專門發布數據(play rosbag)到某個話題上,另一個節點作為訂閱者,訂閱該話題來接收輸入數據
<node pkg="rosbag" type="play" name="img_1" output="screen" args="--clock path_to_data /topic_a:=/group_1/topic_a /topic_b:=/group_1/topic_b ..... ">
</node>
<node pkg="algorithm_pkg" type="algorithm_node" name="algorithm_1" output="screen">
<remap from="/topic_a" to="/group_1/topic_a" >
</remap>
</node>
節點1:在args屬性將原來topic名字映射成包含組名的新名字,意味着rosbag發布的topic名字變成 /group_1/topic_a 等等...
節點2:remap標簽,將該節點訂閱的話題重定向為新的名字,使其與在該組內發布數據的rosbag play節點所發布的話題名對應
為什么需要把原本的topic改為包含組名的?原本在算法節點中定義的訂閱者,訂閱的topic名字只是topic_a,由於輸入圖像不同,如果所有的輸入圖像都發布到topic_a這一個topic上,會造成混亂,因此應該一個輸入圖像對應一個話題名,同樣地接收該輸入圖像(即運行算法的節點)所訂閱的話題名也要隨之更改。
launch文件的更多內容:
在roslaunch文件中使用變量
//TODO