参考文献 原文链接:
https://blog.csdn.net/try_again_later/article/details/82933533
https://blog.csdn.net/weixin_51157015/article/details/120022782
基础知识
1、为什么需要launch文件
1.1 需要启动的节点太多
ROS每启动一个节点的时候,都是先打开一个新的终端,然后使用下面这种方式来启动节点:
rosrun package-name execute-name
如果只启动一个节点的确没有问题,一行rosrun指令就完成了,但是如果我们要启动三个甚至更多的节点,就需要重复很多遍的这样的动作,浪费生命!
1.2 节点之间有依赖关系管理
ROS客户端服务端通信时,客户端李三要找服务端李四借钱吃麻辣烫,假设李四节点没启动(这个人还不存在),我们先启动李三节点,李三节点直接不检查李四服务是否存在就发送了请求,这个时候肯定是会请求失败的。
再比如我们想在原有的导航地图上设置一个虚拟墙(原本不存在墙,人为加上,不让机器人过去),如果地图服务都没启动,在地图上设置虚拟墙肯定会失败。
从上面的例子我们可以得出,节点之间的启动有时会有依赖关系。launch文件允许我们同时启动和配置多个包含 ROS 2 节点的可执行文件
在ROS中launch文件只有一种格式以.launch结尾的xml文档。
2、 IDE安装,vscode环境
vscode 下载:
https://code.visualstudio.com/docs?start=true
# 1.安装
sudo dpkg -i xxxx.deb
# 2.卸载
sudo dpkg --purge code
# 3.启动
cd ~/catkin_ws
code .
3 、编辑launch文件
选定功能包右击 —> 添加 launch/xxx.launch 文件
编辑 xxx.launch 文件内容
<launch>
<node pkg="ros_test" type="test01" name="tt" output="screen" />
<node pkg="ros_test" type="test02.py" name="t2" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
</launch>
其中:
node ----> 包含的某个节点
pkg -----> 功能包
type ----> 被运行的节点文件 (c++文件不需要后缀,python需要 .py 后缀)
name ----> 为节点命名
output---> 设置日志的输出目标
4、运行launch文件
roslaunch的使用方法为:
roslaunch pkg-name launch-file-name
roslaunch ros_test XXX.launch
实践示例
创建turtle_test.launch文件
<launch>
<!--添加被执行的节点1-->
<group ns="turtlesim1">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<!--添加被执行的节点2-->
<group ns="turtlesim2">
<node pkg="turtlesim" name="sim" type="turtlesim_node"/>
</group>
<!--添加被执行的节点3-->
<node pkg="turtlesim" name="t_test" type="t_test">
<remap from="input" to="turtlesim1/turtle1"/>
<remap from="output" to="turtlesim2/turtle1"/>
</node>
<!--文本输出加output字段-->
<node pkg="hello" type="hello_test.py" name="hello" output="screen"/>
</launch>
launch :以launch标签开头以表明这是一个launch文件。
group:为一个节点组,可以通过某种设置进行整个组内的节点启停控制。
ns:为命名工作空间,这样可以让我们同时启动两个turtlesim模拟器而不会产生命名冲突。
< node pkg=“turtlesim” name=“sim” type=“turtlesim_node” />:节点的三个属性分别是程序包名字,节点名字,可执行文件名字。
arg:启动参数。args="$(find arg-name)"
< include>:在launch 中复用其他launch文件可以减少代码编写工作量。
<include file="$(find pkg-name)/launch/launch-file-name">
Terminal 1:
roslaunch beginner_tutorials turtle_test.launch
Terminal 2:
# 小海龟转逆时针圈圈
rostopic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, -1.8]'
小练习
现在我们已经学会了,如何编写一个简单的 launch文件,并且我们也知道了如何使用 roslaunch 命令来启动一个启动脚本文件。
下面我们来做一个小练习: 我们就将下面这一堆命令打包成一个启动文件:
roscore
rosrun turtlesim turtlesim_node
rosrun turtlesim turtle_teleop_key
在 beginner_tutorials 程序包中的launch 路径里新建一个 turlte_key_control.launch 文件:
将下面的代码复制过去:
<launch>
<node pkg="turtlesim" name="turtle1" type="turtlesim_node"/>
<node pkg="turtlesim" name="turtle1_key" type="turtle_teleop_key"/>
</launch>
新开一个终端运行这个启动脚本:
roslaunch beginner_tutorials turtle_key_control.launch
就可以在这个终端中,通过方向键来控制小海龟了。
五、启动顺序控制
在ubuntu下进行节点启动顺序控制的简单策略就是通过shell实现:
#!/bin/bash
roslaunch beginner_tutorials turtle_test.launch &
sleep 5
echo "bhand controller starting success!"
roslaunch beginner_tutorials turtle_key_control.launch &
sleep 0.1
wait
exit 0
第一行表示用bash执行,sleep表示演示,echo用来输出一定内容,有关ubuntu shell的其他操作,注意不用忘记句子后的"&"符号,可以自行查询相关资料。因此策略就是如果某个节点必须先执行,可以单独为其写一个launch文件,然后通过shell控制先行启动。
编写保存后,在终端要给xxx.sh执行权限,sudo chmod a+x xxx.sh,之后可通过./xxx.sh进行启动,xxx代表任意字符。