roslaunch
是 ROS(Robot Operating System)中用于启动ROS节点和相关配置文件的工具。它使用XML格式的文件来描述如何启动一个或多个ROS节点以及它们的参数和命名空间。以下是roslaunch
文件的基本结构和常见元素:
1. launch
文件结构
一个roslaunch
文件通常以以下结构开始:
<launch>
<!-- 启动命令和参数配置 -->
<!-- 节点配置 -->
<!-- 参数配置 -->
</launch>
2. <node>
元素
<node>
元素用于启动ROS节点。以下是一个<node>
元素的基本结构:
<node name="节点名称" pkg="节点包名" type="节点类型" args="节点参数" output="输出选项">
<!-- 参数配置 -->
</node>
name
: 节点的名称,必须唯一。pkg
: ROS软件包的名称,该软件包包含要启动的节点。type
: 要启动的节点类型,通常是可执行文件的名称。args
: 传递给节点的参数。可以是一个字符串,也可以包含参数列表。output
: 控制节点的输出方式,可以是log
、screen
或logscreen
中的一个。
3. <param>
元素
<param>
元素用于设置ROS参数。以下是一个<param>
元素的基本结构:
<param name="参数名称" value="参数值" />
name
: 参数的名称。value
: 参数的值。
4. 命名空间
你可以使用 group
元素来创建命名空间,以便在不同的节点中具有不同的参数命名空间。例如:
<group ns="my_namespace">
<!-- 包含在 my_namespace 命名空间中的节点和参数 -->
</group>
5. if
和 unless
条件
roslaunch
支持条件语句,可以在特定条件下启动节点或设置参数。例如,你可以使用 <if>
和 <unless>
来检查是否存在某个ROS参数,并根据结果来执行不同的操作。
<param name="my_param" value="true" />
<node if="$(arg my_param)" name="node_if_true" pkg="my_package" type="my_node" />
<node unless="$(arg my_param)" name="node_unless_false" pkg="my_package" type="my_node" />
在上述示例中,如果参数 my_param
的值为 true
,则启动 node_if_true
节点,否则启动 node_unless_false
节点。
6. 引用其他 launch
文件
你可以使用 include
元素来引用其他的 roslaunch
文件。这对于将启动配置分解为可重用的组件非常有用。例如:
<include file="$(find my_package)/launch/my_launch_file.launch" />
上述代码将包含另一个 my_launch_file.launch
文件的内容,从而使其成为当前 launch
文件的一部分。
7. 参数传递
你可以使用 arg
元素来传递参数值给 launch
文件。这些参数可以在节点和参数的定义中使用。例如:
<arg name="my_arg" default="default_value" />
<node name="my_node" pkg="my_package" type="my_node" args="$(arg my_arg)" />
<param name="my_param" value="$(arg my_arg)" />
上述示例中,arg
元素定义了一个名为 my_arg
的参数,并设置了默认值。然后,这个参数的值被用于节点的参数和参数的值。
下面是一个测试说明的例子
- 源内容
<launch>
<node pkg="wheeltec_tracker_pkg" name="face_detector" type="face_detector.py" output="screen">
<remap from="input_rgb_image" to="/usb_cam/image_raw" />
<rosparam>
haar_scaleFactor: 1.2
haar_minNeighbors: 2
haar_minSize: 40
haar_maxSize: 60
</rosparam>
<param name="cascade_1" value="$(find wheeltec_tracker_pkg)/data/haarcascade_frontalface_alt.xml" />
<param name="cascade_2" value="$(find wheeltec_tracker_pkg)/data/haarcascade_profileface.xml" />
</node>
</launch>
- 添加注释的内容
<launch>
<!-- 启动一个ROS节点 -->
<node
pkg="wheeltec_tracker_pkg" <!-- 指定ROS软件包名称 -->
name="face_detector" <!-- 给节点起一个唯一的名称 -->
type="face_detector.py" <!-- 指定要启动的节点的可执行文件 -->
output="screen"> <!-- 输出选项,将节点的输出显示在终端上 -->
<!-- 重新映射节点的话题名称 -->
<remap from="input_rgb_image" to="/usb_cam/image_raw" />
<!-- 设置ROS参数,这些参数将传递给节点 -->
<rosparam>
<!-- 设置名为 haar_scaleFactor 的参数 -->
haar_scaleFactor: 1.2
<!-- 设置名为 haar_minNeighbors 的参数 -->
haar_minNeighbors: 2
<!-- 设置名为 haar_minSize 的参数 -->
haar_minSize: 40
<!-- 设置名为 haar_maxSize 的参数 -->
haar_maxSize: 60
</rosparam>
<!-- 设置节点的参数,这些参数将传递给节点 -->
<param name="cascade_1" value="$(find wheeltec_tracker_pkg)/data/haarcascade_frontalface_alt.xml" />
<param name="cascade_2" value="$(find wheeltec_tracker_pkg)/data/haarcascade_profileface.xml" />
</node>
</launch>
上述注释解释了roslaunch
文件中的各个字段的作用:
-
<launch>
:roslaunch
文件的根元素,表示一个启动文件。 -
<node>
: 启动一个ROS节点的元素,指定节点的名称、包名、可执行文件等。 -
pkg
: 指定ROS软件包的名称,wheeltec_tracker_pkg
是要启动节点的软件包名称。 -
name
: 为节点指定一个唯一的名称,这里是face_detector
。 -
type
: 指定要启动的节点的可执行文件,这里是face_detector.py
。 -
output
: 控制节点的输出方式,这里设置为screen
,表示将节点的输出显示在终端上。 -
<remap>
: 重新映射节点的话题名称,将input_rgb_image
话题重新映射到/usb_cam/image_raw
话题。 -
<rosparam>
: 设置ROS参数,这些参数将传递给节点。在这里设置了一些名为haar_scaleFactor
、haar_minNeighbors
、haar_minSize
和haar_maxSize
的参数,它们的值被指定为数字。 -
<param>
: 设置节点的参数,这些参数将传递给节点。在这里设置了名为cascade_1
和cascade_2
的参数,它们的值是节点包中的XML文件的路径。