Fast DDS、Cyclone DDS与OpenDDS:开源DDS选型对比与实战指南
2026/9/9 4:28:57 网站建设 项目流程

聊DDS(Data Distribution Service)之前,先问一句:你是不是因为ROS2才认识它的?如果是,那很正常。ROS2把DDS从工业实时中间件变成了机器人、自动驾驶、分布式仿真领域的高频词汇,而开源实现里大家能叫上名字的,基本就是Fast DDS、Cyclone DDS和OpenDDS这三家。

这三个都是“开源DDS实现”,但此“开源”和彼“开源”差别很大:许可证不同、代码架构不同、性能取向不同、踩坑姿势也完全不同。我过去在几个车载域控、分布式仿真和机器人项目里来回切过这三套中间件,踩过的坑不算少。这篇文章我不会给你背官方文档,而是把选型、原理、实操、排障这些真实经验整理成一套可以照抄的方案。

文章内容比较长,适合这几类人:准备在ROS2里换中间件的人、在嵌入式或车载平台给下位机选DDS的人、被QoS搞到怀疑人生的人,以及做开源技术调研想快速横向对比的人。看完你会明白:选型这件事没有绝对最优解,关键看你把“功能完整、性能、工程沉淀”这三件事排成什么优先级。

1. 三大开源 DDS 实现全景概览与身世速览

1.1 DDS是什么?三句话讲清原理

DDS全称Data Distribution Service(数据分发服务),是一套由OMG组织维护的规范,核心是你一定听过的发布订阅模型,但它的发布订阅是用RTPS协议直接做点对点通信,不需要中心broker。这一点跟MQTT、Kafka有本质区别:没有单点,也就少了“消息服务器挂了全链路瘫痪”这类问题,代价是配置和排障难度也相应抬升。

整个模型可以简化成四个实体:DomainParticipant、Topic、Publisher/DataWriter、Subscriber/DataReader。一个节点先加入一个Domain(域),Domain ID决定了网络隔离的边界;然后在Topic上声明自己发布或订阅哪种类型;再通过QoS策略控制数据可靠性、历史数据保留、截止时间等行为。数据流看起来是“Publisher → Topic → Subscriber”,实际传输在RTPS协议层是DataWriter和DataReader之间直接完成。

为什么DDS特别适合实时分布式系统?因为它把“什么时候发、发几份、丢了怎么办、迟到的人还能不能看历史”这些问题都明明白白地做成了QoS参数。比如RELIABILITY策略告诉它对端掉数据要不要重传,DURABILITY策略告诉它后加入的订阅者要不要补发历史数据。这种按需配置的能力,是它比普通消息中间件更适合机器人实时控制和工业现场的关键。

这里需要补一句:如果你只是做Web后端消息推送,DDS不是最优选择,MQTT/Kafka上手成本低得多。DDS的强项是实时、确定性、多节点对等通信,这也是为什么ROS2、车载系统、电力监控这类强实时场景里能看到它的身影。

1.2 三个项目的身世与定位

Fast DDS是eProsima公司的产品,最初叫FastRTPS,后来为了强调对完整DDS规范的支持改名为Fast DDS。它之所以认知度最高,是因为ROS2默认使用它的RMW实现(rmw_fastrtps_cpp),相当于“ROS2的亲儿子”。功能上走的是大而全路线:QoS全覆盖、UDP/TCP/SHM多传输、XML配置、安全、统计监控都有,配套Fast DDS Gen、Fast DDS Monitor等工具链。许可证是Apache 2.0。

Cyclone DDS出身于PrismTech/ADLINK,后来贡献给Eclipse基金会,目前由Eclipse维护。它的核心是一个极简的C语言实现,第三方依赖极少,设计目标是高性能和可移植性。在不少公开实测里,小消息延迟和稳定性都明显优于Fast DDS默认配置。配套有ddsperf性能测试工具、C++绑定、Python绑定。许可证是EPL-2.0(Eclipse Public License 2.0)。

OpenDDS是OCI(Object Computing, Inc.)维护的老牌实现,最早基于ACE/TAO这套CORBA基础设施构建,所以工程上处处带着CORBA时代的印记:先装TAO、再用MPC生成工程文件、再编译,配置方式比较重。但它的稳定性和功能完整性经过了大量存量项目验证,同时支持C++和Java两套API。许可证宽松,近似Apache 2.0,商用友好。

1.3 一张表看全三个实现

先上对比表,后面再逐项展开:

