roslaunch是ros自带的一个库,使用roslaunch可以同时运行多个节点,通过编写launch文件来配置各个节点
首先保证环境变量中是否有catkin_ws工作空间的路径
echo $ROS_PACKAGE_PATH
若无,则进入该工作空间的根目录,执行
source devel/setup.bash
之后在任意目录下都可以进入之前创建的程序包
roscd beginner_tutorials
新建launch文件夹,在里面创建launch文件
mkdir launch
gedit turtlemimic.launch
拷贝以下launch文件的内容:
http://wiki.ros.org/cn/ROS/Tutorials/UsingRqtconsoleRoslaunch
<launch>
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<node pkg="turtlesim" name="mimic" type="mimic">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
</launch>
launch文件的格式是XML
下面先简单说一下各个标签、属性的意思:
多个组的节点
上面文件在做什么?
首先分别在两个组中各自建立了一个turtlesim_node,然后只控制组1的节点,让组2的节点跟着组1的节点一起运动
?
以组1为例,group标签定义了一个组,组的名字在ns属性中给出 为"turtlesim1",该组内定义了一个node标签,说明组内只有一个节点,该节点是ros包(pkg属性)"turtlesim"里面的(type属性)"turtlesim_node"节点(的一个实例) ,该节点的名字(name属性)为"sim"
?
定义了两个组之后,又定义了一个mimic(模仿)节点,用于使组2的节点模仿组1的节点运动,通过remap将input(输入)话题重新映射到turtlesim1的turtle1话题,将output(输出)话题映射到turtlesim2,意味着将turtlesim1/turtle1 topic作为mimic节点的input topic,而turtlesim2/turtle1 topic作为mimic节点的output topic
?
?
关于remap标签的另一个例子
比如想同时用多张图片跑一套算法,可以为每张img定义一个组:
以组1为例,每个组定义两个节点:
<node pkg="rosbag" type="play" name="img_1" output="screen" args="--clock path_to_data /topic_a:=/group_1/topic_a /topic_b:=/group_1/topic_b ..... ">
</node>
<node pkg="algorithm_pkg" type="algorithm_node" name="algorithm_1" output="screen">
<remap from="/topic_a" to="/group_1/topic_a" >
</remap>
</node>
节点1:在args属性将原来topic名字映射成包含组名的新名字,意味着rosbag发布的topic名字变成 /group_1/topic_a 等等...
节点2:remap标签,将该节点订阅的话题重定向为新的名字,使其与在该组内发布数据的rosbag play节点所发布的话题名对应
为什么需要把原本的topic改为包含组名的?原本在算法节点中定义的订阅者,订阅的topic名字只是topic_a,由于输入图像不同,如果所有的输入图像都发布到topic_a这一个topic上,会造成混乱,因此应该一个输入图像对应一个话题名,同样地接收该输入图像(即运行算法的节点)所订阅的话题名也要随之更改。
?
launch文件的更多内容:
原文:https://www.cnblogs.com/notesbyY/p/10968689.html