<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>
其中param.yaml文件中的内容为:
A: 123
B: "hello"
group:
C: 456
D: "hello"
1:启动节点
<node pkg="package-name" type="executable-name" name="node-name" output = “screen”/>
• pkg:节点所在的功能包名称
• type:节点的可执行文件名称
• name:节点运行时的名称
•output = “screen”:标准输出信息显示在终端(console)上
• respawn=”true” :要求重生(request respawning)
开启所有nodes后,roslaunch会监视每个node,记录那些仍然活动的nodes。对于每个node,当其终止后,我们可以要求roslaunch重启该node,通过使用respawn属性。
•required=”true”
当一个必需的节点终止时,roslaunch会做出响应,终止其他所有的节点并退出它自己。
注意: 由于 required 属性和 respawn 属性的含义,所以如果你给单个的一个节点同时设置了这2个属性,roslaunch 命令会抱怨。所以不要这样设置。
•ns = “namespace”
在例子launch文件中,使用这个属性创建了两个无关的 turtlesim 模拟器。
turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。
2:设置ROS系统运行中的参数,存储在参数服务器中。
<param name="output_frame" value="odom"/>
• name:参数名
• value:参数值
3:加载参数文件中的多个参数:
<rosparam file="params.yaml" command="load" ns=“params"/>
4:launch文件内部的局部变量,仅限于launch文件使用
情况一:
<arg name="arg-name" default="arg-value" />//arg_value可以被改变,如不赋值取默认值
<arg name="foo" value="bar" /> //声明为常量,不能改变
• name:参数名
• value:参数值
调用:
<param name="foo" value="$(arg arg-name)" />
<node name="node" pkg="package" type="type " args="$(arg arg-name)" />
情况二:
<arg name="arg-name" />
在命令行中你可以这样做:给 roslaunch 提供一个 value :
roslaunch package-name launch-file-name arg-name:=arg-value
arg标签用来在launch文件中定义参数,arg和param在ROS里有根本性的区别,就像局部变量和全局变量的区别一样。arg不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。
5:重映射ROS计算图资源的命名。
<remap from="/turtlebot/cmd_vel" to="/cmd_vel"/>
• from:原命名
• to:映射之后的命名
6:包含其他launch文件,类似C语言中的头文件包含。
<include file="$(dirname)/other.launch" />
•file:包含的其他launch文件路径
执行后结果:
可以看到在turtlesim中的param加了turtlesim_node前缀
添加Python产生的节点,直接添加可执行的脚本
7:group
group 标签可以方便的将一组配置应用到组内的所有节点,它也具有命名空间 ns 特点,可以将不同的节点放入不同的 namespace。
<group ns="namespace">
<node pkg="pkg_name1" .../>
<node pkg="pkg_name2" .../>
...
</group>
配合 if 和 unless 使用:
- if=value:value 为 true 则包含内部信息
- unless=value:value 为 false 则包含内部信息
<group if="$(arg foo1)">
<node pkg="pkg_name1" .../>
</group>
<group unless="$(arg foo2)">
<node pkg="pkg_name2" .../>
</group>
- 当 foo1 == true 时包含其标签内部
- 当 foo2 == false 时包含其标签内部
<group ns="turtlesim1"> //两个节点分组并以’命名空间(namespace)’标签来区分
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
//pkg 和 type 它们分别是:程序包名字和可执行文件的名字;ros::init()函数提供的 name 信息将会全面的覆盖命名信息(launch文件中node标签里面的name 属性)
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
ns = “namespace” :turtlesim 话题名字(turtle1/cmd_vel、turtle1/color_sensor 和 turtle1/pose )被从全局命名空间移动 到 /sim1 和 /sim2 的单独命名空间里。