对比维度Fast DDSCyclone DDSOpenDDS
维护方eProsimaEclipse基金会OCI
核心语言C++C(有C++/Python绑定)C++ / Java
许可证Apache 2.0EPL-2.0宽松自定义许可(类似Apache 2.0)
ROS2接入rmw_fastrtps_cpp(默认)rmw_cyclonedds_cpprmw_opendds(社区维护,更新慢)
文件类型生成Fast DDS GenIDL编译器/cyclonedds的idlctao_idl + opendds_idl
核心监控工具Fast DDS Monitorddsperfdcpsinfo.pl等
上手难度中等低到中等
性能取向功能全,SHM单机吞吐强延迟低、稳定工程稳,性能中规中矩

表格之外还得说点大实话:Fast DDS的优势不只是“ROS2默认”,它的文档、示例、商业支持体系在开源DDS里是做得最齐的,出了问题拼命搜总能搜到答案;Cyclone DDS胜在使用简单和性能,但有些边缘特性要自己查代码或者看更新日志;OpenDDS对新项目来说门槛偏高,但如果你要做Java接入或者有大量存量ACE代码,它仍然是不可替代的选项。

2. 架构设计与技术路线:为什么长得完全不同

2.1 Fast DDS:为了ROS2工程化而生的完整实现

Fast DDS内部设计是按“大而全”来的。跑一个简单pub/sub它要处理的模块比另外两家多不少:发现模块、安全模块、统计监控模块、持久化模块、一堆传输栈。代码里还支持动态发现和静态发现、Discovery Server集中发现模式、以及基于共享内存的Data Sharing特性。这些能力让它在复杂工程里非常能打,但也意味着内存占用高、启动时间偏长,某些默认配置下延迟抖动比Cyclone明显。

我自己做车载域控原型时,对Fast DDS最大的感受是:它像一把功能齐全的瑞士军刀,每个场景的礼仪都有对应工具。比如跨VLAN时用Discovery Server,单机高频点云用Data Sharing,需要审计时打开statistics统计。但也正因为可配置项太多,很多性能问题其实是配出来的,而不是跑出来的。

2.2 Cyclone DDS:以“极简”换性能

Cyclone DDS走的是完全相反的路。核心C实现依赖极少,内存占用一开始就只有Fast DDS的一部分。它对RTPS协议栈的裁剪更干净,多线程模型没有那么多花活,因此常见的小消息低延迟场景下,Cyclone的延迟数值和抖动都比Fast DDS默认配置好看。

这里有个反直觉的点:Cyclone功能少吗?并不少。它支持DDS标准里绝大多数常用策略,XTypes支持也不错,C++绑定(cyclonedds-cxx)和Python绑定都维护得很好。只是因为核心简单,学习路径反而平缓,代码里暴露出来的概念也少,上手很快,官方还提供了ddsperf这个非常好用的性能基线工具。

2.3 OpenDDS:背着ACE/TAO的老牌选手

OpenDDS不能简单说“古老”或者“落后”。它把跨平台能力做到了极致,能在很多老操作系统上编译运行,这在工业现场很重要。代价就是工程结构臃肿:要配置ACE_ROOT、DDS_ROOT、MPC_ROOT,构建脚本是perl那一路,第一次搭环境很容易劝退。

它另外一个隐形资产是Java支持。如果你手里有一套Java系统需要做DDS接入,OpenDDS几乎是开源方案里最顺手的(Fast DDS的Java绑定相对不常用,Cyclone的Java绑定不是官方维护的重点)。它的稳定性和内存使用在长时间运行下表现也不错,社区比较“老派”,但足够靠谱。

2.4 三条技术路线为什么会分岔

理解了三个项目的出身,很多问题就豁然开朗。Fast DDS的目标用户是ROS2和商业客户,商业公司追求的是“功能覆盖全面、出了问题有人能兜底、工具链完整”,所以它必然会偏向“所有功能我都给你,你自己选”。Cyclone DDS目标是做一个高性能、低成本的内核,所以它能砍的都砍掉,换来性能和纯净度。OpenDDS诞生于CORBA时代,面对的是老牌工业用户,它们对“新潮”不敏感,对“不破坏存量系统”非常敏感。

所以你在选型时,本质上不是选“更好的DDS”,而是选“更适合你团队和项目阶段的技术路线”。这是所有DDS对比里最容易被忽略、却最影响长期幸福感的一件事。

