一、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应用。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