ROS2 DDS作用域

ros2的环境变量ROS_DOMAIN_ID,继承DDS体系,域是链接共享相同与ID的所有应用程序的全局数据空间,域彼此独立,DDS应用程序在一个域内发送和接收数据。一个网络可以有多个不同的域,一个域可以跨不同的网络。同域可以自由发现并相互发送消息,不同域则不能。默认以0作为域ID。避免同一网络上运行ROS2不同计算机组之间的干扰,可以为不同组发送不同域ID。

1
2
export ROS_DOMAIN_ID 21
ros2 node list -a

通过程序rclcpp或者rclpy可以设置ID,以下为rclcpp设置域ID

1
2
3
4
5
6
7
8
9
10
11
12
#include <memory>
#include "rclcpp/rclcpp.hpp"
#include "ch2_node_cpp/node2go.hpp"
int main(int argc, char** argv)
{
rclcpp::InitOptions init_option;
init_option.set_domain_id(100);
rclcpp::init(argc, argv, init_option);
auto node2go = std:: make_shared<ros_beginner::Node2Go>("cpp_node");

std::cout << node2go->get_node_options().contest()->get_domain_id()<<std::endl;
}

ROS2声明周期节点

2025-09-22-165926.png

ROS2实时

1️⃣ 非实时内核 ROS 2

  • 操作系统:普通 Linux 内核(Ubuntu、Debian 等)
  • 特点
    • 调度不保证严格的时间约束
    • 节点和话题的发布/订阅存在延迟抖动
    • 对大部分机器人任务足够(导航、感知、控制低速运动)

2️⃣ 实时内核 ROS 2

  • 操作系统:Linux 内核打上 PREEMPT_RT 补丁
  • 特点
    • 内核可抢占,保证任务在确定时间内执行
    • 低延迟、低抖动,适合高频控制任务
    • 支持硬实时控制(机械臂、无人车、电机驱动)
维度 非实时内核 ROS 2 实时内核 ROS 2
内核 普通 Linux PREEMPT_RT / RTOS
调度 非严格 严格、低延迟
适用场景 感知、导航、低速控制 高速伺服、闭环控制、机械臂
优点 开发简单,兼容性好 控制精度高、延迟抖动低
缺点 延迟不可控 开发复杂,第三方包可能不完全兼容