從 Yaml 檔案啟動 ros 節點和載入引數
roslaunch 是管理 ROS 節點啟動和停止的重要工具。它需要一個或多個“* .launch”檔案作為引數。
對於這個例子,我將參考以下內容(如本問題中所述 ),那麼我們如何連續自動地執行這些命令:
roscd stereo_camera
rosparam load marvin_cameras.yaml
rosrun stereo_camera stereo_camera __name:=bumblebeeLeft
rosrun stereo_camera stereo_camera __name:=bumblebeeCenter
roslaunch openni_launch_marvin kinect_left.launch
roslaunch openni_launch_marvin kinect_center.launch
首先,讓我們來看看。可以看出,需要 4 個 ros 命令: roscd , rosparam , rosrun 和 roslaunch 。現在讓我們開始吧!
這是為什麼 roslaunch 強大的一個例子,事實上,所有這些命令都可以包含在 one and only roslaunch file in ROS
中。那麼我們所要做的就是啟動這個“solution.launch”檔案,以便連續自動呼叫這些命令。
首先,啟動檔案基於 XML 格式,這裡是 ROS 中的基本啟動檔案,我們將其命名為“basic_example.launch”,它包含在名為“roslaunch_example”的 ROS 包中:
<launch>
</launch>
執行此啟動檔案的命令是
$ roslaunch roslaunch_example basic_example.launch
遵循規範:
$ roslaunch package_name launch_file_name.launch
由於我們的啟動檔案不包含任何命令,因此不會執行任何操作,稍後將詳細介紹…
在 Launch 檔案中包含節點:
安裝的任何 ROS 軟體包中的任何 ROS 節點都可以在啟動檔案中呼叫。為此,我們必須指定包含節點的包及其在包中指定的名稱。例如 :
rosrun stereo_camera stereo_camera __name:=bumblebeeLeft
rosrun stereo_camera stereo_camera __name:=bumblebeeCenter
stereo_camera
是包 stereo_camera
的一個節點,指定的引數是它的名稱 __name:=bumblebeeLeft
和 __name:=bumblebeeCenter
。
要新增這些節點,我們必須新增以下行:
<launch>
<node name="$(arg name)" pkg="stereo_camera" type="stereo_camera" output="screen">
<param name="name" value="bumblebeeLeft" />
</node>
<node name="$(arg name)" pkg="stereo_camera" type="stereo_camera" output="screen">
<param name="name" value="bumblebeeCenter" />
</node>
</launch>
執行此啟動檔案,我們將執行兩個節點。
向 ROS 節點新增引數:
可以看出,我們為節點新增了一個引數 name
:
<param name="name" value="bumblebeeCenter" />
事實上,我們可以新增任意數量的引數(如上所述),然後通過呼叫 $(arg parameter_name)
而不是修復它的值來引用它們。
指定輸出:
如果你需要檢視節點 log on the terminal
或 log
以將日誌儲存到 (~/.ros)
中的日誌檔案,則可以將輸出標記設定為 screen
。
在 ROS 啟動檔案中包含其他 ROS 啟動檔案:
如前所述在這裡 ,你可以用標記匯入另一個 roslaunch XML 檔案到當前檔案。它將在文件的當前範圍內匯入,包括和標記。除標記外,將匯入包含檔案中的所有內容:標記僅在頂級檔案中被遵循。
所以,都要執行這些命令
roslaunch openni_launch_marvin kinect_left.launch
roslaunch openni_launch_marvin kinect_center.launch
從啟動檔案中,我們所要做的就是新增以下行:
<include file="$(find openni_launch_marvin)/launch/kinect_left.launch" />
<include file="$(find openni_launch_marvin)/launch/kinect_center.launch" />
roscd 到 ROS 啟動檔案中的包
為了找到比我們想要包含的啟動檔案,我們不需要指定完整路徑。相反,roslaunch 提供了 $(find package_name)
指令,這樣,我們可以參考我們的啟動檔案 relative to the package racine
。
在上面的例子中,我假設檔案“kinect_center.launch”在“openni_launch_marvin”/ launch /“資料夾中。
從 YAML 檔案載入引數:
為了從 ROS 中的 YAML 檔案載入引數,ROS 提供了 rosparam
標記。如維基中所述 :“標籤允許使用 rosparam YAML 檔案從 ROS 引數伺服器載入和轉儲引數。它也可以用於刪除引數。標籤可以放在標籤內,在這種情況下引數被視為私有名稱。“
使用此標記,我們可以通過新增以下行來在啟動檔案中載入我們的 YAML 檔案:
<rosparam command="load" file="$(find marvin_cameras)/config/marvin_cameras.yaml" />
如上所述,我假設 YAML 檔案“marvin_cameras.yaml”位於“marvin_cameras / config /”資料夾中。
組裝所有件
現在我們已經單獨建立了啟動檔案內容,讓我們將它們組裝在一個大的啟動檔案“solution.launch”中。
solution.launch
<launch>
<rosparam command="load" file="$(find marvin_cameras)/config/marvin_cameras.yaml" />
<node name="$(arg name)" pkg="stereo_camera" type="stereo_camera" output="screen">
<param name="name" value="bumblebeeLeft" />
</node>
<node name="$(arg name)" pkg="stereo_camera" type="stereo_camera" output="screen">
<param name="name" value="bumblebeeCenter" />
</node>
<include file="$(find openni_launch_marvin)/launch/kinect_left.launch" />
<include file="$(find openni_launch_marvin)/launch/kinect_center.launch" />
</launch>
現在,我們有一個唯一的 roslaunch 檔案,用於連續自動執行所有命令。