ROS2当中的几个关键的环境变量

文章目录

开发当中遇到的关键环境变量

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

与内存管理之间的联系---关键

  1. 配置共享内存 传输(零拷贝通信):这是最直接的内存相关配置。如果要启用基于 iceoryx 的共享内存(零拷贝通信),就需要在 CYCLONEDDS_URI 指定的 XML 文件里配置 < SharedMemory > 部分,比如 < Enable >true</ Enable >。启用后,数据的传输延迟和CPU占用会大幅降低,而不是直接消耗应用内存

  2. 调整内部缓冲区 大小:CycloneDDS 内部有很多用于数据可靠性、流量控制的缓冲区,它们的大小都可以在配置文件里调整。

    例如,< Internal >< Watermarks >< WhcHigh > 可以控制发送端缓冲区的高水位线如果消息很大或数据量突发,这些缓冲区的设置会直接影响进程的内存占用。

  3. 自定义内存分配器(换掉malloc):CycloneDDS 允许用户通过 API 来替换默认的内存分配和释放函数(malloc, free等)。但这属于代码级别的设置,不能通过 CYCLONEDDS_URI 配置文件来修改。

  4. 启动时的内存需求(配置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时启用)

相关推荐
AI科技星4 小时前
【无标题】
人工智能·决策树·机器学习·数据挖掘·机器人
RichExplorer4 小时前
(1)从零开始搭建具身智能——概念理解与系统结构
人工智能·机器人
研究点啥好呢6 小时前
海康威视 机器人嵌入式软件工程师 面试题精选:10道高频考题+答案解析
ai·面试·机器人·自动化·求职招聘
辰尘_星启6 小时前
【ROS2】 Python 节点的开发流程
开发语言·python·机器人·系统·控制·ros2
WangN26 小时前
【SONIC】Isaac Lab 系统入门指南
人工智能·python·机器人·自动驾驶·仿真
沫儿笙6 小时前
库卡机器人二保焊混合气节气装置
网络·人工智能·机器人
勤自省6 小时前
ROS2从入门到“重启解决”:21讲8~12章踩坑血泪史与核心总结
linux·开发语言·ubuntu·ssh·ros
Gerardisite7 小时前
CRM、ERP、OA 如何连接企业微信?QiWe 提供标准化解决方案
java·python·机器人·自动化·企业微信
派勤电子8 小时前
2026工控机在轨道交通机器人中怎么用?核心场景 + 选型要点 + 真实案例全解析
机器人·机器人控制·机器人工控机·机器人控制工控机·轨道交通机器人·高铁机器人·巡检机器人工控机