Launch文件编写

参考文献 原文链接:
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代表任意字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值