文章目录
- 简介
- 编写Launch文件
- 修改启动文件
简介
在实际的机器人项目中,一个系统可能包含几十个节点(雷达驱动、底盘控制、SLAM、导航等),如果全靠手动开终端启动,不仅效率极低,而且无法统一管理节点的参数和命名空间。为了协调这些功能,ROS2的标准方案是采用Launch文件。
采用Launch文件,可以通过一条命令,同时启动多个节点,而且支持条件执行,想启动哪个节点,就启动哪个节点。另一方面,也支持在文件中统一配置节点参数、重映射话题、设置命名空间等。
下面基于之前的话题通信教程,编写Launch,一键启动发布者和订阅者节点。
编写Launch文件
在外层【restaurant_robot】中,创建launch目录,在launch目录中,新建一个Python文件,命名为pub_sub_launch.py。
mkdir launch vim launch/pub_sub_launch.py文件内容如下
# 导入 Launch 核心库fromlaunchimportLaunchDescriptionfromlaunch_ros.actionsimportNodedefgenerate_launch_description():# 这是 Launch 文件的入口函数,必须返回一个 LaunchDescription 对象# 1. 定义 Publisher 节点pub=Node(package='restaurant_robot',# 功能包名executable='run_publisher',# setup.py 中注册的可执行文件名name='my_custom_pub',# 【可选】为节点重命名(如果不写,默认使用代码里的名字)output='screen'# 将节点的日志输出到当前终端屏幕)# 2. 定义 Subscriber 节点sub=Node(package='restaurant_robot',executable='run_subscriber',name='my_custom_sub',output='screen')# 3. 将所有需要启动的节点放入 LaunchDescription 列表中并返回returnLaunchDescription([pub,sub])修改启动文件
像之前所有示例一样,Launch文件也需要指明入口,即需要修改外层restaurant文件夹中的setup.py文件。
vim setup.py首先确保文件顶部导入了 os 和 glob 模块,如果没有,就手动添加
importosfromglobimportglob然后找到data_files列表,在现有列表中,追加一行配置,用于包含launch目录
data_files=[# 现有内容不用动# 添加下面这一行:将 launch 目录下所有匹配的文件安装到 share 目录中(os.path.join('share',package_name,'launch'),glob(os.path.join('launch','*launch.[pxy][yma]*'))),],这行代码用glob匹配launch目录下所有以launch.py或launch.xml结尾的文件,并将它们复制到安装目录的 share/restaurant_robot/launch 路径下。
至此,就可以编译、激活环境并运行了,回到ros2_ws路径
colcon build source install/setup.bash ros2 launch restaurant_robot pub_sub_launch.py运行后,输出内容如下
[INFO] [launch]: All log files can be found below /home/vboxuser/.ros/log/2026-07-28-01-01-05-589710-Ubuntu-3898 [INFO] [launch]: Default logging verbosity is set to INFO [INFO] [run_publisher-1]: process started with pid [3906] [INFO] [run_subscriber-2]: process started with pid [3907] [run_subscriber-2] [INFO] [1785200467.613633520] [my_sub]: received data:Hello ROS2: 0 [run_publisher-1] [INFO] [1785200467.613682214] [my_pub]: publishHello ROS2: 0 [run_publisher-1] [INFO] [1785200468.275424669] [my_pub]: publishHello ROS2: 1 [run_subscriber-2] [INFO] [1785200468.275892154] [my_sub]: received data:Hello ROS2: 1 [run_publisher-1] [INFO] [1785200469.274379359] [my_pub]: publishHello ROS2: 2 [run_subscriber-2] [INFO] [1785200469.274828949] [my_sub]: received data:Hello ROS2: 2