当前位置:网站首页>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:=6666
arg还有更加高级,也更加灵活的用法:
$(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>
参考文章:
边栏推荐
猜你喜欢
Delicious this year
Deep Learning Course2 Week 2 Optimization Algorithms Exercises
xctf attack and defense world web master advanced area webshell
毕业十年,财富自由:那些比拼命努力更重要的事,从来没人会教你
复现gallerycms字符长度限制短域名绕过
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
牛客多校4 A.Task Computing 思维
如何给 UE4 场景添加游戏角色
KMP 字符串匹配问题
还在纠结报表工具的选型么?来看看这个
随机推荐
小程序毕设作品之微信美食菜谱小程序毕业设计成品(8)毕业设计论文模板
Lecture 3: Several common table field data types in MySQL database
NgRx Store createSelector 的单步调试和源代码分析
力扣第 304 场周赛复盘
别看了,这就是你的题呀
SAP Spartacus Accessibility E2E 端到端测试
2022 edition of MySQL tutorial, top collection good, take your time
[Mobile Web] Mobile terminal adaptation
今日睡眠质量记录74分
Analysis of the development trend of game metaverse
字符串——Trie
2022年最新河北建筑八大员(机械员)模拟考试题库及答案
小程序毕设作品之微信美食菜谱小程序毕业设计成品(5)任务书
Wechat Gymnasium Appointment Mini Program Graduation Design Finished Work (4) Opening Report
【Verilog刷题篇】硬件工程师从0到入门1|基础语法入门
【ASM】字节码操作 MethodWriter
JS prototype hasOwnProperty in 加方法 原型终点 继承 重写父类方法
安全第五次课后练习
xctf attack and defense world web master advanced area webshell
递归(各经典例题分析)