ROS2学习笔记22--使用launch启动/监听多个node节点
Posted 鸿_H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记22--使用launch启动/监听多个node节点相关的知识,希望对你有一定的参考价值。
概要:这篇内容主要介绍如何使用launch启动/监听多个node节点
环境:ubuntu20.04,ros2-foxy,vscode
最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现
3.4使用launch
启动/监听多个node
节点(原文:https://docs.ros.org/en/foxy/Tutorials/Launch-system.html
)
>>
教程>>
使用launch
启动/监听多个node
节点
你正阅读的是ros2
较老版本(Foxy
),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html
)
使用launch
启动/监听多个node
节点
目录
1.ros2的launch系统
2.编写ros2的launch文件
2.1python包
2.2c++包
2.3编写launch文件
2.4用法
3.ros2的launch概念的案例
4.文档
1.ros2的launch系统
ros2
的launch
系统负责帮助使用者描述他们系统配置,然后保证系统如同描述运行.系统配置包括,运行哪些项目,在哪里运行,传什么参数给项目;并且,ros
特点使得复用整个系统模块变得容易,只要给(launch
系统)不同的配置(参数)即可实现.该系统也负责已启动进程的监听,对这些进程的状态进行报道或者对其变化作出反应.
用python
写的launch
文件,可以启动或者终止不同的节点,也可以作为触发器来处理各种事情.提供这个构架的包是launch_ros
,其底层使用非ros
特有的launch
架构.
这个设计文档(https://design.ros2.org/articles/roslaunch.html
,个人打开失败)详细说明了ros2
的launch
系统的(被设计的)目标(当前并不是所有的功能都能用).
2.编写ros2的launch文件
如果你还没有准备,你一定要快速过一遍如何创建ros2
包课程.在ros2中,创建launch
文件一种方式是使用python
,该文件可以被ros2
命令行界面工具ros2 launch
执行.在工作空间里面,我们先使用ros2 pkg create <pkg-name> --dependencies [deps]
创建一个ros2
包,并且创建一个名为launch
的新目录.
2.1 python包
对应python
包,你的目录应该长这样子:
src/
my_package/
launch/
setup.py
setup.cfg
package.xml
为了保证colcon
可以找得到launch
文件,我们需要借助setup
的参数data_files
来告诉它,这些launch
文件的python
设置工具.
在我们setup.py
文件里面(可以大概这么写):
import os
from glob import glob
from setuptools import setup
package_name = 'my_package'
setup(
# Other parameters ...
data_files=[
# ... Other data files
# Include all launch files. This is the most important line here!
(os.path.join('share', package_name), glob('launch/*.launch.py'))
]
)
2.2 c++包
如果你是用c++
包,我们只要调整一下CMakeLists.txt
文件,添加:
# Install launch files.
install(DIRECTORY
launch
DESTINATION share/${PROJECT_NAME}/
)
这部分内容到文件的末尾(但这部分内容要在ament_package()
之前).
2.3编写launch文件
在你的launch
目录里面,创建一个.launch.py
后缀文件,例如my_script.launch.py
.这个.launch.py
并不是launch
文件后缀的专有要求.另一个常用的操作是_launch.py
,这在初级水平launch
文件课程有使用到.如果你非得修改这个后缀,一定要相应调整你的setup.py
的glob()
参数.
你的launch
文件一定要定义generate_launch_description()
,其会返回launch.LaunchDescription()
以供ros2 launch
指令使用的(也就是说,没定义的话,ros2 launch
指令启动launch
文件会失败).
import launch
import launch.actions
import launch.substitutions
import launch_ros.actions
def generate_launch_description():
return launch.LaunchDescription([
launch.actions.DeclareLaunchArgument(
'node_prefix',
default_value=[launch.substitutions.EnvironmentVariable('USER'), '_'],
description='Prefix for node names'),
launch_ros.actions.Node(
package='demo_nodes_cpp', executable='talker', output='screen',
name=[launch.substitutions.LaunchConfiguration('node_prefix'), 'talker']),
])
2.4用法
虽然launch
文件可以写成单独运行的脚本,但在ros里面,典型用法是让launch
文件被ros2
工具所引用.
运行colcon build
和source
了环境变量之后,你应该应该能够启动一个launch
文件,如下:
ros2 launch my_package script.launch.py
3.ros2的launch概念的案例
这个案例(https://github.com/ros2/launch_ros/blob/foxy/launch_ros/examples/lifecycle_pub_sub_launch.py
)的launch
文件启动了两个节点,其中一个管理声明周期(生命周期节点).当他们处于过渡状态时,通过launch_ros
启动的生命周期节点,自动地发射事件.通过launch
架构,这些事件随后可以被执行.例如,发送一些其他事件(如,请求其他状态转换,生命周期节点通过launch_ros
自动启动事件处理程序)或者触发其他操作(例如启动另一个节点)
在上述例子中,生命周期节点talker会发出不同种类的转换请求,并且当生命周期节点处于合适状态时,它的转换事件是会被,例如启动的listener节点,作出反应.
4.文档
这个launch
文档(https://github.com/ros2/launch/blob/foxy/launch/doc/source/architecture.rst
)提供更多launch_ros
所使用的概念细节.
额外的文档/功能例子即将推出.在此期间看看这些源码(https://github.com/ros2/launch
).
其他
个人认为重点:
launch
文件使用python
编写,注意其中编写样式;对于python
包和c++
包,launch
文件对包配置文件要求.
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈
以上是关于ROS2学习笔记22--使用launch启动/监听多个node节点的主要内容,如果未能解决你的问题,请参考以下文章