3. 核心机制实操:QoS、发现、传输、安全

3.1 QoS三件套:RELIABILITY、DURABILITY、DEADLINE怎么配才不踩坑

先放结论:绝大多数第一次用DDS的人,第一个坑都出在QoS。三套实现里QoS概念是通用的,但API命名、默认值、XML配置格式完全不同。

第一件套RELIABILITY。RELIABLE模式下,接收方需要发送ACK/NACK,发送方发现丢包会重传,这就保证了“无损”,但是代价是延迟和吞吐受到回执链路和等待逻辑影响。BEST_EFFORT模式收到多少算多少,丢包由上层自己处理,适合摄像头、点云、IMU这类高频且单帧价值有限的传感器数据。

第二件套DURABILITY。它决定一个后加入的Subscriber能不能看到“历史数据”。默认VOLATILE表示不保留任何历史,只有订阅时点之后新发布的数据才能收到。TRANSIENT_LOCAL会把最近的历史缓存在DataWriter本地,晚订阅的人加入后能补到一份。ROS2调试时如果想用ros2 topic echo看到last message,可以在订阅侧用上transient_local这类DURABILITY,否则经常出现“echo开了但等不到消息”的尴尬。

第三件套DEADLINE。它设一个业务上可接受的最大数据间隔,比如控制周期要求50ms,那DEADLINE就设50ms。如果对端超过这个时间没发数据,DDS就会报告Missed deadline,这样你可以把“节点卡死”变成可监控、可告警的事件,而不是等业务代码自己去猜。这个策略在实时控制里非常实用,配合LIVELINESS(检测节点心跳)基本能覆盖故障检测需求。

再补一个常见误解:QoS不兼容未必是“完全不匹配”,有时候只是差一个DURABILITY等级,导致Subscriber侧一直没有数据。排查的时候不要把目光只放在RELIABILITY上,DURABILITY和HISTORY(KEEP_LAST/KEEP_ALL)也同样重要。

3.2 发现与传输:为什么跨网段总是发现不了节点

DDS默认用UDP多播做发现,即SPDP(简单参与者发现协议)和SEDP(简单端点发现协议)两次握手。所有节点会向同一个多播地址(默认239.255.0.1)喊“我来了”,然后交换各自的Topic、QoS、地址信息,最后建立直连传输链路。

这带来一个非常经典的实操问题:同网段一切正常,跨VLAN、跨路由后全部失联。因为路由器默认不转发多播,多播发现自己就失效了。解决方法基本三个方向:

  • 在配置里指定Unicast发现地址,让节点主动去连固定的几个peer,而不是等广播。
  • 用中心化发现服务,比如Fast DDS的Discovery Server,适合节点多、网络复杂的场景。
  • 跨网段场景直接把传输切换成TCP,规避UDP多播依赖。

我平时遇到最多的情况,是ROS2多机部署时“ros2 topic list能看到但消息收不到”,先别怀疑代码,先怀疑发现协议:多播通不通、端口放没放、单播peer配没配。这个话题后面在排障部分还会细说。

关于传输层再补一句:多个进程在同一台机器上,可以走共享内存(SHM)。Fast DDS的Data Sharing、Cyclone的Iceoryx集成都是为了这个场景。共享内存不是跨机器魔法,多机之间必须走UDP/TCP,性能瓶颈就在网络。

3.3 DDS Security:需要时怎么配

DDS Security是DDS标准簇里的一个规范,包含认证、访问控制、加密三块。三个开源实现都支持,但配置体验差异很大,而且一旦开了安全,性能开销和证书管理成本都会明显上升。

Fast DDS的安全文档和示例是三者里最丰富的,借助XML配置可以做到“相对无侵入”地打开:设置好证书和权限文件路径,配置插件,启动后节点自动做TLS类似的握手和加密。OpenDDS也支持DDS Security,但配置过程更老派,通常和ACE的证书体系绑定。Cyclone DDS在新版本里也支持,编译时需要开启SSL支持,使用相对少。

我的建议是:内网且节点可控的项目,先别急着上DDS Security。DDS本身的域隔离、网络ACL、物理隔离已经能挡住大部分风险。安全特性真正发光的场景是设备跨公网/半信任网络、或者监管审计要求明确的地方。真要用,优先考虑Fast DDS或OpenDDS,先把文档啃一遍再上,别直接拿Cyclone上手。

3.4 从IDL到代码:三套工具链的体验差异

