从 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 文件,用于连续自动执行所有命令。