從 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 命令: roscdrosparamrosrunroslaunch 。現在讓我們開始吧!

這是為什麼 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 terminallog 以將日誌儲存到 (~/.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 檔案,用於連續自動執行所有命令。