DDS开发绕不开IDL。你用IDL定义一个消息结构,比如struct NavData { long id; double x; double y; };,然后通过各家代码生成器生成对应的编程语言源代码。

Fast DDS用Fast DDS Gen生成C++代码,生成后可以编译成静态/动态库,示例工程是CMake。Cyclone DDS也有自己的IDL工具,还支持一套比较现代的C++ API,体验上比老一代舒服。OpenDDS生成代码的步骤长一些,涉及tao_idl、opendds_idl多个步骤,但文档里写得很清楚,照做就行。

这里有个很实用的经验:如果项目用的是纯DDS(非ROS2),IDL定义尽量写成最基础的类型和结构,别用什么稀奇古怪的别名和自定义复杂类型。这样三个实现之间的互操作性会好很多。类型太花哨的话,严格遵守规范的XTypes也可能会给你来点“类型不匹配”的惊喜。

4. 性能实测与调优开关:数据差异其实很大

4.1 先看量级:三种实现的性能画像

性能是选型的核心指标,但网上benchmark鱼龙混杂,我建议把下面这张表当成“量级参考”而不是“精确结论”。实测环境不同(CPU型号、网卡、内核参数、QoS配置)数据差异很大,但相对趋势基本稳定。

测试项(典型量级)Fast DDSCyclone DDSOpenDDS
100字节小消息单跳延迟150~300µs50~150µs200~400µs
1KB消息单进程pub/sub吞吐较高,开启SHM后很猛高且稳定中等
50个节点内存占用中高
跨网段配置难度中(有Discovery Server)中(XML配peer)较高
大消息(>1MB)稳定度需要调优,否则容易分片启动表现较好需要调优

如果你只是做原型验证,这几个量级差异其实感觉不明显,真正拉开差距的是节点变多、消息变大、网络变差以后。

4.2 影响性能的几个隐藏因素

先提第一个:是否走RELIABLE。RELIABLE模式下,每一条数据都要ACK/NACK确认,在某些实现里默认还会等待重传窗口,延迟容易翻倍或者触发“NACK风暴”。图像、点云、IMU这类高频且允许少量丢包的数据,我用BEST_EFFORT居多;控制指令、状态机切换才用RELIABLE。

第二个隐藏因素是发现流量。节点数量少的时候看不出来,节点到了几百个级别,SPDP/SEDP的心跳消息会占用不少带宽和CPU。这时候要么用静态发现、要么用中心化发现,把所有参与者的地址和Topic都收敛到发现服务里。

第三个因素是UDP MTU。默认以太网MTU 1500字节,超过这个尺寸的DDS消息会被UDP层分片,分片丢失会导致整包重传,大消息场景性能会肉眼可见地下降。对大于几十KB的消息,我倾向于开启共享内存(单机)或者用TCP(跨机),尽量避免大UDP分片。

第四个因素很多人会漏:序列化和反序列化开销。DDS默认的CDR序列化是标准的,但如果你在回调里做了复杂解码,瓶颈并不在中间件本身。做性能测试前,先只做“原样转发”的冒烟测试,把中间件的基线打出来,再往上叠业务逻辑,这样定位问题才有坐标。

4.3 常用调优手段与注意事项

调优我是有固定套路的。第一步永远是先跑一遍ddsperf之类的中立工具,拿到这个机器、这个网络上中间件的“裸数据”。第二步再结合场景做配置调整,每次只改一个变量。

单机场景,优先开启共享内存。Fast DDS可以开启Data Sharing,Cyclone可以结合Iceoryx。实测下,单机高频点云这类消息,共享内存带来的延迟降低和CPU下降非常可观。

跨机场景,先检查网卡多队列和中断绑定,把网卡队列数、CPU核数对应起来,减少中断都堆在一个核上的情况。之后可以适当调大socket缓冲区,尤其是高带宽场景。再不行就考虑把传输层从UDP切到TCP,虽然TCP初始化握手慢,但长稳传输和大消息场景往往更可控。

还有两个偏工程细节:一是把应用日志级别调低,很多DDS库都支持运行时修改日志级别,把它调到WARN以上,能减少大量日志对磁盘和CPU的消耗;二是确认节点没有创建大量“看不见”的隐式Publisher/Subscriber。有些框架会在你不知道的时候默默创建和销毁实体,再叠加自动发现,就是性能雪崩的开始。

5. 选型建议与ROS2换栈实操:不换一次你不会死心

5.1 按场景选型:别只看benchmark

