launch文件中的根元素采用
标签定义。
:启动节点。
用法:
<node pkg="package-name" type="executable-name" name="node-name"/>
如:
<node pkg="turtlesim" type="turtlesim_node" name="sim1"/>
其中:
pkg
:节点功能包名称
type
:节点的可执行文件名称
name
:节点运行时的名称
此外还有output
、respawn
、required
、ns
、args
。
output
:控制节点打印信息到终端
respawn
:重启节点
required
:要求某个节点启动
ns
:namespace,避免命名冲突
args
:给节点输入参数
/
:设置ROS系统运行中的参数,存储在参数服务器中。
用法:
<param name="output_frame" value="odom"/>
如:
加载参数文件中的多个参数:
<rosparam file="params.yaml" command="load" ns= "params" />
其中:
name
:参数名
value
:参数值
launch文件内部的局部变量,仅限于launch文件使用。
用法:
<arg name="arg-name" default="arg-value" />
其中:
name
:参数名
value
:参数值
default
:默认参数值
调用:
<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="type " args="$(arg arg-name)" />
:重映射 ROS 计算图资源的命名。
用法:
<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
其中:
from
:原命名
to
:映射之后的命名
实例:
可以看后面的实例4。
包含其他launch文件,类似C语言中的头文件包含。
用法:
<include file="$(dirname)/other.launch"/>
其中:
file
:包含的其他launch文件路径
实例:
可以看后面的实例4。
更多标签可参见: http://wiki.ros.org/roslaunch/XML
之前学习过话题发布与订阅,现在使用 launch 文件启动两个节点来实现,前提是需要按照 话题消息的定义与使用 运行成功,才能用 launch 文件来调用它。
首先在/catkin_ws/src
目录下新创建一个叫做learning_launch
的功能包,因为 launch 文件主要是调用其他功能包,所以指令后面不需要跟依赖。
catkin_create_pkg learning_launch
再在learning_launch
中创建一个文件夹命名为launch
:
再在launch
文件夹下新建一个名为simple.launch
的文件:
把以下内容复制进去:
<launch>
<node pkg="learning_topic" type="person_subscriber" name="talker" output="screen" />
<node pkg="learning_topic" type="person_publisher" name="listener" output="screen" />
launch>
然后编译工作空间:
cd ~/catkin_ws
catkin_make
启动launch文件:
source ~/catkin_ws/devel/setup.bash
roslaunch learning_launch simple.launch
之前学习过 参数的使用与编程方法,现在使用 launch 文件来实现。
与实例1一样,新建turtlesim_parameter_config.launch
文件。
把以下内容复制进去:
<launch>
<param name="/turtle_number" value="2"/>
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<param name="turtle_name1" value="Tom"/>
<param name="turtle_name2" value="Jerry"/>
<rosparam file="$(find learning_launch)/config/param.yaml" command="load"/>
node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>
launch>
代码中写到,参数文件在learning_launch/config/param.yaml
路径下,所以我们要在这个路径下新建一个config/param.yaml
文件,如下图:
内容为:
A: 123
B: "hello"
group:
C: 456
D: "hello"
PS:这里的 A、B、C、D 的冒号后面要有一个空格,C、D前面要有两个空格。不然会报错
然后运行launch文件:
roslaunch learning_launch turtlesim_parameter_config.launch
这个时候可以通过键盘控制海龟移动,但这并不是这个实例的重点。
通过rosparam get
命令,我们可以看到刚刚launch中指定的turtle_number
被添加进了参数列表并赋值为2
。
同样,也可以得到turtle_name1
的值为Tom
,但是这里不太一样,因为在launch文件中,我们把turtle_name1
参数放在了以turtlesim_node
为name
的node
中,目的是为了防止与节点外的同样的参数名(如果有)起冲突,起到了命名空间的作用。
同样,在launch文件中我们通过rosparam
标签引入了param.yaml
文件,同样也可以得到A
、B
、C
、D
四个参数的值。
之前学习过 tf 坐标系广播与监听,现在使用 launch 文件来实现,而不再需要启动5个终端分别通过五次rosrun命令来实现了,前提是需要按照 tf 坐标系广播与监听的编程实现 运行成功,才能用 launch 文件来调用它。
与实例1一样,新建start_tf_demo_c++.launch
文件。
把以下内容复制进去:
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf_broadcaster" />
<node pkg="learning_tf" type="turtle_tf_listener" name="listener" />
launch>
这里把上次用到的命令行指令拷贝过来,方便XML语法与命令行指令对比学习:
roscore
rosrun turtlesim turtlesim_node
rosrun learning_tf turtle_tf_broadcaster __name:=turtle1_tf_broadcaster /turtle1
rosrun learning_tf turtle_tf_broadcaster __name:=turtle2_tf_broadcaster /turtle2
rosrun learning_tf turtle_tf_listener
rosrun turtlesim turtle_teleop_key
然后运行launch文件:
roslaunch learning_launch start_tf_demo_c++.launch
如果出现海龟乱划线或者根本没有反应的情况,请查看是不是之前打开过海龟节点,如果是,关掉后重新运行launch文件。
这个实例是为了介绍remap
标签和include
标签。前提是已经完成了实例1。
与实例1一样,新建turtlesim_remap.launch
文件。
把以下内容复制进去:
<launch>
<include file="$(find learning_launch)/launch/simple.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<remap from="/turtle1/cmd_vel" to="/cmd_vel"/>
node>
launch>
代码中通过include
标签包含了simple.launch
文件,也就是实例1中的那个文件。
然后通过remap
标签,把turtlesim_node
节点下的/turtle1/cmd_vel
重映射为/cmd_vel
。
运行launch文件看看效果:
roslaunch learning_launch turtlesim_remap.launch
可以看到,命令行中一直打印着实例1的效果。
然后输入rostopic list
查看一下话题列表,可以看到之前的/turtle1/cmd_vel
消失了,多了一个/cmd_vel
。
然后我们试一下给重映射后的话题发布一个指令,看看重映射是否成功,这里我们发布的是让海龟运动的指令:
rostopic pub /cmd_vel geometry_msgs/Twist "linear:
x: 1.0
y: 0.0
z: 0.0
angular:
x: 0.0
y: 0.0
z: 0.0"
发现海龟正常运动,重映射成功。
现在/turtle1/cmd_vel
那个话题名已经不存在了,取而代之的是/cmd_vel
话题,所以这就是重映射的含义,它会把原来存在的资源重新命名。