文章目录
开发当中遇到的关键环境变量
bash
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export ROS_DOMAIN_ID=5
export ROS_LOCALHOST_ONLY=1
export CYCLONEDDS_URI='<CycloneDDS><Domain id="any"><Discovery><ParticipantIndex>auto</ParticipantIndex><MaxAutoParticipantIndex>220</MaxAutoParticipantIndex></Discovery></Domain></CycloneDDS>'
ROS_DOMAIN_ID
domain:领域
作用:设置 DDS 域号,相当于"通信房间号"。
只有同一域号的节点才会互相发现。
你设成 5,所以命令行工具(ros2 topic list)也必须在域 5 才能看到话题。
当在同一个局域网下的不同设备同时运行ROS2时,如果他们的ROS_DOMAIN_ID相同,可能会发生控制指令串掉的情况
ROS_LOCALHOST_ONLY
作用:是否只走本机回环网卡(lo)。
1 = 仅本机通信(更稳、更隔离)
0 = 可走局域网,与其他机器通信
单机调试,用 1 很常见。
RMW_IMPLEMENTATION
rmw_implementation
rmw:ROS Middleware(ROS 中间件)
implementation:实现
作用:选择 ROS2 用哪个中间件适配层(RMW),有以下两种
rmw_fastrtps_cpp (Fast DDS)
rmw_cyclonedds_cpp (Cyclone DDS)
什么是中间件适配层?
位于 ROS 2 核心代码和各种底层通信中间件(DDS 实现)之间。把标准化的 ROS 通信命令,翻译成不同中间件自己的语言。
ROS 2 的设计目标之一就是解除与特定通信库的绑定。没有这个适配层,ROS 2 就会像 ROS 1 那样,与 TCPROS/UDPROS 深度捆绑,无法灵活切换。

| 对比维度 | rmw_cyclonedds_cpp | rmw_fastrtps_cpp |
| DDS | Cyclone DDS | Fast DDS |
|---|---|---|
| 设计理念 | 简洁、稳定和高性能 | 功能丰富和高可配置性,对 OMG DDS 标准覆盖更全 |
| 在 ROS 2 中的角色 | 从 Humble 版起成为官方默认 RMW | Foxy 等早期版本的默认 RMW,目前仍是官方支持的核心选项 |
| 网络通信性能 | 跨主机通信延迟抖动更小,CPU 占用通常更低 | 网络通信性能同样优秀,但在高吞吐场景下 CPU 占用相对更高 |
| 进程内通信性能 | 主要优势在网络通信,进程内也具备良好表现 | 在单机共享内存场景下延迟更低,零拷贝优化更成熟 |
| 配置入口(环境变量) | CYCLONEDDS_URI 环境变量 |
FASTRTPS_DEFAULT_PROFILES_FILE 环境变量 |
| 配置风格 | 配置项相对精简,易于上手 | 配置项非常丰富,粒度极细,调优空间大 |
| 工具链与生态 | 精炼 | 丰富,拥有 Vulcanexus 集成平台等生态工具 |
| 资源占用 | 内存和 CPU 占用通常更低,适合资源受限平台 | 功能全面,基准资源占用相对略高 |
| 适用场景 | 多机通信、嵌入式平台、对稳定性要求高的系统 | 单机大数据量通信、需要完整 DDS 功能覆盖或商业工具链支持的场景 |
这里设成 rmw_cyclonedds_cpp,就是强制使用 CycloneDDS。
不一致后果:A 节点用 Cyclone、B 节点用 FastDDS,可能互相发现不到。
CYCLONEDDS_URI
与内存管理之间的联系---关键
-
配置共享内存 传输(零拷贝通信):这是最直接的内存相关配置。如果要启用基于 iceoryx 的共享内存(零拷贝通信),就需要在 CYCLONEDDS_URI 指定的 XML 文件里配置 < SharedMemory > 部分,比如 < Enable >true</ Enable >。启用后,数据的传输延迟和CPU占用会大幅降低,而不是直接消耗应用内存
-
调整内部缓冲区 大小:CycloneDDS 内部有很多用于数据可靠性、流量控制的缓冲区,它们的大小都可以在配置文件里调整。
例如,< Internal >< Watermarks >< WhcHigh > 可以控制发送端缓冲区的高水位线如果消息很大或数据量突发,这些缓冲区的设置会直接影响进程的内存占用。
-
自定义内存分配器(换掉malloc):CycloneDDS 允许用户通过 API 来替换默认的内存分配和释放函数(malloc, free等)。但这属于代码级别的设置,不能通过 CYCLONEDDS_URI 配置文件来修改。
-
启动时的内存需求(配置MaxAutoParticipantIndex):MaxAutoParticipantIndex 配置,主要是为了应对多节点启动,但更大的索引范围意味着 CycloneDDS 启动时会预留稍多的内部资源。
作用:给 CycloneDDS 传 XML 配置(高级参数)。
这段主要做了两件事:
ParticipantIndex=auto:参与者编号自动分配
MaxAutoParticipantIndex=220:自动分配参与者编号时的上限值提高到 220,避免"participant index 不够用"报错
在 DDS(数据分发服务)里,每个创建了数据读写能力的节点就叫一个"参与者"(Participant)。每个参与者需要一个唯一编号来互相识别和通信,这个编号就是"参与者索引"(ParticipantIndex)。
当启动的节点很多的时候,在launch文件加上一下内容,可以防止多阶段创建失败
python
# 提高 CYCLONEDDS_URI 自动参与者索引上限,避免多节点同时启动时域创建失败
SetEnvironmentVariable(
name='CYCLONEDDS_URI',
value='<CycloneDDS><Domain id="any"><Discovery><ParticipantIndex>auto</ParticipantIndex><MaxAutoParticipantIndex>120</MaxAutoParticipantIndex></Discovery></Domain></CycloneDDS>'
),
其他环境变量
ROS_DISTRO = humble
ROS_VERSION = 2
AMENT_PREFIX_PATH:包查找路径(ros2 run根据此查找)
CMAKE_PREFIX_PATH:cmake查找路径
LD_LIBRARY_PATH:动态连接库查找路径
PYTHONPATH:python包查找路径
ROS_LOG_DIR:日志文件
ROS_DEBUG:调试输出(1时启用)