好多朋友一上来就问我“哪个性能最好”,我的回答基本都是:先回答你的场景是什么。

  • 如果你在做ROS2机器人或者自动驾驶原型,默认Fast DDS就行,遇到性能瓶颈再切Cyclone。毕竟ROS2大多数文档、教程、官方镜像都是以Fast DDS为基准的,出了问题好查。
  • 如果你是做大规模分布式仿真、多语言客户端混合接入、或者IoT边缘节点,Cyclone DDS的小内存和低延迟优势会逐渐放大。
  • 如果你必须对接Java系统,或者项目有大量存量OpenDDS代码,那也别纠结,OpenDDS就是你的答案。
  • 如果你做商用产品且看重商业兜底,可以优先考虑Fast DDS(eProsima提供商业支持)或OpenDDS(OCI提供支持),找老牌服务商比找“最新鲜”的项目更稳。
  • 如果公司或客户对开源许可证敏感,建议把Fast DDS的Apache 2.0、Cyclone的EPL-2.0、OpenDDS的自定义license的条款都过一遍,再找法务确认一下,尤其是EPL对修改后源码开放的要求。

还有一个被低估的维度是团队学习曲线。新团队或者学生团队,我先带他们用Cyclone,概念干净、API简单,容易建立正确的DDS心智模型;商业项目团队则更惯用Fast DDS,因为文档全、网络上有大量现成的问题答案。

5.2 ROS2中间件切换:5分钟从Fast DDS换到Cyclone DDS

ROS2一个近乎“作弊”的优势是RMW抽象层,中间件可以运行时切换。我做性能对比时经常在同一套代码里来回切。下面以Ubuntu + Humble为例:

# 安装Cyclone RMW插件 sudo apt install ros-humble-rmw-cyclonedds-cpp # 设置环境变量 export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

之后启动任何ROS2节点都会使用Cyclone DDS。为了省事,可以把它写进.bashrc,但我个人建议只在需要的终端里export,避免全局切换后一些按Fast DDS调过参的包出现意外。

验证是否生效:

ros2 doctor ros2 topic list ros2 topic info -v /your_topic

换完之后你很可能遇到一个经典现象:所有节点必须用同一个RMW,否则会出现“topic能发现、数据不通”的情况。因为ROS2在RMW层做了TypeHash和额外配置,跨RMW互操作不是默认保证的。多机部署时尤其要注意,每台机器都要统一RMW实现。

5.3 Fast DDS向Cyclone DDS迁移的兼容性经验

纯DDS场景,Fast DDS和Cyclone DDS理论上可以通过RTPS互操作,但工程上不要默认“无缝对接”。两个项目对QoS默认值、序列化细节、XML配置格式都有差异。

我建议这样迁移:先把全部QoS显式声明,别再依赖任何一家的默认值。尤其注意RELIABILITY、DURABILITY、HISTORY depth、DEADLINE这些策略,两边名字可能一样,但默认值和对端兼容逻辑不一定一样。XML配置不要直接复制,Fast DDS的profile schema和Cyclone的XML格式完全是两套体系,需要重写。然后跑一轮ddsperf,把切换前后的延迟、吞吐基线记录下来,用数据说话,而不是凭感觉说“好像变快了”。

如果你是从OpenDDS迁到Fast DDS或Cyclone,那工作量更大:API模型、构建工具、配置文件全都要换。实际项目中,如果不是有硬性理由,比如OpenDDS与企业老系统深度绑定,建议直接新项目用新栈,而不是强行迁移。

6. 常见问题与排查技巧实录:那些年我踩过的坑

6.1 跨机发现失败:先别怀疑代码,先查网络

这是分布式DDS的第一大拦路虎。现象五花八门:A机器能看到自己的topic,B机器死活看不到;或者两边都能看到topic,但数据就是不来。

排查顺序我建议固定下来:

  1. 先ping通,确认网络层正常。
  2. 查防火墙和端口。DDS默认UDP多播端口7400-7500左右(具体看实现),很多环境下防火墙会拦。
  3. 确认多播可用。在局域网里用ping -t 239.255.0.1或者抓包工具看有没有多播包。
  4. 如果跨VLAN或路由器禁多播,立刻切换到单播peer配置。

Fast DDS可以在XML profile里配置initial peers列表,把对端IP和端口写死。Cyclone DDS通过CYCLONEDDS_URI指定XML配置文件,里面写<Peers><Peer address="192.168.1.21"/></Peers>。有了固定的单播peer,多播依赖就没了,跨网段基本能通。

