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时启用)

相关推荐
zzzzzz3106 天前
假如我是掘金管理员,我先给评论区装个'代码审查'系统
python·程序员·机器人
通信小呆呆7 天前
当算法有了“五感”:多模态数据融合如何向人体感官协同学习?
人工智能·学习·算法·机器学习·机器人
生成论实验室7 天前
机器人:一个自主运动的系统
人工智能·算法·语言模型·机器人·自动驾驶·agi·安全架构
Dick5077 天前
ROS2 常用命令表
人工智能·学习·算法·机器人
沫儿笙7 天前
川崎机器人二保焊节气设备
人工智能·机器人
C++ 老炮儿的技术栈7 天前
Qt工控实战:自研机器人TCP长连接客户端(粘包处理+心跳保活+自动重连完整源码解析)
qt·tcp/ip·机器人
Deepoch7 天前
VLA多模态架构加持 采摘机器人实现精细化智能采收
人工智能·机器人·开发板·具身模型·deepoc·采摘
选与握7 天前
$\pi_{0.7}$: 一个具备涌现能力的可引导的通用机器人基础模型
机器人·vla·pi07
梦想的旅途27 天前
企业微信外部群自动化:一期交付应聚焦双向会话闭环
java·开发语言·机器人·自动化·maven·企业微信