ROS中launch文件的写法及节点调用
相机驱动中的usb_cam包的launch文件
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
ns="usb_cam"/>
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
相机标定中usb_cam包的launch文件
<launch>
<node name="usb_cam" pkg="usb_cam" type="usb_cam_node" output="screen" >
<node name="image_proc" pkg="image_proc" type="image_proc" ns="usb_cam"/>
<param name="video_device" value="/dev/video0" />
<param name="image_width" value="640" />
<param name="image_height" value="480" />
<param name="pixel_format" value="yuyv" />
<param name="camera_frame_id" value="usb_cam" />
<param name="io_method" value="mmap"/>
</node>
<node name="image_view" pkg="image_view" type="image_view" respawn="false" output="screen">
<remap from="image" to="/usb_cam/image_raw"/>
<param name="autosize" value="true" />
</node>
</launch>
launch文件
开头和结尾:
launch文件必须以 作为开头和结束
<launch>
</launch>
A.node标签
任何一个launch文件的重点都是:节点(node)元素的集合。启动的每一个节点(node)都要有自己独一无二的名字(name)。如果node(节点)元素有children,就需要显式标签来定义,children比如是:remap 元素或者 param 元素。
例:
<node pkg=" " type="" name="">
解释:
-
output = “screen”
在 node 元素中使用 output 属性: output=”screen”将输出显示在屏幕上 -
respawn=”true”
启动完所有请求启动的节点之后,roslaunch 监测每一个节点,让它们保持正常的运行状态。对于每一个节点,当它终止时,我们可以要求 roslaunch 重新启动它. -
required=”true”
当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。
注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。 -
launch-prefix = “command-prefix”
roslaunch 命令 的一个潜在的缺点:相比我们原来对每个节点在单独的终端使用 rosrun 命令启动的做法,roslaunch 则是让所有的节点共享同一个终端。 那些只需要生产简单的日志消息文件而不需要终端(console)输入的节点是容易管理的,而那些依赖终端输入的节点,比如 turtle_teleop_key 节点,它可能要优先的保留在独立的终端上。
在例子launch文件中,我们给 teleoperation 节点使用了这个属性:launch-prefix=”xterm -e”.因为这个属性,启动这个 node 元素的 rosrun 命令大致相当于:xterm -e rosrun turtlesim turtle_teleop_key.
xterm 命令会开一个新的终端窗口。 -e 参数告诉 xterm :执行其命令行剩余部分(rosrun turtlesim turtle_teleop_key)。 -
ns = “namespace”
在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。
turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。 -
args属性
引数通常用来作为执行各节点或launch 档所需要的输入参数,换句话说,设定区域变数,通常需要使用者输入所需的数值,但也可以事先写好预设的数值。另外一种用法,是用引数作为一个逻辑判断,决定那些节点要执行,哪些不用。 -
呼叫节点
<node name="image_proc" pkg="image_proc" type="image_proc" ns="usb_cam"/>
参数及其应用
参数 | 用途 |
---|---|
pkg | 节点所在的包的名称 |
type | 节点的实际名称 |
respawn/required | 是当该节点由于不明原因停止执行的时候,会自动重新启动。而required比较霸道一点,当该节点停止执行的时候,会让整个launch 档都停止执行、关闭。 |
ns | 名称空间,指明在哪一个工作区间(workspace)的时候执行该节点,当你必须在多个子类别的实体(instance)中执行同一个节点的时候会很用。 |
name | 虽然也是指该节点的名称,不过你可以再另外帮这个节点取名字,那么该节点便会把原名给覆盖掉,以这个名称表示。你可以在执行时,用rqt或者 rosnode list, rosnode info等指令查看到。 |
- 注解<!– –>
B.remap标签(重映射)
在launch文件中重新命名:使用 remap 元素:
<remap from="image" to="/usb_cam/image_raw"/>
如果这个 remap 是 launch 元素的一个child(子类),与 node 元素同一层级, 并在 launch 元素内的最顶层。那么这个 remapping 将会作用于后续所有的节点。
rosrun和roslaunch的不同
使用 roslaunch 命令 和 使用 rosrun 命令单独运行每个节点之间的重要区别
默认情况下,roslaunch 命令 从启动节点开始,标准输出信息会重定向到一个日志文件中,而不会像 rosrun 命令那样,将 log 信息显示在终端(console)上.
日志文件所在路径: ∼/.ros/log/run_id/node_name-number-stdout.log
Q: 如何将标准输出信息显示在终端(console)上?
A: 在 node 元素中使用 output 属性:
output=”screen”
带这个属性启动的节点会将标准输出信息显示在终端的窗口中,而不会保存在日志文件中。这也 解释 了为什么这个带有output=”screen”的节点(node) 的日志文件在上面日志文件列表中丢失的原因。
扩展: node 元素的 output 属性只能影响这个节点自己。除了 output 属性,我们可以使用 roslaunch命令行工具的 –screen 命令行选项强制性的在终端的窗口中显示所有节点的输出信息。
parameter说明
<param name="video_device" value="/dev/video0" />
参数名称 以及参数值。
group标签中的param标签的作用等同于rosparam set命令.
node标签中的param标签设置为该节点的子元素.