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.yaml

talker:
  ros__parameters:
    topic_name: "chatter"
    rate: 10

listener:
  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 LaunchConfiguration

def 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(DIRECTORY
  launch
  DESTINATION share/${PROJECT_NAME}
)

install(DIRECTORY
  config
  DESTINATION share/${PROJECT_NAME})
 

第四步:编译并运行

colcon build --packages-select cpp_ddsdemo
source install/setup.bash

ros2 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 文件
ROS2中,`ros2 launch`命令用于启动多个节点和配置功能。ROS1中的launch类似,ROS2launch也支持多节点同时启动配置。不同的是,ROS2launch支持三种配置方式:XML、YAML和Python。其中,Python格式的launch文件更加灵活,可以使用Python的函数库和访问ROS2可能没有公开的启动特性。使用`ros2 launch`命令时,可以通过`--screen`选项强制在终端窗口中显示所有节点的输出信息,而不保存在日志文件中。另外,节点的配置可以写在节点自身的启动文件内,群体启动文件内不需要关心节点自身的启动配置参数。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *3* [ROS2学习笔记(十)-- ROS2 launch启动文件](https://blog.csdn.net/aibingjin/article/details/124085093)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [ROS launch用法](https://blog.csdn.net/X_SANSHAO/article/details/89478455)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村北头的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值