6.2 QoS失配:报错只说了匹配失败,原因怎么找

第二种高频问题是QoS失配。DDS实现通常会告诉你“发现了一个Endpoint,但QoS不兼容”,却不告诉你具体哪个策略不兼容。这时候只能手工对比。

我做过最笨也最有效的方法:把发布端和订阅端的QoS全部打印出来,列表对比。优先看RELIABILITY、DURABILITY、HISTORY depth、DEADLINE这四项。在ROS2里,ros2 topic info -v /topic就能直接看到话题两侧配置的QoS,对比非常方便。

一个常见的场景是:订阅端为了不丢控制指令,把RELIABILITY设成RELIABLE;发布端传感器为了省延迟,默认BEST_EFFORT。结果发现,“明明在同一个topic上,为什么收不到?”就是因为二者不兼容。DDS对不兼容的策略采取“拒绝匹配”的严格态度,这其实是好事,总比悄悄丢数据好。

6.3 延迟忽高忽低:优先查这几个点

延迟抖动是实时项目最容易让人崩溃的问题。我的经验是,优先按这四个方向查:

  • 是不是UDP分片。看消息尺寸,超过MTU的分片最容易导致抖动,尤其是RELIABLE模式下,一个分片丢了,整个大包重传。
  • 是不是跨机传输。单进程或同机进程间通信,如果没开SHM,就会走网卡绕一大圈,延迟必然差一个量级。
  • 是不是CPU争抢或中断偏斜。检查网卡中断落在哪个核上,检查节点进程有没有绑核,必要时做CPU affinity。
  • 是不是RELIABLE重传风暴。在弱网环境下,NACK/ACK来回飞,延迟可能成倍增长。

如果抖动只出现在运行一段时间后,还要怀疑是不是内存越界或句柄泄漏导致进程越来越卡。用topfree,以及DDS库自带的统计接口,把系统资源和中间件资源一起盯住。

6.4 排查速查表

为了节省大家排障时间,我把能想到的常用症状和方向整理成一张速查表:

症状首要排查方向处理建议
跨机发现不到节点多播/路由/防火墙ping测通,查端口,配单播peer
话题能看到但收不到数据RMW不一致或QoS不兼容统一RMW,对比QoS
后加入的订阅者拿不到数据DURABILITY为VOLATILE发布端设置TRANSIENT_LOCAL等
延迟持续偏高跨机未用SHM/UDP分片单机开SHM,大消息用TCP
延迟间歇性飙升NACK重传/CPU争抢检查丢包率、绑核、中断绑定
内存持续增长实体泄漏/隐式Publisher/Subscriber检查周期性创建/删除的实体
多机部署后CPU占用暴涨发现协议风暴静态发现或Discovery Server

这张表不能覆盖所有情况,但能覆盖80%的现场问题。剩下的20%,大概率需要抓包分析RTPS协议,用Wireshark打开带DDS解析插件的数据包,看握手、心跳、数据帧的细节。

7. 写在最后:我的选型心得与踩坑记录

最后说点个人体会。我最早接触DDS是从ROS2开始的,当时默认Fast DDS用得很顺手,觉得“够了”。第一次被打脸是车路协同类项目,需要20多台设备跨网段协同,Fast DDS默认发现方式经常出现某台节点要等几十秒甚至直接失联,排查到最后全是网络和发现配置的问题。后来切换到Cyclone DDS,同样的网络条件,发现速度和稳定性都有明显改善,那一次让我对“默认实现”和“最优实现”的差距有了直观认识。

但反过来,在单机高频点云和图像消息的测试里,Fast DDS开启共享内存(Data Sharing)后的吞吐表现又非常亮眼,Cyclone如果不开Iceoryx就可能被比下去。所以我现在做新项目的基本套路是:ROS2层保持RMW可切换,设计初期把Fast DDS和Cyclone DDS都装好,性能摸底时用ddsperf把两边的基线拉出来,再基于实际数据做决定。OpenDDS则保持在“老项目对接”的位置上,不太会主动给新项目引入。

如果你刚接触DDS,还没被QoS毒打过,我的建议只有一条:别急着选型,也别急着调参,先把RELIABILITY、DURABILITY、DEADLINE、HISTORY这几个QoS策略抠明白。DDS的所谓“难用”,90%以上都来自对QoS和发现机制的理解偏差,等这两块通了,选型反而是最简单的事。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询