通讯机制对比
| 特性 | ROS 2 | dc-zmq | dc-iox |
|---|---|---|---|
| 服务发现 | DDS 实现 | datacenter NameServer | iox2://discovery/services/ |
| Qos | 丰富的QoS策略 | 基本可靠性保证 | 需要手动实现 |
| 接口定义 | .msg 自动序列化 | .proto 手动序列化 | 固定结构体 |
| 中间件 | 可插拔的中间件实现 | zmq | iceorxy |
服务发现
通信中间件负责维护⼀个关于⽹络上所有活动节点、话题、服务和动作的动态⽬录。 当节点注册了发布者或订阅者后,通信中间件会⼴播这些信息,以便其他节点能够发现它们。 ⼀旦⼀个订阅者注册,通信中间件会查找与之匹配的发布者。 匹配基于话题名称和消息类型,以及任何附加的QoS策略。 如果找到匹配项,中间件将建⽴⼀个直接的连接,允许发布者和订阅者之间直接通信,⽽⽆需通过中⼼节点。
Qos
ROS 2 当前的基本QoS配置文件包括以下策略设置:
- History (历史):
- Keep last (仅保留最新): 仅存储最多N个样本,可通过队列深度选项进行配置。
- Keep all (全部保留): 存储所有样本,受底层中间件的资源限制配置的影响。
- Depth (深度):
- Queue size (队列大小): 仅在"history"策略设置为"keep last"时生效。
- Reliability (可靠性):
- Best effort (尽力而为): 尝试传递样本,但如果网络不稳定可能会丢失。
- Reliable (可靠传递): 保证样本被传递,可能会多次重试。
- Durability (持久性):
- Transient local (瞬态本地): 发布者负责为"后续加入"的订阅保留样本。
- Volatile (易失性): 不尝试保留样本。
- Deadline (截止时间):
- Duration (持续时间): 期望的两个连续消息发布到主题之间的最长时间。
- Lifespan (寿命):
- Duration (持续时间): 发布和接收消息之间的最长时间,而不会被视为陈旧或过期(过期消息会被悄悄丢弃,实际上永远不会被接收)。
- Liveliness (活跃度):
- Automatic (自动): 当节点的任何一个发布者发布消息时,系统将考虑所有发布者仍然存活另一个"租约持续时间"。
- Manual by topic (按主题手动): 如果发布者通过调用发布者API手动声明自己仍然存活,系统将考虑发布者仍然存活另一个"租约持续时间"。
- Lease Duration (租约持续时间):
- Duration (持续时间): 发布者在系统认为其失去活跃性之前必须指示自己仍然存活的最长时间段(失去活跃性可能是故障的指示)。
rclcpp node_interface
node 节点架构

rclcpp 中的 Node 类采用模块化架构,将功能委托给专门的接口。这种设计提高了代码组织性,并实现了更好的关注点分离。每个接口处理 Node 功能的特定方面:
| 接口 | 功能 |
|---|---|
| NodeBaseInterface | 核心功能(名称、命名空间等) |
| NodeGraphInterface | 与 ROS 图交互(发现) |
| NodeParametersInterface | 参数管理 |
| NodeTopicsInterface | 发布/订阅创建 |
| NodeServicesInterface | 服务/客户端创建 |
| NodeTimersInterface | 定时器创建和管理 |
常用节点方法
| Method | 目的 |
|---|---|
get_name() | 获取节点名称 |
get_namespace() | 获取节点命名空间 |
get_fully_qualified_name() | 获取带命名空间的名称 |
get_logger() | 获取日志实例 |
create_callback_group() | 创建回调组 |
create_publisher() | 创建主题发布者 |
create_subscription() | 创建主题订阅者 |
create_service() | 创建服务 |
create_client() | 创建服务客户端 |
create_wall_timer() | 创建系统时间定时器 |
create_timer() | 创建 ROS 时间计时器 |
declare_parameter() | 声明节点参数 |
get_parameter() | 获取参数值 |
set_parameter() | 设置参数值 |
ROS 图交互
节点参与 ROS 图,这是一个 ROS 要素的分布式网络。NodeGraphInterface 提供了发现和交互此图的方法。
cpp
// 获取全部主题
auto topics_and_types = node->get_topic_names_and_types();
// 统计指定 topic 上的发布者数量
size_t publishers = node->count_publishers("topic_name");
// 统计指定 topic 上的订阅者数量
size_t subscribers = node->count_subscribers("topic_name"); 与上下文相关联的 GraphListener 监视图的变化,并在变化发生时通知节点,从而实现动态发现。
rclcpp 接口分类
- 入口与聚合
- rclcpp.hpp — 便捷包含,汇总常用 API(Node、executors、time、参数、waitable 等)。
- 节点与上下文
- node.hpp — rclcpp::Node(节点的主要接口:创建 publisher/subscription/service/client/timer、参数、logger 等)。
- context.hpp、default_context.hpp — rclcpp::Context(跨节点共享的上下文)。
- 发布 / 订阅
- publisher.hpp、publisher_base.hpp、publisher_options.hpp
- subscription.hpp、subscription_base.hpp、subscription_options.hpp
- 通用/动态类型:
- generic_publisher.hpp
- generic_subscription.hpp
- serialized_message.hpp
- loaned_message.hpp
- 服务 / 客户端
- service.hpp
- client.hpp
- 创建辅助:create_service.hpp、create_client.hpp
- Timer / Rate / Executor / 回调执行
- timer.hpp、create_timer.hpp
- rate.hpp
- Executors:
- executor.hpp
- executors.hpp
- single_threaded_executor.hpp
- multi_threaded_executor.hpp
- static_single_threaded_executor.hpp
- CallbackGroups: callback_group.hpp
- 参数(Parameters)
- parameter.hpp、parameter_value.hpp
- 参数客户端/服务:parameter_client.hpp、parameter_service.hpp
- 工具:parameter_event_handler.hpp、parameter_events_filter.hpp
- Graph 与事件
- graph_listener.hpp
- Graph 接口:node_graph.hpp / node_graph_interface.hpp
- 事件机制:event.hpp、guard_condition.hpp
- Time / Duration / Clock
- time.hpp、clock.hpp、duration.hpp
- 等待 / WaitSets / Waitables
- wait_set.hpp、waitable.hpp、wait_result.hpp
- Wait set 策略实现位于 wait_set_policies/*
- QOS / 统计 / 回调相关
- qos.hpp、qos_event.hpp
- topic statistics:subscription_topic_statistics.hpp
- 内部/工具/内存策略/allocator
- 内存与策略:memory_strategies.hpp、memory_strategy.hpp、message_memory_strategy.hpp、rclcpp/strategies/*
- Allocator 支持:allocator_common.hpp、allocator_deleter.hpp
- Exceptions / Visibility / Macros / Utilities
- exceptions.hpp、exceptions.hpp
- visibility_control.hpp、macros.hpp
- utilities.hpp、function_traits.hpp、typesupport_helpers.hpp
- 实验性 / intra-process
- rclcpp/experimental/*:intra_process_manager, buffers, subscription_intra_process 等(用于进程内优化)。
- Node interfaces(模块化 node 功能)
- node_interfaces 下的多个头(node_topics.hpp、node_services.hpp、node_parameters.hpp、node_timers.hpp 等)把 Node 拆成小接口,便于测试/扩展。