1.launch文件的使用方式
roslaunch package-name launch-file-name
注意:
1.在開始任何一個節點前,roslaunch 將會確定 roscore節點是否已經在運行,如果沒有,自動啓動它。不要與 rosrun命令 混淆,rosrun 只能啓動一個節點。roslaunch 命令可以同時啓動多個節點。
2.你也可以在使用 roslaunch 啓動launch文件的時候沒有package-name這部分。要想做到這一點,launch-file-name 文件需要寫成絕對路徑的形式。只要可以讓 roslaunch 命令找到唯一的一個 launch 文件,你就可以不提供 package-name 部分。舉例:
roslaunch ~/catkin_ws/src/beginner_turtorls/launch/xxx.launch
2.與launch相關的知識點
2.1 launch
其他的所有元素標籤都要寫在 <launch>...</launch>
便籤之間。
<launch>
...
</launch>
2.2 node
2.2.1 node寫法舉例:
<node pkg="package-name" type="executable-name name="node-name" />
注意:一定要在node的結尾加上反斜槓/
pkg和type它們與rosrun的兩個命令行參數一樣,它們分別是:程序包名字和可執行文件的名字name屬性指定了一個節點的名字。這個節點程序會調用ros::init()函數內有一個這個節點的name參數,導致這個節點的name被改寫,所以這個name屬性容易被覆蓋。
2.2.2 將標準信息顯示在屏幕上
在 node 元素中使用 output 屬性:
output="screen"
或者
node元素的output屬性只能影響這個節點自己。除了output屬性,我們可以使用roslaunch命令行工具的–screen 令行選項強制性的在終端的窗口中顯示所有節點的輸出信息。
roslaunch --screen package-name launch-file-name
2.2.3 請求重生
啓動完所有請求啓動的節點之後,roslaunch 監測每一個節點,讓它們保持正常的運行狀態。對於每一個節點(node),當它終止( terminates)時,我們可以要求 roslaunch 重新啓動它,這就是 respawn 屬性做的事情:
respawn="true"
2.2.4必需結點
讓一個節點可以重生的另一種方法是:宣佈這個節點是必需的(require):
required="true"
當一個必需的節點終止時,roslaunch會做出響應,終止其他所有的節點並退出它自己。這種行爲機制是有用的。
2.2.5 讓每一個節點在單獨的終端窗口中啓動它們自己
用 roslaunch 命令 的一個潛在的缺點:相比我們原來對每個節點在單獨的終端使用 rosrun 命令啓動的做法,roslaunch 則是讓所有的節點共享同一個終端。 那些只需要生產簡單的日誌消息文件而不需要終端(console)輸入的節點是容易管理的,而那些依賴終端輸入的節點,比如 turtle_teleop_key 節點,它可能要優先的保留在獨立的終端上。
慶幸的是,roslaunch 提供了一個簡單的屬性去實現這一點,在 node 元素裏使用 launch-prefix 屬性:
launch-prefix="command-prefix"
在例子launch文件中,我們給 teleoperation 節點使用了這個屬性:
launch-prefix="xterm -e"
因爲這個屬性,啓動這個 node 元素的 rosrun 命令大致相當於:
xterm -e rosrun turtlesim turtle_teleop_key
正如我們所知道的,xterm 命令會開一個新的終端窗口。 -e 參數告訴 xterm :執行其命令行剩餘部分(rosrun turtlesim turtle_teleop_key)。
2.2.6 命名空間
在 node 元素中指定 ns 屬性:
ns="namespace"
舉例如下:
<launch>
<node
name="turtlesim_node "
pkg="turtlesim"
type="turtlesim_node "
ns="sim1"
/>
<node
pkg="turtlesim"
type="turtle_teleop_key "
name="teleop_key"
required="true"
launch −prefix="xterm −e"
ns="sim1"
/>
<node
name="turtlesim_node "
pkg="turtlesim"
type="turtlesim_node "
ns="sim2"
/>
<node
pkg="a gitr "
type="pubvel"
name="velocity_publisher "
ns="sim2"
/>
</launch>
在這裏例子中,turtlesim 話題名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose)被從全局命名空間移動到/sim1和/sim2的單獨命名空間裏。
2.2.7 重映射名字
在啓動一個節點的時候,有兩種方法創建重映射:
在終端命令行中啓動一個節點時,要重新給這個節點命名:給出一個節點原來的名字和新的名字,中間用:=分開。
original-name:=new-name
例如,在運行turtlesim實例時,我們現在想把發佈姿態數據的話題/turtle1/pose名稱改爲:/tim,那麼命令就是這樣的:
rosrun turtlesim turtlesim_node turtle1/pose:=tim
在launch文件中重新命名:使用 remap 元素:
<remap from="original-name" to="new-name" />
如果這個 remap 是 launch 元素的一個child(子類),與 node 元素同一層級, 並在 launch 元素內的最頂層。那麼這個 remapping 將會作用於後續所有的節點。
這個 remap 元素也可以作爲 node 元素的一個child(子類)出現。下面這個就是使用模板:
<node node-attributes >
<remap from="original-name" to="new-name" />
. . .
</node>
例如:上面命令行命令如果在launch文件中,就是下面這個樣子的:
<node pkg="turtlesim" type="turtlesim_node"
name="turtlesim" >
<remap from="turtle1/pose" to="tim" />
</node>
3 include
3.1 file 屬性
包含(including)其他文件:
<include file="path-to-launch-file" />
這個 file 屬性期望我們添加想要包含的文件的完整路徑。但是大多數時候,include 元素使用一個 find 命令來搜索一個程序包,代替一個明確的完整路徑:
<include file="$(find package-name)/launch-file-name"
注意:roslaunch 命令 將會在程序包(package)的子目錄裏搜索launch文件。 include 元素必須要指定文件的特定路徑,你可以使用 find 來找到這個程序包,但是卻不能在這個程序包目錄裏面自動的找到某個子目錄裏有launch文件。
舉例:
這樣做是正確的:
<include file = "find learning_tutrols"/launch/start_demo.launch" / >
這樣做是錯誤的:
<include file = "find learning_tutrols"/start_demo.launch" />
3.2 ns命名空間
include 元素也支持 ns 屬性,可以讓這個文件裏的內容推送到一個命名空間裏面:
<include file=". . . " ns="namespace" />
一般我們都會給 include 元素設置一個 ns 屬性。
3.3 啓動參數(Launch arguments)
爲了幫助launch文件配置,roslaunch 支持 launch arguments(啓動參數),也叫做 arguments 或者 args。它的功能有點像一個可執行程序的局部變量。它的優點是,你可以通過編寫launch文件來避免編寫重複代碼。爲少數的信息使用arguements,可以改變程序的運行。
給參數賦值的幾種操作:
-
在命令行中你可以這樣做:給 roslaunch 提供一個 value :
roslaunch package-name launch-file-name arg-name:=arg-value -
在launch文件中,你可以提供一個 value(賦值) 作爲 arg 聲明的一部分,使用下面的兩種語法之一就可以:
< arg name=“arg-name” default=“arg-value” />
< arg name=“arg-name” value=“arg-value” />
4.創建組(group)
最後一個要介紹的launch文件特性就是,再來說說:group 元素,它提供了一個方便的方法來在一個大型的launch文件中組織節點。group元素可以達到兩個目的:
1 . 組(group)可以把幾個節點推送到同一個命名空間中。
<group ns="namespace" />
. . .
</group>
2 . 組(groups)裏面的每一個節點在啓動的時候都會給定默認的命名空間。
如果一個已經被分組的節點有自己的 ns 屬性,那麼結果:被啓動的節點的命名空間會出現嵌套的關係: /group-namespace/ns-namespace/node-name 。
3 . 組(groups)可以通過 判別條件 來啓用或禁用節點(nodes):
<group if="0-or-1" />
. . .
</group>
如果 if 屬性的值是 1 , 標籤內封閉的元素(elements)會被包含。如果 if 屬性 值是 0 ,則 標籤內包含的元素會被忽略。 unless 屬性的工作方式類似 if 屬性,但是含義顛倒:
<group unless="1-or-0" />
. . .
</group>
當然了,通常我們不會給這些屬性使用簡單的 0 或 1 這樣的幅值。建議:結合 arg 的 $() 技術,它們會將你的launch文件的配置變得非常的強大。