1. ROS_DOMAIN_ID 未设置或设置不一致

这是最常见的原因。ROS2使用DDS中间件,默认的ROS_DOMAIN_ID为0,在多机通信时容易冲突。

检查方案:

# 在两台机器上分别检查
echo $ROS_DOMAIN_ID

解决方案:
在两台机器的~/.bashrc中添加相同的DOMAIN_ID:

# 选择0-232之间的数字(避免常见网络冲突)
export ROS_DOMAIN_ID=42

2. 网络配置问题

需要检查:

# 1. 确认IP地址配置正确
# 上位机执行:
hostname -I

# 树莓派执行:
hostname -I

# 2. 确认网络连通性
# 在树莓派ping上位机:
ping <上位机IP>

# 3. 检查多播路由
route -n | grep 224.0.0.0

3. 防火墙/网络策略限制

Ubuntu 22.04默认防火墙规则可能阻止ROS2通信:

# 在两台机器上都执行
sudo ufw status
# 如果启用,添加规则或暂时关闭测试
sudo ufw allow 7400:7600/tcp
sudo ufw allow 7400:7600/udp

4. Fast DDS配置问题

ROS2 Humble默认使用Fast DDS,需要正确配置发现机制:

创建配置文件 fastdds_config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <participant profile_name="participant_profile">
        <rtps>
            <builtin>
                <initialPeersList>
                    <locator>
                        <udpv4>
                            <address><上位机IP></address>
                            <port>11811</port>
                        </udpv4>
                    </locator>
                    <locator>
                        <udpv4>
                            <address><树莓派IP></address>
                            <port>11811</port>
                        </udpv4>
                    </locator>
                </initialPeersList>
                <metatrafficUnicastLocatorList>
                    <locator>
                        <udpv4>
                            <address>239.255.0.1</address>
                            <port>11811</port>
                        </udpv4>
                    </locator>
                </metatrafficUnicastLocatorList>
            </builtin>
        </rtps>
    </participant>
</profiles>

设置环境变量:

export FASTRTPS_DEFAULT_PROFILES_FILE=/path/to/fastdds_config.xml

5. 环境变量配置不完整

确保两台机器的~/.bashrc中有完整配置:

# 上位机配置
export ROS_DOMAIN_ID=42
export ROS_IP=<上位机IP>
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

# 树莓派配置
export ROS_DOMAIN_ID=42
export ROS_IP=<树莓派IP>
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp

6. 测试步骤

第一步:基础连通性测试

# 在上位机运行
ros2 run demo_nodes_cpp talker

# 在树莓派运行
ros2 run demo_nodes_cpp listener

第二步:检查节点发现

# 在两台机器分别执行
ros2 node list
ros2 topic list

第三步:使用Wireshark检查DDS通信

sudo apt install wireshark
# 过滤DDS流量
udp.port == 11811

7. 使用Cyclone DDS替代方案

如果Fast DDS问题难以解决,可以切换为Cyclone DDS:

sudo apt install ros-humble-rmw-cyclonedds-cpp

# 在~/.bashrc中添加
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp

检查命令:

# 在上位机查看话题信息
ros2 topic info /cmd_vel --verbose

# 在树莓派查看话题信息
ros2 topic info /cmd_vel --verbose

推荐的完整解决方案:

  1. 统一DOMAIN_ID:设置相同的非零DOMAIN_ID
  2. 关闭防火墙测试sudo ufw disable
  3. 使用静态IP:确保WiFi网络使用静态IP分配
  4. 配置hosts文件:在两台机器的/etc/hosts中添加对方
  5. 使用Cyclone DDS:通常比Fast DDS在多机通信中更稳定
Logo

立足具身智能前沿赛道,致力于搭建全球化、开源化、全栈式技术交流与实践共创平台。

更多推荐