【ROS入门】13. launch启动文件的使用方法
一.launch文件结构
由XML语言写的,可实现多个节点的配置和启动。
不再需要打开多个终端用多个rosrun命令来启动不同的节点了,可自动启动ROS Master。
二.launch文件语法
1.根元素
launch文件里面的所有内容都是通过xml这种标签去描述的
launch文件中的根元素采用<launch>标签定义
图中的<launch>代表标签开始,</launch>代表标签结束;
node标签是用来启动某个ros节点的,主要部分如上;
name相当于是节点名,会取代程序里面初始化时的节点名。
其他:
output:控制某个节点node把日志信息打印到终端。
respawn:节点奔溃后是否重启
required:节点是否为必须节点,即改节点奔溃后须终止其他节点
ns:自定义的命名空间,在自定义的命名空间中运行节点
args:输入参数用
2.参数设置
param:【在ROS参数服务器中】处理一个参数
rosparam:【在ROS参数服务器中】处理多个参数
arg:【不存在于ROS的参数服务器中】仅在launch文件中出现,可作为node运行时传的参数,如之前在终端输入指令时传的参数。
3.重映射、嵌套
注意嵌套include之后,调用另一个launch文件,便会启动该文件内的所有内容。
三.示例
创建个新的功能包 learning_launch,包本身不需要添加别的依赖。
cd ~/catkin_ws/src catkin_create_pkg learning_launch示例1.
可以在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>先编译一下然后输入roslaunch 包名文件名启动:
cd ~/catkin_ws catkin_make roslaunch learning_launch simple.launch可以看到启动launch后,发布和订阅的日志同时打印到了终端。
示例2.
创建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文件夹,来存放launch文件。创建param.yaml文件:
A: 123 B: "hello" group: C: 456 D: "hello"启动
roslaunch learning_launch turtlesim_parameter_config.launch打开新终端,我们访问一下新设置的参数:
可以看到 /turtle_name1 参数是写在node节点 turtlesim_node 下的,因此该参数有 turtlesim_node的命名空间,参数全名叫: /turtlesim_node/turtle_name1。
同理load的参数也带有当前节点名的命名空间,并且这个yaml文件自身建了个group命名空间。
而 /turtle_number 参数是写在外面的,因此参数就叫: /turtle_number 。
示例3.
创建start_tf_demo_c++.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="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>这个例子把tf坐标广播与监听的一系列命令行整合在了一起。也不用在命令行中传参数了。
启动。
roslaunch learning_launch start_tf_demo_c++.launch示例4.
创建turtlesim_remap.launch文件
使用include,调用另一个launch文件simple.launch,可启动该文件内的所有内容。
并将topic名改动。
<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>启动
roslaunch learning_launch turtlesim_remap.launch输入rostopic list可以看到话题名已经改成了/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"