根据社区已有案例,这是典型的 ROS2 网络通信配置问题。虚拟机看不到板端 topic 通常是网络模式或 DDS 配置不当导致的。
解决方案(按优先级执行)
检查虚拟机网络模式(最关键)
虚拟机必须和 RDK X5 在同一网段才能通信:
# 在 RDK X5 上查看 IP
ip addr show
# 在虚拟机上查看 IP
ip addr show
# 测试是否能互相 ping 通
ping <RDK_X5_IP> # 在虚拟机执行
ping <VM_IP> # 在 RDK X5 执行
虚拟机网络模式设置:
不要用 NAT 模式(会导致不在同一网段)
使用 桥接模式 (Bridged) 或 Host-Only + 手动配置同网段
设置 ROS_DOMAIN_ID
确保两端使用相同的 DOMAIN_ID:
# 在 RDK X5 和虚拟机上都执行
export ROS_DOMAIN_ID=0 # 或任意相同数字 (0-232)
# 建议写入 ~/.bashrc 永久生效
echo "export ROS_DOMAIN_ID=0" >> ~/.bashrc
source ~/.bashrc
配置 DDS 使用正确网卡
如果使用 CycloneDDS,需要指定网卡:
# 创建/编辑 CycloneDDS 配置文件
mkdir -p ~/cyclonedds
cat > ~/cyclonedds/cyclonedds.xml << EOF
<?xml version="1.0" encoding="UTF-8" ?>
<CycloneDDS xmlns="https://cdds.io/config">
<Domain>
<General>
<Interfaces>
<NetworkInterface name="<你的网卡名>"/>
</Interfaces>
</General>
</Domain>
</CycloneDDS>
EOF
# 设置环境变量
export CYCLONEDDS_URI=file:///home/你的用户名/cyclonedds/cyclonedds.xml
查看网卡名:
ip addr show # 找到对应的网卡名,如 eth0, enp0s3 等
检查防火墙
# 临时关闭防火墙测试(仅用于排查)
sudo ufw disable # Ubuntu
# 或
sudo systemctl stop firewalld # CentOS
# 测试成功后再配置规则
验证通信
# 在 RDK X5 上发布测试 topic
ros2 topic pub /test std_msgs/msg/String "{data: 'hello'}"
# 在虚拟机上订阅
ros2 topic echo /test
# 查看 topic 列表
ros2 topic list
快速排查清单
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| 网络连通性 | ping <对端 IP> |
能 ping 通 |
| 同一网段 | ip addr show |
前三段 IP 相同 |
| DOMAIN_ID | echo $ROS_DOMAIN_ID |
两端一致 |
| Topic 发布 | ros2 topic list |
能看到目标 topic |
| 防火墙 | sudo ufw status |
已关闭或放行 UDP |
相关社区资源
- RDKx5 SLAM 建图 map 话题无消息 - 网络配置详细讨论
- 开发机、虚拟机、主机三者网络互通 - 配网经验贴
如果以上步骤仍无法解决,请提供:
- RDK X5 的 IP 地址
- 虚拟机的 IP 地址
- 虚拟机网络模式(NAT/桥接/Host-Only)
ros2 topic list在两端分别的输出
这样我可以帮你进一步定位问题。