2020年11月2日 星期一

[ROS] roslaunch: <node> 標籤的用法

可以使用 <node> 標籤來指定你想要啟動的節點,這是最常使用的 roslaunch 標籤。在使用 <node> 標籤時,有一點必須要特別注意,就是 roslaunch 不保證節點的啟動順序,也就是節點不一定會依照在 Launch 文件中編排的順序來啟動。這是可以理解的,因為節點的初始化需要一些時間,而每個節點初始化的時間不一樣,roslaunch 從程式外部無法得知節點初始化的狀況。所以,必須自行確保撰寫的 Launch 文件夠嚴謹,不管節點以任何的順序執行都要能夠正常啟動。

 

 

標籤說明

 

  • <node>

 

此標籤用來啟動指定的節點,有下列屬性可以使用:

 

pkg="mypackage" : 指定節點所在的套件名稱。

 

type="nodetype" : 節點型態,必須設定為用來啟動節點的可執行檔名稱。

 

name="nodename" : 節點名稱。注意:此名稱中不能包含命名空間,可以使用 ns 屬性來指定命名空間。

 

args="arg1 arg2 arg3" (optional) : 傳遞參數給節點。

 

machine="machine-name" (optional, see <machine>) : 設備名稱,在指定的設備上啟動節點。

 

respawn="true" (optional, default: False) : 若此節點被關閉,將自動重啟此節點。

 

respawn_delay="30" (optional, default 0) : respawn 屬性設定為 true,則在檢測到節點失效後,會等待 respawn_delay 所設定的秒數過後,再嘗試重啟節點。

 

required="true" (optional) : 若此節點被關閉,就終止整個 roslaunch 的執行。

 

ns="foo" (optional) : 在此命名空間下啟動節點。

 

clear_params="true|false" (optional) : 在啟動之前,刪除先前設置在此節點私有命名空間中的所有參數,也就是以此節點名稱為命名空間下的所有參數。預設值為 false

 

output="log|screen" (optional, default: log) : 若設定為 'screen',則從節點輸出到 stdout/stderr 的訊息,將會被顯示在螢幕上。若設定為 'log',則輸出到 stdout/stderr 的訊息,將會被寫入到 $ROS_HOME/log 目錄下的日誌檔案中,而且 stderr 訊息仍會顯示在螢幕上。預設值為 log

 

cwd="ROS_HOME|node" (optional) : 設定節點的工作目錄 (working directory)。若為 'node',則設定節點的可執行檔目錄為節點的工作目錄。預設為 ROS_HOME 環境變數所設定的目錄。

 

launch-prefix="prefix arguments" (optional) : 設定指令和參數,用以添加到節點的啟動參數中。這是一個強大的功能,讓你可以使用 gdb, valgrind, xterm, nice 或其他方便的工具。(See Roslaunch Nodes in Valgrind or GDB for examples.)

 

<node> 標籤中,還可以內嵌下列標籤:

 

<env> : 設置一個環境變數供此節點使用,此環境變數僅在此節點內有作用。

 

<remap> : 為此節點設置一個重映射參數。

 

<rosparam> : 在節點的私有命名空間中,透過 rosparam 指令來設置 Parameter 參數。

 

<param> : 在節點的私有命名空間中,設置一個 Parameter 參數。

 

 

實例說明

 

範例一:

 

此範例簡單地啟動 turtlesim 示例,並且設定 turtlesim_node respawn="true"。因此若 turtlesim_node 的節點被關閉,就會自動重啟該節點。可以手動把顯示小海龜的視窗關閉,就會看到視窗又自行重新開啟。

 

-- node1.launch

<launch>

  <node pkg="turtlesim" type="turtlesim_node" name="turtlesim" respawn="true" />

  <node pkg="turtlesim" type="turtle_teleop_key" name="teleop_turtle" />

</launch>

 

範例二:

 

此範例在 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。另外,在 script 目錄則是新增一個簡短的 Python 程式,用以讀取 Parameter Server 中的參數。

 

-- node2.launch

<launch>

  <node pkg="mypackage" type="checkparam.py" name="node1" output="screen">

    <param name="myparam" value="param in node1" />

  </node>

  <node pkg="mypackage" type="checkparam.py" name="node2" output="screen">

    <param name="myparam" value="param in node2" />

  </node>

</launch>

 

-- checkparam.py

#!/usr/bin/env python

import os, rospy

   

rospy.init_node('checkparam')

print rospy.get_param('~myparam')

 

rospy.spin()

 

此範例設置兩個 <node> 標籤來執行 checkparam.py,並分別在兩個 <node> 標籤下,透過 <param> 標籤來設置 Parameter 參數。設置的 Parameter 參數會位於該節點的私有命名空間中,因此兩個參數分別為:

 

/node1/myparam: param in node1

/node2/myparam: param in node2

 

執行 roslaunch mypackage node2.launch 之後,可以看見螢幕顯示:

 

param in node1

param in node2

 

因為在 checkparam.py 中,使用 ~ 來表示讀取私有命名空間中的參數。所以 node1 會讀取 /node1/myparamnode2 會讀取 /node2/myparam

 

 

參考資料

 

  • roslaunch: <node> tag

http://wiki.ros.org/roslaunch/XML/node

 

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *