当前位置:网站首页>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>参考文章:
边栏推荐
- xctf attack and defense world web master advanced area web2
- 2022年最新河北建筑八大员(机械员)模拟考试题库及答案
- 求解多元多次方程解的个数
- 牛客多校4 A.Task Computing 思维
- SOM Network 2: Implementation of the Code
- 小程序容器+自定义插件,可实现混合App快速开发
- LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)
- selenium无头,防检测
- xctf attack and defense world web master advanced area webshell
- 小程序毕设作品之微信体育馆预约小程序毕业设计成品(1)开发概要
猜你喜欢

xctf攻防世界 Web高手进阶区 webshell

render-props and higher order components

03. GO language variable definition, function

威纶通触摸屏如何打开并升级EB8000旧版本项目并更换触摸屏型号?

Use Jenkins for continuous integration, this knowledge point must be mastered

How to prevent governance attacks in DAOs?

程序员必备的 “ 摸鱼神器 ” 来了 !

Getting Started Database Days4

JS prototype hasOwnProperty in Add method Prototype end point Inherit Override parent class method

Delicious this year
随机推荐
2022 edition of MySQL tutorial, top collection good, take your time
工程建筑行业数据中台指标分析
xss相关知识点以及从 XSS Payload 学习浏览器解码
NgRx Store createSelector 的单步调试和源代码分析
基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现
NgRx Selector 的 Memoization 特性学习笔记
SRv6 L3VPN的工作原理
Kubernetes Scheduler全解析
2022 版 MySQL 巅峰教程,收藏好,慢慢看
联邦学习在金融领域的发展和应用
SOM Network 1: Principles Explained
第一讲 测试知多少
Use Jenkins for continuous integration, this knowledge point must be mastered
RxJs SwitchMapTo 操作符之移花接木
Postman 批量测试接口详细教程
[ASM] Bytecode Operation MethodWriter
熟悉的朋友
[深入研究4G/5G/6G专题-48]: 5G Link Adaption链路自适应-4-下行链路自适应DLLA-PDCCH信道
移动端人脸风格化技术的应用
more grown, more lonely