当前位置: 首页 > ai >正文

ROS2学习(14)------ ROS2Launch 多节点启动与配置脚本

  • 操作系统:ubuntu22.04
  • IDE:Visual Studio Code
  • 编程语言:C++11
  • ROS版本:2

在 ROS 2 中,launch 文件(通常用 Python 或 XML 编写)用于启动多个节点、设置参数、配置 QoS、管理命名空间等。它是构建复杂机器人系统时不可或缺的工具。

什么是 ROS 2 Launch?

ROS 2 的 launch 系统允许你通过一个脚本文件定义:

  • 启动哪些节点
  • 设置节点参数
  • 命名空间配置
  • 节点重命名
  • 条件控制(如根据参数选择是否启动某节点)
  • 加载参数文件(.yaml)
  • 包含其他 launch 文件(模块化)

常见的 Launch 文件格式

Python Launch 文件(推荐)

  • 最灵活,支持条件判断、变量替换、函数式编程。
  • 文件扩展名:.launch.py

XML Launch 文件

  • 类似于 ROS 1 的 .launch 文件。
  • 更适合简单任务或快速迁移 ROS 1 项目。

YAML 参数文件

  • 用于统一配置多个节点的参数。
  • 扩展名为 .yaml,常配合 launch 文件使用。

示例:多节点启动与配置(Python Launch 文件)

场景说明

我们有以下两个节点:

  • /talker
  • /listener

我们要实现:

  • 同时启动这两个节点
  • 给它们都加上命名空间 /demo
  • 使用自定义参数文件 params.yaml

第一步:创建参数文件 params.yaml

# config/params.yamltalker:ros__parameters:topic_name: "chatter"rate: 10listener:ros__parameters:topic_name: "chatter"

文件存放目录结构:
在这里插入图片描述

这样的结构可以适配将来咱的大项目,因为大项目会有许多的节点和配置文件。

第二步:编写 Python Launch 文件 launch.py

from launch import LaunchDescription
from launch_ros.actions import Node
from ament_index_python.packages import get_package_share_directory
import os
import yaml
from launch.actions import DeclareLaunchArgument
from launch.substitutions import LaunchConfigurationdef generate_launch_description():# 获取包路径和参数文件路径pkg_name = 'cpp_ddsdemo'  # 替换为你的包名config_dir = os.path.join(get_package_share_directory(pkg_name), 'config')params_file = os.path.join(config_dir, 'params.yaml')# 定义可传递的参数namespace_arg = DeclareLaunchArgument('namespace', default_value='/demo',description='Namespace for the nodes')# 创建节点talker_node = Node(package=pkg_name,executable='talker',name='talker',namespace=LaunchConfiguration('namespace'),parameters=[params_file],output='screen')listener_node = Node(package=pkg_name,executable='listener',name='listener',namespace=LaunchConfiguration('namespace'),parameters=[params_file],output='screen')return LaunchDescription([namespace_arg,talker_node,listener_node])

第三步:修改 CMakeLists.txt(确保 launch 文件被安装)

install(DIRECTORYlaunchDESTINATION share/${PROJECT_NAME}
)install(DIRECTORYconfigDESTINATION share/${PROJECT_NAME})

第四步:编译并运行

colcon build --packages-select cpp_ddsdemo
source install/setup.bashros2 launch cpp_ddsdemo demo.launch.py

你可以传入参数:

ros2 launch cpp_ddsdemo launch.py namespace:=/myrobot

运行结果:

