当前位置:网站首页>ROS2初级知识(8):Launching启动多节点
ROS2初级知识(8):Launching启动多节点
2022-08-01 22:19:00 【无水先生】
一、背景知识
在本教程中,介绍多节点打开的脚本launch和其书性;随着您创建越来越多的节点同时运行的更复杂的系统,打开终端和重新输入配置细节变得乏味。launch文件允许您同时启动和配置多个包含 ROS 2 节点的可执行文件。或者使用 ros2 launch命令运行单个启动文件将立即启动整个系统内所有节点及其配置同时生效。
二、运行启动文件
2.1 打开一个新终端并运行:
ros2 run turtlesim multisim.launch.py此命令将运行以下启动文件:
from launch import LaunchDescription
import launch_ros.actions
def generate_launch_description():
return LaunchDescription([
launch_ros.actions.Node(
namespace= "turtlesim1", package='turtlesim', executable='turtlesim_node', output='screen'),
launch_ros.actions.Node(
namespace= "turtlesim2", package='turtlesim', executable='turtlesim_node', output='screen'),
])2.2 启动文件的多样化
上面的启动文件是用 Python 编写的,但您也可以使用 XML 和 YAML 创建启动文件。您可以在为 ROS 2 启动文件使用 Python、XML 和 YAML 中查看这些不同的 ROS 2 启动格式的比较。
参见文章:ROS2的launch有何不同?
三、对海龟进行控制
现在这些节点正在运行,您可以像控制任何其他 ROS 2 节点一样控制它们。例如,您可以通过打开两个附加终端并运行以下命令使海龟向相反方向行驶:
在第二个终端:
ros2 topic pub /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist “{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.8}}”此处:

在这里,要么选择不同namespace,要么在同一个namespace但对象名称turtle1需要改变,必须二选一,否则数据冲突。
在第三个终端:
ros2 topic pub /turtlesim2/turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.8}}"运行这些命令后,您应该会看到如下内容:

