理解DDS是什么
https://zhuanlan.zhihu.com/p/1953120758898332255
cyclonedds
http://feitao.wang/share/axvfzdzrc6/p/cyclone-dds-Pi6geAWPEb
配置及跨网通信优化
多机配置ip
# 查看当前机器的ip地址 ifconfig # 例如查看工控机路由器端的WIFI信息 enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.254.253 netmask 255.255.255.0 broadcast 192.168.254.255 inet6 fe80::6aed:a4ff:fe68:17df prefixlen 64 scopeid 0x20<link> ether 68:ed:a4:68:17:df txqueuelen 1000 (Ethernet) RX packets 598 bytes 65791 (65.7 KB) RX errors 0 dropped 3 overruns 0 frame 0 TX packets 618 bytes 55414 (55.4 KB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device memory 0x80300000-8031ffff # 即可得出网络端口名称: enp2s0 ip地址: 192.168.254.253安装CycloneDDS
- 以ROS2的humble为例,跨机通信,工控机和笔记本都要配置
sudo apt update sudo apt install -y ros-humble-rmw-cyclonedds-cpp # 检查是否安装成功 dpkg -l | grep cyclonedds # 示例输出 ii ros-humble-rmw-cyclonedds-cpp xxx RMW implementation using Cyclone DDS配置环境变量
- 工控机和笔记本都要配置
# 打开配置文件并在末尾输入以下内容 sudo vim ~/.bashrc # RMW_IMPLEMENTATION export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp # dds config ~/.cyclonedds.xml export CYCLONEDDS_URI="file://$HOME/.cyclonedds.xml"创建并配置cyclonedds.xml
- 工控机端和笔记本端都要配置
- 如果更换机器人路由器,导致了笔记本端网络名和ip发生变化,那么需要对应修改name和Peers的值
- 如果要添加多台机器通信,则对应添加Peer的ip即可,并且新机器也要安装cyclonedds和配置xml,配网缓存设置等
# 创建并编辑文件 sudo vim ~/.cyclonedds.xml # 输入内容并对应更改[按自己实际更改] 如name为上述的网络端口名称: enp2s0 # peer 如工控机ip地址: 192.168.254.253 笔记本ip地址: 192.168.254.227 <?xml version="1.0" encoding="UTF-8" ?> <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"> <General> <Interfaces> <NetworkInterface autodetermine="false" name="enp2s0" priority="default" multicast="default" /> </Interfaces> <AllowMulticast>false</AllowMulticast> <MaxMessageSize>65500B</MaxMessageSize> </General> <Discovery> <ParticipantIndex>auto</ParticipantIndex> <Peers> <Peer Address="192.168.254.253" /> <Peer Address="192.168.254.227" /> </Peers> <MaxAutoParticipantIndex>120</MaxAutoParticipantIndex> </Discovery> <Internal> <SocketReceiveBufferSize min="10MB"/> <Watermarks> <WhcHigh>500kB</WhcHigh> </Watermarks> </Internal> </Domain> </CycloneDDS>系统环境配置
- 各端都需要配置, 否则缓存不够dds读取上述配置文件启动时会报错
- 优化配网参数,UDP缓存,IP时间和阈值,ARP时间等
# 方式一:临时生效[可应用于临时测试] # Increase the maximum receive buffer size for network packets sudo sysctl -w net.core.rmem_max=2147483647 # 2 GiB, default is 208 KiB # IP fragmentation settings sudo sysctl -w net.ipv4.ipfrag_time=3 # in seconds, default is 30 s sudo sysctl -w net.ipv4.ipfrag_high_thresh=134217728 # 128 MiB, default is 256 KiB sudo sysctl -w net.ipv4.neigh.default.gc_stale_time=3600 sudo sysctl -w net.ipv4.neigh.default.base_reachable_time_ms=60000 # 方式二:写入配置,永久生效[测试通过后] # 写入配置 sudo vim /etc/sysctl.d/10-cyclone-max.conf # -------------------------------------------------------------- # Increase the maximum receive buffer size for network packets net.core.rmem_max=2147483647 # 2 GiB, default is 208 KiB # IP fragmentation settings net.ipv4.ipfrag_time=3 # in seconds, default is 30 s net.ipv4.ipfrag_high_thresh=134217728 # 128 MiB, default is 256 KiB # ARP time net.ipv4.neigh.default.gc_stale_time=3600 net.ipv4.neigh.default.base_reachable_time_ms=60000 # -------------------------------------------------------------- # 加载配置 sudo sysctl -p /etc/sysctl.d/10-cyclone-max.conf # 查看是否更改 sudo sysctl net.core.rmem_max net.ipv4.ipfrag_time net.ipv4.ipfrag_high_thresh net.ipv4.neigh.default.gc_stale_time net.ipv4.neigh.default.base_reachable_time_ms设置domain ID组
- 工控机端和笔记本端必须都要配置!!!
- 不同ID组的节点之间无法被彼此发现和通信
# 打开配置文件并在末尾输入以下内容 sudo vim ~/.bashrc # ROS_DOMAIN_ID为 0-255之间的数字,最好是低于128的数字,一般默认为0 # 笔记本端和工控机端都要对应修改为相同的domain ID才能彼此发现和通信 export ROS_DOMAIN_ID=42查看当前终端使用的DDS
- 这是验证的方法,两个使用不同DDS的节点,它们无法互相通信;
# 完成上述配置后, 刷新环境变量 source ~/.bashrc # 方式1: 终端命令查看 # 查看当前DDS的全部信息 ros2 doctor --report # 只查看当前使用的DDS名称 ros2 doctor --report | grep middleware # 输出示例 middleware name : rmw_cyclonedds_cpp # 更换后的dds middleware name : rmw_fastrtps_cpp # 更换之前,默认的dds # 方式2: 底层进程验证 # 启动ROS2节点后,查看加载的动态库 ros2 run demo_nodes_cpp talker # 查看进程加载的库 ps aux | grep talker # 获取PID,假设是12345 lsof -p 12345 | grep -E "cyclone|fastrtps" # 输出示例 talker 12345 libfastrtps.so # Fast DDS核心库 talker 12345 librmw_fastrtps_cpp.so配置笔记本rviz2订阅端
- 【Best-effort】设置能够减少了网络流量,因为在这种情况下,DDS 实现无需承担可靠通信的开销,即发布者无需为发送给订阅者的消息获取确认,并且不必重新发送未正确接收的样本。
- 对于大数据类型[如代价地图,点云信息,粒子云等]的话题采用尽力传输Best-effort的qos策略
- 一般只需在笔记本端的rviz2内更改订阅方qos即可,设置了之后保存当前rviz.config文件,若实际能满足应用需求,也可以将发布者qos策略更改为Best-effort
网络配置优化
这里只需要更改工控机的配置即可
- 禁用工控机路由器的节能模式: 防止单向传输数据时延迟高
# 方法1: 临时测试 # 查看当前设置 enp2s0: 替换为你实际的路由器网络名 sudo ethtool -k enp2s0 | grep -E "tcp-segmentation|generic-segmentation|scatter-gather" # 禁用网卡节能和优化功能 sudo ethtool -K enp2s0 tso off sudo ethtool -K enp2s0 gso off sudo ethtool -K enp2s0 gro off sudo ethtool -K enp2s0 sg off # 禁用网卡电源管理 sudo ethtool -s enp2s0 wol d # 方式2: 永久生效 sudo vim /etc/network/if-up.d/disable-offload # 添加以下内容 #!/bin/bash ethtool -K enp2s0 tso off ethtool -K enp2s0 gso off ethtool -K enp2s0 gro off ethtool -K enp2s0 sg off ethtool -s enp2s0 wol d # 赋予权限 sudo chmod +x /etc/network/if-up.d/disable-offload- 调整工控机CPU为性能模式
# 方式1: 临时测试 # 查看CPU频率模式 cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 如果显示 powersave,改为 performance echo performance | sudo tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor # 方式2: 永久生效 sudo apt install cpufrequtils sudo vim /etc/default/cpufrequtils # 添加 GOVERNOR="performance" # 重启服务 sudo systemctl restart cpufrequtils- 禁止网卡自动挂起
sudo sh -c "echo 'on' > /sys/bus/pci/devices/*/power/control" # 查找网卡对应的号 lspci | grep -i network # 示例输出, 找到自己对应ip和网络使用的网卡号, 如02:00.0 01:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) 02:00.0 Ethernet controller: Intel Corporation I210 Gigabit Network Connection (rev 03) 05:00.0 Network controller: Intel Corporation Wi-Fi 6 AX210/AX211/AX411 160MHz (rev 1a) # 1.临时测试 echo on | sudo tee /sys/bus/pci/devices/0000:02:00.0/power/control # 2.永久设置 sudo vim /etc/rc.local #!/bin/bash echo on>/sys/bus/pci/devices/0000:02:00.0/power/contro1 exit 0 sudo chmod +x /etc/rc.local优化ssh配置
# 笔记本端ssh 配置 sudo vim ~/.ssh/config # 添加内容 Host 工控机IP User 你的用户名 # 关键配置:心跳保活 ServerAliveInterval 30 ServerAliveCountMax 3 TCPKeepAlive yes # 优化网络性能 Compression yes IPQoS 0x00 # 禁用DNS查询 GSSAPIAuthentication no # 工控机端ssh配置 sudo vim /etc/ssh/sshd_config # 添加内容 ClientAliveInterval 30 ClientAliveCountMax 3 TCPKeepAlive yes UseDNS no # 重启ssh sudo systemctl restart sshd