(base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws/src/cpp_ddsdemo$ source install/setup.bash
(base) dingxin@dev01:/media/dingxin/data/projects/ros2/ros2_ws/src/cpp_ddsdemo$ ros2 launch cpp_ddsdemo launch.py
[INFO] [launch]: All log files can be found below /home/dingxin/.ros/log/2025-05-27-15-43-03-594551-dev01-1530002
[INFO] [launch]: Default logging verbosity is set to INFO
[INFO] [talker-1]: process started with pid [1530003]
[INFO] [listener-2]: process started with pid [1530005]
[talker-1] [INFO] [1748331784.141867499] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331784.142327897] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331784.641880704] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331784.642206460] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331785.141891231] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331785.142200047] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331785.641883258] [demo.talker]: Publishing: 'Hello, DDS!'
[listener-2] [INFO] [1748331785.642191690] [demo.listener]: I heard: 'Hello, DDS!'
[talker-1] [INFO] [1748331786.141904319] [demo.talker]: Publishing: 'Hello, DDS!'

Launch 文件常用功能一览

功能示例
启动节点Node(package=‘…’, executable=‘…’)
设置命名空间namespace=‘…’
设置参数parameters=[file_path]
传递参数DeclareLaunchArgument(…) + LaunchConfiguration(…)
包含其他 launch 文件IncludeLaunchDescription(…)
条件启动节点condition=IfCondition(LaunchConfiguration(‘enable_camera’))
输出日志output=‘screen’

其他示例:XML 格式 Launch 文件

如果你更喜欢 XML 风格:

<launch><node pkg="cpp_ddsdemo" exec="talker" name="talker" namespace="/demo"><param name="topic_name" value="chatter"/><param name="rate" value="10"/></node><node pkg="cpp_ddsdemo" exec="listener" name="listener" namespace="/demo"><param name="topic_name" value="chatter"/></node>
</launch>
⚠️ 注意:XML 格式不支持参数文件加载,不如 Python 灵活。

总结

特性推荐方式
多节点启动✅ 使用 launch 文件
参数配置✅ 使用 .yaml 文件 + parameters=[]
命名空间✅ 使用 namespace=
参数传递✅ 使用 DeclareLaunchArgument() 和 LaunchConfiguration()
模块化✅ 使用 IncludeLaunchDescription() 包含其他 launch 文件
http://www.xdnf.cn/news/9383.html

相关文章:

  • 基于stm32的 永磁同步电机二电平驱动控制系统设计
  • OpenKylin文件管理器界面层级切换问题
  • 多相电机驱动控制学习(1)——基于双dq坐标系的六相/双三相PMSM驱动控制
  • ABC 377
  • 互联网医疗问诊APP原型设计:12个实战案例解析
  • Workflow
  • 如何合理选择智能外呼机器人:多维评估
  • SAP-ABAP:SAP的DMS根据物料号获取附件详解
  • 网络通信的基石:深入理解帧与报文
  • [BUG记录]0X10 会话切换服务响应NRC 0x10
  • <<运算符重载 和 c_str() 的区别和联系
  • TF 卡和 NM 卡有何区别?
  • openinstall支持豆瓣广告监测,赋能品牌深挖社交流量
  • Baklib知识中台体系构建与应用解析
  • 比较转录组-油料作物-文献精读133
  • Jenkins实践(10):pipeline构建历史展示包名和各阶段间传递参数
  • 【深度学习新浪潮】智能眼镜关键技术拆解(简要版)
  • 什么是 BOM 表,如何通过 BOM 表做好生产管理
  • git 删除某次commit并 推送到 origin
  • 安装 LCMS-8060 三重四级杆配件的详细步骤和要点
  • JavaSE核心知识点04工具04-03(Maven)
  • 简单产品图生成器v1(自己写的)
  • 散货拼柜业务有哪些管理难题?易境通散货拼柜系统如何协同化管理?
  • IPsec协议
  • Codeforces Round 1027 (Div. 3)
  • 使用硬件调试器认识arm64的四大特权级
  • 防火墙虚拟系统
  • 【深度学习新浪潮】以图搜地点是如何实现的?(含大模型方案)
  • AI编译器战争:MLIR vs. OpenAI Triton的算子优化哲学对比 ——从矩阵乘法案例看两种范式的设计差异
  • redis五种数据结构底层实现