ROS學習筆記(二) :使用roslaunch


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM