笔记 / 返回列表

机器人系统

ROS 2 节点通信基础

从节点职责出发,梳理 ROS 2 的话题、服务、参数与动作,以及采用这些机制时的边界。

问题
从节点职责出发,梳理 ROS 2 的话题、服务、参数与动作,以及采用这些机制时的边界。
环境
ROS2 · rclcpp · Linux
状态
待发布
首次发布
2025年9月16日
最后更新
2026年8月10日
预计阅读
4 分钟

警告:历史笔记的适用范围 本文由 2025 年的学习记录整理而来,重点是通信模型而非某个固定发行版的安装命令。ROS 2 Foxy 已结束支持;新项目应选择仍受支持且与设备、PX4 和仿真器匹配的发行版,并以 ROS 2 官方安装文档 为准。

先划分节点职责

ROS 2 节点是独立运行的功能单元。一个节点应围绕一项清晰职责,例如读取传感器、估计状态、规划轨迹或驱动执行器。将节点拆分为可独立启动、观察和测试的单元,通常比把所有功能放进一个可执行文件更容易定位问题。

在 C++ 中,rclcpp 是常用客户端库。最小节点的生命周期是:初始化 ROS 上下文、创建节点和通信实体、进入 spin 处理回调,最后关闭上下文。日志应使用节点自己的 logger,便于按节点名和级别过滤。

rclcpp::init(argc, argv);
auto node = std::make_shared<rclcpp::Node>("telemetry_node");
RCLCPP_INFO(node->get_logger(), "node started");
rclcpp::spin(node);
rclcpp::shutdown();

四种常用交互方式

机制 数据方向与时序 适合的场景 常见误用
话题(topic) 发布者向任意订阅者异步发送 传感器、状态、周期性命令 把必须确认的请求做成话题
服务(service) 客户端请求,服务端返回一次响应 查询、一次性配置、短操作 在服务回调中阻塞长任务
参数(parameter) 节点配置的键值对 阈值、设备名、运行模式 用参数传输高频运行数据
动作(action) 目标、反馈、结果与取消 导航、机械臂动作等长任务 用服务替代需要取消和进度的任务

选择机制时先问两个问题:调用者是否需要确认结果,以及操作是否会持续较长时间。周期数据通常使用话题;短的请求—响应使用服务;需要进度、取消或最终结果的任务使用动作。

话题:先对齐名称、类型和 QoS

发布者和订阅者必须使用同一消息类型,话题名称也应在命名空间解析后保持一致。队列深度不是“可靠性开关”:它只决定本地可缓存的样本数量。对于控制、传感器和跨网络链路,还要显式评估 QoS 的可靠性、持久性与历史策略。

auto publisher = node->create_publisher<std_msgs::msg::String>("status", 10);
auto subscription = node->create_subscription<std_msgs::msg::String>(
"status", 10,
[](std_msgs::msg::String::ConstSharedPtr message) {
RCLCPP_INFO(rclcpp::get_logger("status_listener"), "%s", message->data.c_str());
});

用 ros2 topic list、ros2 topic info -v <topic> 和 rqt_graph 检查实际图结构。发现“收不到消息”时,先检查解析后的话题名、消息类型和 QoS,再检查节点是否持续运行。

服务、参数和动作的边界

服务端应快速返回;耗时工作可由服务接受请求后交给状态机、动作或后台任务处理。客户端在等待服务出现时应响应退出信号和超时,而不是无限阻塞。

参数在节点启动时声明,并通过 YAML 或 launch 文件注入。参数文件适合保存可审计的配置,不应包含密码、令牌或设备私有地址。动作的目标、反馈和结果应定义为稳定接口;客户端需要能处理服务端拒绝目标、取消请求和异常结束。

下一步

先用一个发布者和订阅者验证本机通信,再添加服务或动作,并把启动顺序、参数和命名空间写进 launch 文件。工作空间构建和测试命令见 ROS 2 工作空间编译与运行。PX4 与仿真器的版本匹配则见 PX4 与 Gazebo 仿真环境复现。

SEARCH / QUICK JUMP

搜索工程档案

↑↓ 选择 · Enter 打开 · Esc 关闭