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代表任意字符。

  • 4
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在ROS2中,可以使用`launch`包来编写和管理启动多个包的脚本。 1. 首先,在你的ROS2工作空间中创建一个新的包,例如`my_launch_pkg`。 2. 在`my_launch_pkg`中创建一个名为`launch`的文件夹,并在该文件夹中创建一个名为`my_launch.py`的Python脚本文件。 3. 在`my_launch.py`中,你可以使用`launch.actions.IncludeLaunchDescription`来引用其他包中的launch文件,例如: ```python from launch import LaunchDescription from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource def generate_launch_description(): ld = LaunchDescription() # 包1 pkg1_launch_file_dir = LaunchConfiguration('pkg1_launch_file_dir') pkg1_launch_file = os.path.join(pkg1_launch_file_dir, 'pkg1_launch.py') pkg1_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource(pkg1_launch_file) ) ld.add_action(pkg1_launch) # 包2 pkg2_launch_file_dir = LaunchConfiguration('pkg2_launch_file_dir') pkg2_launch_file = os.path.join(pkg2_launch_file_dir, 'pkg2_launch.py') pkg2_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource(pkg2_launch_file) ) ld.add_action(pkg2_launch) return ld ``` 在上面的代码中,我们使用`IncludeLaunchDescription`来引用其他包中的launch文件,具体路径需要通过`LaunchConfiguration`来参数化。 4. 最后,你需要在`my_launch_pkg`中创建一个名为`my_launch_launch.py`的启动文件,用于启动`my_launch.py`。在启动文件中,你需要设置`ROS_PACKAGE_PATH`环境变量,以便ROS2可以找到其他包。例如: ```python import os from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import SetEnvironmentVariable def generate_launch_description(): # 设置ROS_PACKAGE_PATH环境变量 os.environ['ROS_PACKAGE_PATH'] = os.pathsep.join([ '/path/to/pkg1', '/path/to/pkg2', '/path/to/my_launch_pkg' ]) # 启动my_launch.py my_launch = IncludeLaunchDescription( PythonLaunchDescriptionSource(os.path.join( get_package_share_directory('my_launch_pkg'), 'launch', 'my_launch.py' )) ) return LaunchDescription([ SetEnvironmentVariable('PYTHONUNBUFFERED', '1'), my_launch ]) ``` 在上面的代码中,我们首先设置`ROS_PACKAGE_PATH`环境变量,然后启动`my_launch.py`。 5. 最后,在终端中运行以下命令以启动`my_launch_launch.py`: ``` $ ros2 launch my_launch_pkg my_launch_launch.py ``` 这将启动`my_launch.py`,同时启动包1和包2中的`launch.py`文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值