鱼香ros2(二十)launch脚本
一、launch脚本启动多个节点
1、为什么使用launch脚本?
通常我们需要三个节点的时候,要使用三个终端,不能同一个终端使用,关闭也需要分别去Ctrl+C,这样比较麻烦。因此我们可以将三个启动节点的代码合成一个文件里,然后一起启动一起关闭,ros2提供了一个工具,就叫launch。launch的作用就是启动脚本。
2、launch介绍:
使用launch启动多个节点,需要两个python库(也可以不用python,使用xml格式,yaml格式也是可以的,三种方式,建议使用python,比较灵活)。
import launch
import launch_ros
以上为ros2中使用launch的python版本所需要的库。
3、编辑launch文件:
1)先建文件夹launch
2)新建launch文件:
新建 ***.launch.py 或 ***.launch.xml 或 ***.launch.yaml ,看自己使用哪个版本的,我们这里使用***.launch.py。
3)编写:

generate_launch_description():函数名字是定死的,不能改。等会我们启动文件,就会使用命令行工具——ros2 launch + 文件名,或者功能包名字加launch文件进行启动,就会调用这个generate_launch_description()这个函数,而且这个函数的返回值类型也是定死的。
4)使用CMakeLists.txt安装

#安装 demo.launch.py
install(DIRECTORY launch
DESTINATION share/${PROJECT_NAME}
)
注:python功能包是在setup.py里做添加
from glob import glob
('share/' + package_name+'/launch',glob('launch/*.launch.py')),

4)colcon build

5)使用:
ros2 launch demo_cpp_service demo.launch.py

Ctrl键+c:一键就关闭三个节点了。

二、launch传递参数
1、ros2如何使用命令修改参数?
正常是使用:
ros2 run turtlesim turtlesim_node --ros-args -p background_g:=255

--ros-args -p background_g:=255——这一段就是改变参数background_g的值。
但是launch启动这样是无效的,因为我们同时在里面启动了三个节点,根本不知道这个参数是哪个节点的。

2、launch传递参数
1)声明一个launch参数
action_declare_arg_launch_background=launch.actions.DeclareLaunchArgument("launch_arg_bg",default_value=150)
2)将launch参数手动传递给某个节点
parameters=[{'background_g': launch.substitutions.LaunchConfiguration("launch_arg_bg",default=150)}],

3)注意事项:
在launch文件中,所有节点,参数都要封装为动作,并且一定要放到LaunchDescription([])的参数里,launch才能找到对应动作。
声明的参数动作,除了要声明,放到LaunchDescription里外,还要在指定的节点里绑定节点的原始参数,比如这里launch里的动作action_declare_arg_launch_background的launch_arg_bg参数就是对应的turtlesim_node节点里的background_g参数。
3、使用
记得修改代码了一定要colcon build
ros2 launch demo_cpp_service demo.launch.py launch_arg_bg:=0


就很方便改参数了。
三、launch进阶
1、launch三大组件:
动作、条件和替换。
1)动作:
除了是一个节点外,还可以是一句打印,一段终端指令,甚至是另外一个launch文件,就是需要执行的。
2)替换:
使用launch的参数替换节点的参数值。
3)条件:
利用条件可以决定哪些动作启动,那些不启动。相当于if。
2、动作案例:
1)导包:
get_package_share_directory:通过功能包的名字获取它所在的share目录。这个根据自己的业务看需不需要,我这边有导入其他launch的需要。
2)动作使用:
我们调用ros2自带的小海龟的launch文件:
ros2 launch turtlesim multisim.launch.py



3、替换、条件:
和刚刚学的launch的参数有点相似,我们这边的需求是看传入的参数start_rqt是否为true,如果true,则启动rqt,否则不启动,默认start_rqt的值为false。

在action_topic_list动作里我们要改下逻辑

colcon build

当我们使用:ros2 launch demo_cpp_service actions.launch.py start_rqt:=true

四、小结
1、介绍:
本次小结是针对鱼香的《ros2机器人开发从入门到实践》的第四章总结,也就对应我的笔记《鱼香ros2(十五)……》到本篇的总结。
2、基本概念:
介绍了服务和参数通信的基本概念。
1)服务通信:
通过人脸检测的例子学习了python中的服务通信,以及通过巡逻海龟的例子学习了C++中实现服务通信的方法。
2)参数通信:
分别使用python和C++学习了如何声明和设置参数,以及在修改其他节点参数时,利用了服务通信机制。
3)launch工具:
学习了如何使用launch文件来启动多个借点,简化了借点的启动和管理过程。
3、ros2通信机制概览:
1)截至目前:
已经学习了ros2的四大通信机制中的三个:话题、服务和参数。
2)动作通信:
Action(动作通信)机制在本章中未进行详细讲解,主要原因是后续实践中几乎不会用到,且动作通信本质上是基于话题和服务的扩展。
3)未来学习方向:
下一个学习节点将侧重于ros2中常用的工具,这将帮助用户更高效地开发和维护ros2应用。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)