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