1. 程式人生 > >由淺到深理解ROS(5)- launch啟動檔案的理解與編寫

由淺到深理解ROS(5)- launch啟動檔案的理解與編寫

https://www.cnblogs.com/zjiaxing/p/5542614.html

ROS提供了一個同時啟動節點管理器(master)和多個節點的途徑,即使用啟動檔案(launch file)。事實上,在ROS功能包中,啟動檔案的使用是非常普遍的。任何包含兩個或兩個以上節點的系統都可以利用啟動檔案來指定和配置需要使用的節點。通常的命名方案是以.launch作為啟動檔案的字尾,啟動檔案是XML檔案。一般把啟動檔案儲存在取名為launch的目錄中。

 

每個XML檔案都必須要包含一個根元素。根元素由一對launch標籤定義:<launch> … <launch>元素都應該包含在這兩個標籤之內。

節點屬性之節點元素的形式: 

<node pkg=”package-name” type=”executable-name” name=”node-name”/>在節點標籤末尾的斜槓“/”是必須的,但很容易忘。你也可以這樣顯式地給出結束標籤:

<node pkg=”…”type=”…” name=”…”></node> 如果該節點有子節點,例如 remap 或者 param 元素,那麼該顯式結束標籤是必不缺少的。還有就是name屬性給節點指派了名稱,它將覆蓋任何通過呼叫 ros::int來賦予節點的名稱。在預設狀態下,從啟動檔案啟動節點的標準輸出被重定向到一個日誌檔案中,而不是在制臺顯示。該日誌檔案的名稱是: ~/.ros/log/run_id/node_name-number-stout.log 其中,run_id 是節點管理器(master)啟動時生成的一個唯一標示符。

 

節點屬性之顯示屬性:

某個單獨的節點在控制檯中輸出資訊,只需在節點元素中配置:output=”screen”配置了該屬性的節點會將標準輸出顯示在螢幕上而不是記錄到日誌文件。

 

節點屬性之復位屬性:

對於每個節點,設定復位屬性為真 respawn=”true”,這樣當節點停止的時候,roslaunch會重新啟動該節點。比如在某個節點因為軟體崩潰或硬體故障以及其他原因導致過早退出系統的時候會起到作用。

節點屬性之必要節點:當一個節點被宣告為必要節點即 required=”true”終止的時候,roslaunch 會終止所有其他活躍節點並退出。比如在依賴控制檯的機器人遙控導航中,關閉了該遠端控制節點所在的視窗,roslaunch將會終止其他節點,然後退出。

 

節點屬性之名稱空間:

ns=”namespace”,前提是節點的程式碼在建立 ros::Pbulisher 和 ros::Subccriber 物件時使用了像 turtle1/pose 這樣的相對名稱 (而不是/turtle1/pose 這樣的全域性名稱)。同樣,啟動檔案中的節點名稱是相對名稱。例如<node name="turtlesim_node" pkg="turtlesim " type="turtlesim_node" ns="sim1" />而不能是

node name="/turtlesim_node" ,可以這麼不準確的理解:兩隻連體小龜,他們做一件事是同時在做,比如讓他們以不同的速度前進,他們做不到,若做手術分開,把他倆放在不同的房間(名稱空間)他倆真正地獨立起來,這樣每個小龜可以接受不同的命令去做事,而且互不干擾。動檔案預設名稱空間是全域性名稱空間“/”,因此,節點的預設名稱空間就解析為/sim1,所以對應的全域性名稱即/sim1/turtlesim_node。

 

名稱重對映:

重對映是基於替換的思想,每個重對映包含一個原始名稱和一個新名稱。每當節點使用重對映中的原始名稱時,ROS客戶端庫就會將它默默地替換成其對應的新名稱。例如,執行一個 turtlesime 的例項, 如果想要把海龜的姿態資料釋出到話題/tim 而不是/turtle1/pose,就可以使用如下命
令:rosrun turtlesim turtlesim_node turtle1/pose:=tim 通過啟動檔案的方式,只需在啟動檔案內使用重對映(remap)元素即可:<remap from=”turtle1/pose”to ”tim”/>

 

包含其他檔案:

如果想在啟動檔案中包含其他啟動檔案的內容( 包括所有的節點和引數),可以使用包含(include)元素<include file=”$(find package-name)/launch-file-name”>由於直接輸入路徑資訊很繁瑣且容易出錯,大多數包含元素都使用查詢(find)命令搜尋功能包的位置來替代直接輸入路徑。

 

啟動引數:

roslaunch還支援啟動引數,有時也簡稱為引數甚至args。在ROS中prarmeter和argument 是不同的,雖然翻譯一樣。parameter是執行中的ROS系統使用的數值,儲存在引數伺服器(parameter server)中,每個活躍的節點都可以通過 ros::param::get 函式來獲取parameter的值,使用者也可以通過rosparam來獲得parameter的值而argument只在啟動檔案內才有意義他們的值是不能被節點直接獲取的。

<arg name=”arg-name” default=”arg-value”/>與 <arg name=”arg-name” value=”arg-value”/>兩者的唯一區別在於命令列引數(roslaunch xx yy.launch dd:=t)可以覆蓋預設值default,但是不能覆蓋引數值 value。用$(arg arg-name)在每個該替換出現的地方,roslaunch 都將它替換成引數值。