對於ros中launch文件的解讀

參考網址:
1
2
3

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文件的配置變得非常的強大。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章