四、launch文件属性
4.1 属性总览
launch和ROS下指令必须具有等价性;因此,用命令能完成的,必可用launch完成,因此,这里将常见launch的属性列出,以便应用时查询:
| 属性 | 属性作用 |
|---|---|
| name="NODE_NAME" | 为节点指派名称,这将会覆盖掉ros::init()定义的node_name |
| pkg="PACKAGE_NAME" | 节点所在的包名 |
| type="FILE_NAME" | 执行文件的名称如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名 |
| output="screen" | 终端输出转储在当前的控制台上,而不是在日志文件中 |
| respawn="true" | 当roslaunch启动完所有该启动的节点之后,会监测每一个节点,保证它们正常的运行状态。对于任意节点,当它终止时,roslaunch 会将该节点重启 |
| required="true" | 当被此属性标记的节点终止时,roslaunch会将其他的节点一并终止。注意此属性不可以与respawn="true"一起描述同一个节点 |
| launch-prefix = "command-prefix" | 我的理解是,相当于在执行启动命令时加上一段命令前缀 |
| ns = "NAME_SPACE" | 这个属性可以让你在自定义的命名空间里运行节点 |
4.2 <node>属性
标签可以说是launch文件里最常见的标签了,每个node标签里包括了ROS图中节点的名称属性name、该节点所在的包名pkg以及节点的类型type(其实就是可执行文件的名称,如果是用Python编写的就填写xxx.py,如果是cpp就写编译生成的可执行文件名),在上面的例子中还出现了output这个东西,这个属性在调试阶段很有用,output=“screen”表示了将终端输出转储在当前的控制台上,而不是在日志文件中。
4.3 <include>
该标签可以导入另一个roslaunch XML文件到当前文件。
| 属性 | 属性作用 |
|---|---|
| file ="$(find pkg-name)/path/filename.xml" | 指明我们想要包含进来的文件 |
| ns="NAME_SPACE" | 相对NAME_SPACE命名空间导入文件 |
语法案例:
< include file= "$(find demo)/launch/demo.launch" ns="demo_namespace"/>4.4 <remap>属性
remap标签顾名思义重映射,ROS支持topic的重映射,remap标签里包含一个original-name和一个new-name,及原名称和新名称。
比如现在你拿到一个节点,这个节点订阅了"/chatter"topic,然而你自己写的节点只能发布到"/demo/chatter"topic,由于这两个topic的消息类型是一致的,你想让这两个节点进行通讯,那么可以在launch文件中这样写:
<remap from="chatter" to="demo/chatter"/> 这样就可以直接把/chattertopic重映射到/demo/chatter,这样子不用修改任何代码,就可以让两个节点进行通讯。
如果这个 remap标签写在与 node 元素的同一级,而且在launch 元素内的最顶层。 那么这个重映射将会作用于launch文件中所有的节点。
4.5 <param>属性
param标签的作用相当于命令行中的ros param set
比如现在在参数服务器中添加一个名为demo_param,值为666的参数
<param name="demo_param" type="int" value="666"/>4.6 <rosparam>属性
rosparam标签允许从YAML文件中一次性导入大量参数。
典型案例:
<rosparam command="load" file="$(find pkg-name)/path/name.yaml"/>4.7 <arg>属性
arg标签用来在launch文件中定义参数,arg和param在ROS里有根本性的区别,就像局部变量和全局变量的区别一样。arg不储存在参数服务器中,不能提供给节点使用,只能在launch文件中使用。param则是储存在参数服务器中,可以被节点使用。
<arg name="demo"/>像上面这样,就简单地声明了一个参数,名叫demo,但是声明不等于定义,我们需要给他赋值,在赋值之后参数才能够发挥作用。
<arg name="demo" value="666"/>
<arg name="demo" default="666"/>以上是两种简单的赋值方法,两者的区别是使用后者赋值的参数可以在命令行中像下面这样被修改,前者则不行。
roslaunch demo demo.launch demo:=6666arg还有更加高级,也更加灵活的用法:
$(arg arg_name)当$(arg arg_name)出现在launch文件任意位置时,将会自动替代为所给参数的值。
4.8 <group>属性
group标签可以将若干个节点同时划分进某个工作空间。
<group ns="demo_1">
<node name="demo_1" pkg="demo_1" type="demo_pub_1" output="screen"/>
<node name="demo_1" pkg="demo_1" type="demo_sub_1" output="screen"/>
</group>
<group ns="demo_2">
<node name="demo_2" pkg="demo_2" type="demo_pub_2" output="screen"/>
<node name="demo_2" pkg="demo_2" type="demo_sub_2" output="screen"/>
</group>group标签还可以做到对node的批量管理。比如我可以同时终止在同一个group中的节点。
<group if="1-or-0">
……
……
……
</group>
<group unless="1-or-0">
……
……
……
</group>第一种情况,当if属性的值为0的时候将会忽略掉<group></group>之间的标签。
第二种恰好相反,当if属性的值为1的时候将会忽略掉<group></group>之间的标签。
但是我们通常不会直接用1或0来定义if标签。因为这样不够灵活。
通常会搭配$(arg arg_name)来使用。
demo.launch文件
<launch>
<include file="include.launch">
<arg name="demo_arg" value="1"/>
</include>
</launch>include.launch文件
<launch>
<arg name="demo_arg"/>
<group if="$(demo_arg)">
<node name="demo" pkg="demo" type="demo_pub" output="screen"/>
<node name="demo" pkg="demo" type="demo_sub" output="screen"/>
</group>
</launch>参考文章:
边栏推荐
- 恒星的正方形问题
- 【ASM】字节码操作 MethodWriter
- 线上故障排查方案
- 使用 Zokrates 在 BSV 上创建您的第一个 zkSNARK 证明
- 解决 win10 下 ISE14.7的 iMPACT 崩溃问题 - FPGA 笔记
- Wechat Gymnasium Reservation Mini Program Graduation Design Finished Work Mini Program Graduation Design Finished Product (2) Mini Program Function
- 熟悉的朋友
- 自建 Prometheus 采集腾讯云容器服务监控数据最佳实践
- VGUgarbage collector(垃圾回收器)的实现原理
- 还在纠结报表工具的选型么?来看看这个
猜你喜欢

Ten years after graduation, financial freedom: those things that are more important than hard work, no one will ever teach you

【牛客刷题-SQL大厂面试真题】NO4.出行场景(某滴打车)

如何给 UE4 场景添加游戏角色

Kubernetes Scheduler全解析

13、学习MySQL 分组

联邦学习在金融领域的发展和应用

Go 微服务开发框架DMicro的设计思路

小程序毕设作品之微信美食菜谱小程序毕业设计成品(6)开题答辩PPT

2022-08-01 第八组 曹雨 泛型 枚举

小程序毕设作品之微信体育馆预约小程序毕业设计成品(3)后台功能
随机推荐
PHP算法之电话号码的字母组合
(翻译)按钮的对比色引导用户操作的方式
PAM 回文自动机
小程序中的多表联合查询
10年稳定性保障经验总结,故障复盘要回答哪三大关键问题?|TakinTalks大咖分享
今年的很美味
企业公众号文章写作方向:如何写出读者认可的优质内容
String - Trie
RxJs SwitchMapTo 操作符之移花接木
AQS
The must-have "fishing artifact" for programmers is here!
基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现
【C语言实现】最大公约数的3种求法
PHP算法之有效的括号
Wechat Gymnasium Reservation Mini Program Graduation Design Finished Work Mini Program Graduation Design Finished Product (2) Mini Program Function
1391D. 505 状压dp
威纶通触摸屏如何打开并升级EB8000旧版本项目并更换触摸屏型号?
如何防范 DAO 中的治理攻击?
如何理解 new (...args: any[]) => any
Raspberry Pi information display small screen, display time, IP address, CPU information, memory information (C language), four-wire i2c communication, 0.96-inch oled screen