0. 前言
Github 仓库链接:Hikvision Camera ROS2 package
0.1 问题背景
上一篇[博客](【图像与点云融合教程(四)】海康相机 ROS2 功能包 - 古月居 (guyuehome.com))介绍了我开源的海康相机 ROS2 功能包,在本地机器上可以实时订阅和发布图像消息,但是在通过局域网进行多机通信的测试时,PC 端收不到边缘端发布的图像消息,不过可以通过 ros2 topic list
查看到图像话题是存在的。
经过查询资料,这主要是由于 DDS 的不同实现的实时性和可靠性存在不同。
0.2 ROS2 下的 DDS 的不同实现
以下是一个简单的表格,介绍ROS 2中四种不同的DDS实现:Fast DDS、OpenSplice DDS、Connext DDS和Eclipse Cyclone DDS。
DDS实现 | 介绍 | 优点 | 缺点 |
---|---|---|---|
Fast DDS | - 前身为Fast RTPS,是ROS 2中默认的DDS实现。 | - 高性能和可靠性。<br>- 支持大规模的分布式系统。<br>- 配置灵活,易于集成。<br>- 开源免费。 | - 部分功能可能仍在演进中。<br>- 可能需要一些时间来适应配置和优化。<br>- 社区相对较小。 |
OpenSplice DDS | - 另一个受欢迎的DDS实现,已与ROS 2集成。 | - 成熟稳定,可靠性较高。<br>- 支持多种平台。<br>- 支持实时性和安全性。<br>- 良好的工具和支持。 | - 闭源商业软件,可能需要购买许可证。<br>- 社区支持相对较少。<br>- 文档可能不如其他实现全面。 |
Connext DDS | - 来自RTI的商业DDS实现,广泛应用于实时系统。 | - 高度可靠,性能优秀。<br>- 支持广泛的平台和编程语言。<br>- 强调实时性和安全性。<br>- 良好的支持和文档。 | - 商业软件,需要购买许可证。<br>- 可能对资源占用较高。<br>- 开源版本功能有限。 |
Eclipse Cyclone DDS | - 开源且高效的DDS实现,可用作Fast DDS的替代方案。 | - 开源免费,社区活跃。<br>- 性能良好,轻量级实现。<br>- 支持多种平台和语言。 | - 可能缺乏一些高级功能和工具。<br>- 文档相对较少。<br>- 社区支持较其他实现略少。 |
0.3 如何挖掘 DDS 的性能
在这里我选择的是 Eclipse Cyclone DDS 这个 DDS 实现,但想要实现我想要的效果,还需要对其进行调优,参数设置得不好的话,最终效果会很差。下面具体介绍一下为什么要对 DDS 进行调优。
DDS需要调优的主要原因是确保它能够满足应用程序的性能和可靠性要求。由于不同的应用场景和硬件平台有着不同的特点和约束,因此需要进行调优以使DDS能够最大程度地发挥优势。
以下是为什么DDS需要调优的几个主要原因:
-
性能优化: DDS的性能对实时应用至关重要。通过调优,可以降低通信延迟,提高数据传输速率,增加系统的吞吐量,以满足实时系统对数据传输的实时性要求。
-
资源利用: 在分布式系统中,资源(如带宽、CPU、内存)是有限的。DDS调优可以帮助合理利用这些资源,减少资源浪费,提高系统的效率和稳定性。
-
QoS配置: DDS提供了丰富的Quality of Service(QoS)选项,用于控制数据传输的各个方面,如数据可靠性、优先级、历史数据存储等。通过正确配置QoS参数,可以满足应用对数据传输的不同需求。
-
网络适应性: 在跨越不同网络环境的分布式系统中,DDS需要适应各种网络条件,如高延迟、不稳定连接等。调优可以帮助DDS在不同网络环境下保持稳定的通信,并减少数据丢失的可能性。
-
安全性: 对于一些安全性要求较高的应用,DDS需要配置加密和认证机制,以保护数据的机密性和完整性。
-
调试和故障排除: 调优也有助于发现和解决DDS在系统中可能出现的问题,提高系统的稳定性和可靠性。
综上所述,DDS调优是为了使DDS能够更好地适应特定的应用场景和硬件平台,提高系统的性能、实时性和可靠性,确保分布式系统能够顺利地进行数据通信和协作。
1. 具体操作
1.1 Cyclone DDS 调优参数设置
下面内容需要同时在边缘端和 PC 端进行设置。
首先,安装并配置环境变量:
sudo apt install ros-foxy-rmw-cyclone-cpp
echo 'export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp' >> ~/.bashrc
接着,在终端中直接设置下面三个参数:
sudo sysctl net.ipv4.ipfrag_time=3
sudo sysctl -w net.core.rmem_max=2147483648
sudo sysctl net.ipv4.ipfrag_high_thresh=2147483648
然后,创建一个 config.xml
文件,内容如下:
<CycloneDDS xmlns="https://cdds.io/config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://cdds.io/config https://raw.githubusercontent.com/eclipse-cyclonedds/cyclonedds/master/etc/cyclonedds.xsd">
<Domain id="any">
<Internal>
<MinimumSocketReceiveBufferSize>1024MB</MinimumSocketReceiveBufferSize>
</Internal>
</Domain>
</CycloneDDS>
最后,在终端中临时加载上面参数文件:
CYCLONEDDS_URI=/path/to/config.xml
1.2 局域网配置
确保边缘计算设备和 PC 通过 Wi-Fi 或有线连接到同一个局域网,如果设备很多,都是通过同一个局域网,且想对设备进行分组进行分布式通信,可以设置下面参数,设置了相同编号的设备之间就可以进行通信了,不设置的话就是所有设备之间都可以进行通信:
echo 'export ROS_DOMAIN_ID=5' >> ~/.bashrc
1.3 测试
克隆 Github 上的功能包代码,怎么创建工作空间和编译这里就不再赘述了,ROS2 新手移步上一篇博客学习。
将海康相机连接在边缘设备上,执行测试程序:
# 边缘端执行发布
ros2 run hk_camera hk_camera_compressed_pub_test_reliable
# PC 端执行订阅
ros2 run hk_camera hk_camera_compressed_sub_test_reliable
PC 端订阅图像效果如下,虽然相机最高帧率可达到 40Hz,但是这里我的边缘设备最高发布速率只能达到 20 fps,在 PC 端可以实现实时接收图像:
边缘端图像发布大概 8MiB/s:
PC 端接收的速率也大概是 8MiB/s:
点击海康相机 ROS2 多机分布式实时通信功能包------古月居可查看全文