ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

第119篇 ROS2 Launch系统入门——一键启动你的机器人

第119篇 ROS2 Launch系统入门——一键启动你的机器人 面试被问ROS2的Launch系统你用过吗launch文件里能做哪些事我说就是启动多个节点。面试官说launch文件里能传参数吗能做条件判断吗能包含其他launch文件吗我只能回答应该可以吧。面试结束后赶紧补了这块知识。为什么需要Launch一个机器人系统通常有十几个甚至几十个节点。每次启动都要一个个敲ros2 run命令你能想象有多崩溃。Launch文件就是用来解决这个问题的。一个launch文件可以一次性启动多个节点设置参数配置命名空间建立组件。一条命令搞定整个系统的启动。ros2 launch my_robot bringup.launch.pyLaunch文件的结构ROS2的launch文件是Python脚本不是XML了ROS1用的是XML。这意味着你可以用Python的所有能力变量、条件、循环、函数调用。最基本的launch文件from launch import LaunchDescription from launch_ros.actions import Node def generate_launch_description(): return LaunchDescription([ Node( packagemy_robot, executablelidar_driver, namelidar, outputscreen ), Node( packagemy_robot, executablecontroller, namecontroller, outputscreen ) ])generate_launch_description()是入口函数必须返回一个LaunchDescription对象。里面放的就是要执行的Action最常见的是Node。package是包名executable是可执行文件名name是节点在ROS系统中的名字可以和executable不同outputscreen表示把日志输出到终端。传参数在launch文件中给节点传参数Node( packagemy_robot, executablecontroller, namecontroller, parameters[{ kp: 1.5, ki: 0.01, kd: 0.2, control_rate: 100.0 }], outputscreen )也可以从YAML文件加载参数import os from ament_index_python.packages import get_package_share_directory config os.path.join( get_package_share_directory(my_robot), config, controller.yaml ) Node( packagemy_robot, executablecontroller, parameters[config], outputscreen )get_package_share_directory会自动找到包的安装路径这样你不需要写死绝对路径。Launch参数launch文件本身也可以接受参数这样同一个launch文件可以有不同的启动配置from launch.actions import DeclareLaunchArgument from launch.substitutions import LaunchConfiguration def generate_launch_description(): # 声明参数 use_sim_arg DeclareLaunchArgument( use_sim, default_valuefalse, description是否使用仿真环境) namespace_arg DeclareLaunchArgument( namespace, default_value, description机器人命名空间) # 使用参数 controller_node Node( packagemy_robot, executablecontroller, namespaceLaunchConfiguration(namespace), parameters[{ use_sim: LaunchConfiguration(use_sim) }] ) return LaunchDescription([ use_sim_arg, namespace_arg, controller_node ])启动时可以传参ros2 launch my_robot bringup.launch.py use_sim:true namespace:robot1这样同一个launch文件就能适配不同的场景仿真或实机单机或多机。包含其他Launch文件复杂系统通常有多层launch文件。比如bringup.launch.py是总入口它包含sensor.launch.py、navigation.launch.py等子文件。用IncludeLaunchDescription来包含其他launch文件还可以通过launch_arguments传递参数覆盖默认值。这种分层结构让launch文件更易维护。每个子系统有自己的launch文件总launch文件只负责组合。条件启动有时候你只想在特定条件下启动某个节点。比如只在仿真环境下启动Gazebofrom launch.conditions import IfCondition, UnlessCondition gazebo Node( packagegazebo_ros, executablegzserver, conditionIfCondition(LaunchConfiguration(use_sim)) )IfCondition在参数为true时启动节点UnlessCondition在参数为false时启动。面试中怎么聊面试官问Launch你可以说ROS2的launch文件是Python脚本支持参数声明、条件判断、包含子launch文件。可以一次性启动多个节点设置参数和命名空间。通过LaunchArgument实现参数化启动同一个launch文件适配仿真和实机不同场景。分层结构让复杂系统的启动更易管理。给你的建议把你项目里的启动命令整理成launch文件。先从一个节点开始然后逐步加入更多节点和参数。把常用的launch参数use_sim、namespace、debug标准化团队统一使用。这样每个人启动系统的方式都一样减少沟通成本。Launch文件的组织策略随着项目规模增长Launch文件会变得越来越复杂。一个良好的组织策略是把Launch文件按功能模块拆分比如robot_bringup负责启动硬件驱动navigation负责导航栈perception负责感知模块。然后用一个顶层Launch文件include这些子文件。参数也用类似的方式组织放在config目录下按模块分文件。补充一点Python版的Launch文件和C版的Launch文件可以混用但建议团队统一选择一种减少维护成本。Python版更灵活C版启动更快。Launch调试技巧launch文件出问题时可以加--debug参数查看详细日志ros2 launch my_package my_launch.py --debug。这会打印所有节点的启动过程、参数加载、事件触发等信息排查启动失败的原因特别有用。另外ros2 launch --show-args my_package my_launch.py可以查看launch文件接受的所有参数及其默认值不用翻源码。上一篇第118篇 ROS2动态重配置——运行时改变系统行为下一篇预告第120篇 ROS2 Launch进阶——参数传递、条件启动和节点编排
返回列表