ros launch檔案學習筆記
0.何為launch?
launch,中文含義是啟動,launch檔案顧名思義就是啟動檔案,要說這launch檔案啊,那還得從roslaunch說起。
相傳,在程式猿們還沒有使用roslaunch之前,需要手動rosrun逐個啟動node,遇到大工程的時候,其繁雜程度不可想象,一度民不聊生。直到神實在看不下去了,於是送給程式猿們一份禮物,喚名roslaunch。roslaunch法力無邊,只需程式猿們編寫一個launch檔案,啟動大量節點彈指之間。從此一傳十,十傳百,程式猿們過上了幸福快樂的生活……
(故事純屬虛構,看著玩就行了)
這故事雖假,但roslaunch大法卻不虛。roslaunch是一個用於自動啟動ros節點的命令列工具,從命令的字面上看還跟rosrun有些相似:
roslaunch PACKAGE_NAME LAUNCH_FILE_NAME
- 1
只不過roslaunch的操作物件並非節點,而是launch檔案。launch檔案是描述一組節點及其話題重對映和引數的XML檔案。根據規範,這些檔案的字尾都是.launch
一個最簡單的launch檔案可以像下面這樣
<launch> <node name="demo" pkg="demo_package" type="demo_pub" output="screen"/> <node name="demo" pkg="demo_package" type="demo_sub" output="screen"/> </launch>
1.launch標籤小結
1.0 <launch>
launch標籤就像一個有容乃大的括號,規定了一片區域,所有的launch檔案都由<launch>
開頭,由</launch>
結尾,所有的描述標籤都要寫在<launch></launch>
之間
<launch>
……
……
……
</launch>
1.1 <node>
node標籤可以說是launch檔案裡最常見的標籤了,每個node標籤裡包括了ROS圖中節點的名稱屬性name
、該節點所在的包名pkg
以及節點的型別type
(其實就是可執行檔案的名稱,如果是用Python編寫的就填寫xxx.py
output
這個東西,這個屬性在除錯階段很有用,output=“screen”
表示了將終端輸出轉儲在當前的控制檯上,而不是在日誌檔案中。
屬性 | 屬性作用 |
---|---|
name="NODE_NAME" |
為節點指派名稱,這將會覆蓋掉ros::init() 定義的node_name |
pkg="PACKAGE_NAME" |
節點所在的包名 |
type="FILE_NAME" |
執行檔案的名稱如果是用Python編寫的就填寫xxx.py ,如果是cpp就寫編譯生成的可執行檔名 |
output="screen" |
終端輸出轉儲在當前的控制檯上,而不是在日誌檔案中 |
respawn="true" |
當roslaunch啟動完所有該啟動的節點之後,會監測每一個節點,保證它們正常的執行狀態。對於任意節點,當它終止時,roslaunch 會將該節點重啟 |
required="true" |
當被此屬性標記的節點終止時,roslaunch會將其他的節點一併終止。注意此屬性不可以與respawn="true" 一起描述同一個節點 |
launch-prefix = "command-prefix" |
我的理解是,相當於在執行啟動命令時加上一段命令字首 |
ns = "NAME_SPACE" |
這個屬性可以讓你在自定義的名稱空間裡執行節點 |
1.2<include>
該標籤可以匯入另一個roslaunch XML檔案到當前檔案。
屬性 | 屬性作用 |
---|---|
file ="$(find pkg-name)/path/filename.xml" |
指明我們想要包含進來的檔案 |
ns="NAME_SPACE" |
相對NAME_SPACE 名稱空間匯入檔案 |
使用起來就像下面這樣
<include file="$(find demo)/launch/demo.launch" ns="demo_namespace"/>
- 1
1.3<remap>
remap標籤顧名思義重對映,ROS支援topic的重對映,remap標籤裡包含一個original-name和一個new-name,及原名稱和新名稱。
比如現在你拿到一個節點,這個節點訂閱了"/chatter"
topic,然而你自己寫的節點只能釋出到"/demo/chatter"
topic,由於這兩個topic的訊息型別是一致的,你想讓這兩個節點進行通訊,那麼可以在launch檔案中這樣寫:
<remap from="chatter" to="demo/chatter"/>
- 1
這樣就可以直接把/chatter
topic重對映到/demo/chatter
,這樣子不用修改任何程式碼,就可以讓兩個節點進行通訊。
如果這個 remap標籤寫在與 node 元素的同一級,而且在launch 元素內的最頂層。 那麼這個重對映將會作用於launch檔案中所有的節點。
1.4<param>
param標籤的作用相當於命令列中的rosparam set
比如現在在引數伺服器中新增一個名為demo_param,值為666的引數
<param name="demo_param" type="int" value="666"/>
- 1
1.5<rosparam>
rosparam標籤允許從YAML檔案中一次性匯入大量引數。
使用起來就像這樣:
<rosparam command="load" file="$(find pkg-name)/path/name.yaml"/>
- 1
1.6<arg>
arg標籤用來在launch檔案中定義引數,arg和param在ROS裡有根本性的區別,就像區域性變數和全域性變數的區別一樣。arg不儲存在引數伺服器中,不能提供給節點使用,只能在launch檔案中使用。param則是儲存在引數伺服器中,可以被節點使用。
<arg name="demo"/>
- 1
像上面這樣,就簡單地聲明瞭一個引數,名叫demo,但是宣告不等於定義,我們需要給他賦值,在賦值之後引數才能夠發揮作用。
<arg name="demo" value="666"/>
<arg name="demo" default="666"/>
- 1
- 2
以上是兩種簡單的賦值方法,兩者的區別是使用後者賦值的引數可以在命令列中像下面這樣被修改,前者則不行。
roslaunch demo demo.launch demo:=6666
- 1
arg還有更加高階,也更加靈活的用法:$(arg arg_name)
當$(arg arg_name)
出現在launch檔案任意位置時,將會自動替代為所給引數的值。
1.7<group>
group標籤可以將若干個節點同時劃分進某個工作空間。
<group ns="demo_1">
<node name="demo_1" pkg="demo_1" type="demo_pub_1" output="screen"/>
<node name="demo_1" pkg="demo_1" type="demo_sub_1" output="screen"/>
</group>
<group ns="demo_2">
<node name="demo_2" pkg="demo_2" type="demo_pub_2" output="screen"/>
<node name="demo_2" pkg="demo_2" type="demo_sub_2" output="screen"/>
</group>
group標籤還可以做到對node的批量管理。比如我可以同時終止在同一個group中的節點。
<group if="1-or-0">
……
……
……
</group>
<group unless="1-or-0">
……
……
……
</group>
- 第一種情況,當if屬性的值為0的時候將會忽略掉
<group></group>
之間的標籤。
第二種恰好相反,當if屬性的值為1的時候將會忽略掉<group></group>
之間的標籤。
但是我們通常不會直接用1或0來定義if標籤。因為這樣不夠靈活。
通常會搭配$(arg arg_name)
來使用。demo.launch
檔案
<launch>
<include file="include.launch">
<arg name="demo_arg" value="1"/>
</include>
</launch>
include.launch
檔案
<launch>
<arg name="demo_arg"/>
<group if="$(demo_arg)">
<node name="demo" pkg="demo" type="demo_pub" output="screen"/>
<node name="demo" pkg="demo" type="demo_sub" output="screen"/>
</group>
</launch>
--------------------- 本文來自 沐棋 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/weixin_41995979/article/details/81784987?utm_source=copy