launch文件是通过xml文件实现多节点的配置和启动,可自启动ros master等
鉴于本人水平有限,如哪位攻城狮网友发现本文存在的问题,烦请留言指正,谢谢!
launch文件语法
<launch>
<node pkg="turtlesim" name="sim1" type="turtlesim_node"/>
<node pkg="turtlesim" name="sim2" type="turtlesim_node"/>
</launch>
launch文件中的根元素采用标签定义
node节点用于启动节点
- pkg:节点所在的功能包名称
- type:节点的可知行文件名称
- name:节点运行时的名称,会取代程序ros::init()中填充的节点名
- output:节点的日志文件输出目录
- respawn:是否在程序挂的时候重启节点
- required:确定某个launch文件中,某个节点是否是必须启动的
- ns:namespace,为每个节点设置命名空间,确保各节点之间不存在冲突
- args:节点的输入参数
或者
设置ROS系统运行中存储在参数服务器中的参数
* name:参数名 * value:参数值加载参数文件中多个参数:
<rosparam file="params.yaml command=“load” ns=“params”/>
将params.yaml的中参数加载进来,且设置此文件内部参数的名称空间是params
launch文件内部的局部变量,仅限于launch文件使用
- name:参数名
- value:参数值
arg调用:
重映射ROS计算图资源的命名
- from:原名称
- to:映射之后的命名
重映射后原名称就不存在了
嵌套其他launch文件,类似C语言中的头文件包含
- file:包含的其他launch文件的路径
示例1
此示例会简单的启动learn_topic包中的person_sub和person_pub两个节点。
<launch>
<node pkg="learn_topic" type="person_sub" name="listener" output="screen"/>
<node pkg="learn_topic" type="person_pub" name="talker" output="screen"/>
</launch>
示例2
此示例设置了turtle_num参数,且设置其值为2
另外启动turtlesim_node节点,并在此节点下新增了turtle_name1和turtle_name2两个参数,并读取config/param.yaml文件,并加载其中的参数
之后启动turtle_teleop_key节点
<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 learn_launch)/config/param.yaml" command="load"/>
</node>
<node pkg="turtlesim" type="turtle_teleop_key" name="turtle_teleop_key" output="screen"/>
</launch>
另外所要读取的pram.yaml文件如下.
A: 123
B: "hello"
group:
C: 456
D: "world"
要注意yaml语法中每个":" 后都要跟一个空格.上面的yaml文件中group就是一个命名空间
需要注意在设置参数时,在包里和包外设置是有区别的。就如上面的turtles_number和turtle_name1两个参数.
主要区别就在于在包里设置的参数,在参数服务器存储时会增加其节点名作为前缀,以和外部的参数进行区分。
rosparam list
/rosdistro
/roslaunch/uris/host_msi__35331
/rosversion
/run_id
/turtle_number
/turtlesim_node/A
/turtlesim_node/B
/turtlesim_node/background_b
/turtlesim_node/background_g
/turtlesim_node/background_r
/turtlesim_node/group/C
/turtlesim_node/group/D
/turtlesim_node/turtle_name1
/turtlesim_node/turtle_name2
rosparam get /turtlesim_node/group/D
world
参数的命名是:节点+命名空间+参数名称等组成参数的名称,主要是为了保证参数不重名。
示例3
此示例就是之前的乌龟跟随示例的launch文件
<launch>
<!-- Turtlesim node-->
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node pkg="learn_tf" type="turtle_broadcaster" args="/turtle1" name="trutel1_tf_broadcaster"/>
<node pkg="learn_tf" type="turtle_broadcaster" args="/turtle2" name="trutel2_tf_broadcaster"/>
<node pkg="learn_tf" type="turtle_listenrer" name="listener"/>
</launch>
示例4
此示例主要是介绍include和remap的使用
<launch>
<include file="$(find learn_launch)/launch/simple.launch" />
<node pkg="turtlesim" type="turtlesim_node" name="turtlesim_node">
<remap from="/turtle1/cmd_vel" to="cmd_vel" />
</node>
</launch>
启动此示例后可以发现,/turtle1/cmd_vel已经找不到了取而代之的是/cmd_vel
rostopic list
/cmd_vel
/person_info
/rosout
/rosout_agg
/turtle1/color_sensor
/turtle1/pose