1. 程式人生 > >rosrun和roslaunch命令比較

rosrun和roslaunch命令比較

在ros中執行節點的命令有2個,rosrun和roslaunch

官網解釋如下:

rosrun allows you to run an executable in an arbitrary package without having to cd (or roscd) there first.

 roslaunch is a tool for easily launching multiple ROS nodes locally and remotely via SSH, as well as setting parameters on the Parameter Server. It includes options to automatically respawn processes that have already died. roslaunch takes in one or more XML configuration files (with the .launch extension) that specify the parameters to set and nodes to launch, as well as the machines that they should be run on.

roslaunch可以用來啟動定義在launch檔案中的多個節點,通常的命名方案是以.launch作為啟動檔案的字尾,啟動檔案是xml檔案,一般把啟動檔案儲存在取名為launch的目錄中,用法

$ roslaunch [package] [filename.launch]


可以看出:rosrun是執行一個單獨節點的命令,如果要執行多個節點,則需要使用多次rosrun命令,roslaunch採用xml的格式對需要執行的節點進行描述,可以同時執行多個節點,例如

<launch>
  <node name="listener" pkg="rospy_tutorials" type="listener.py" output="screen"/>
  <node name="publish_on_shutdown" pkg="rospy_tutorials" type="publish_on_shutdown.py" output="screen"/>
</launch>

可以同時執行listener和publish_on_shutdown兩個節點

launch檔案解析

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

2.在節點標籤末尾的斜槓”/“是必須的,也可以顯示的給出結束標誌,name屬性給節點指派了名稱,它將覆蓋任何通過呼叫ros::int來賦予節點的名稱。

<node pkg=”package-name” type=”executable-name” name=”node-name”/>
<node pkg=”…”type=”…” name=”…”></node>#顯式地給出結束標籤

3.若該節點有子節點,例如remap或者param元素,那麼該顯式結束標籤是必不可少的,

4.在預設狀態下,從啟動檔案啟動節點的標準輸出被定向到日誌檔案中,若想輸出到控制檯,只需在節點元素中配置:output="screen",配置了該屬性的節點將標準輸出顯示在螢幕上而不是記錄到日誌文件,

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

6.ns="namespace",

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

<remap from=”turtle1/pose” to= ”tim”/>

8. 包含其他檔案:

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

<include file="$(find safety_control)/launch/safety_controller.launch"/>

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

 <arg name="odom_topic" default="odom" />

 

<launch>#這裡以launch標籤開頭以表明這是一個launch檔案

  <group ns="turtlesim1"> #這裡建立了一個名為turtlesim1的節點分組並以名稱空間(namespace)標籤來區分,
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>#這兩個組裡使用相同的turtlesim節點並命名為'sim',這樣可以讓我們同時啟動兩個turtlesim模擬器而不會產生命名衝突
  </group>

  <group ns="turtlesim2">
    <node pkg="turtlesim" name="sim" type="turtlesim_node"/>
  </group>

  <node pkg="turtlesim" name="mimic" type="mimic">#在這裡啟動模仿節點,並將所有話題的輸入和輸出分別重新命名為turtlesim1和trutlesim2,這樣就會使turtlesim2模仿turtlesim1
    <remap from="input" to="turtlesim1/turtle1"/>
    <remap from="output" to="turtlesim2/turtle1"/>
  </node>

</launch>