ros2 foxy没有话题问题解决
0.问题背景
ubuntu20.04系统
ros2 foxy版本
米文apex orin nx域控
zedSDK4.0.8,zed2i相机
会出现ros launch成功启动,但是没有话题的现象。
有时候没话题的同时也没有rviz2画面,有时候没话题也没画面
即使是发送最简单的话题,在ros2 topic里也没有找到相关的话题,比如ros2 run demo_nodes_cpp talker
正常情况下会显示:
[INFO] [1686666666.123456789] [talker]: Publishing: 'Hello World: 1'
[INFO] [1686666667.123456789] [talker]: Publishing: 'Hello World: 2'
[INFO] [1686666668.123456789] [talker]: Publishing: 'Hello World: 3'
但是在本机上Publisher发布了相关话题,但没有找到相关话题:
ros2 topic list:
/parameter_events
/rosout
本机主要是在使用ros zed的时候遇到的问题
1.排查方向
1.1NVIDIA Jetson(如 Xavier NX、Orin 等)上默认使用 CycloneDDS 或 FastDDS,但有时会配置错误
1.1.1强制切换FastDDS
在接收话题之前都配置一下
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
ros2 run demo_nodes_cpp talker
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
ros2 topic list
1.1.2强制切换FastDDS且只本地回环
终端1
sudo apt update
sudo apt install -y ros-foxy-ros2cli-common-extensions
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export FASTRTPS_DEFAULT_PROFILES_FILE=$(pwd)/fastdds_lo.xml
cat > fastdds_lo.xml <<'EOF'
<profiles><participant profile_name="local_only" is_default_profile="true"><rtps><defaultUnicastLocatorList><locator><udpv4><address>127.0.0.1</address><port>0</port></udpv4></locator></defaultUnicastLocatorList><builtin><metatrafficUnicastLocatorList><locator><udpv4><address>127.0.0.1</address><port>0</port></udpv4></locator></metatrafficUnicastLocatorList><initialPeersList><locator><udpv4><address>127.0.0.1</address><port>7412</port></udpv4></locator></initialPeersList><avoid_builtin_multicast>true</avoid_builtin_multicast></builtin></rtps></participant>
</profiles>
EOF
ros2 run demo_nodes_cpp talker
终端2(同样 source 并 export 同样变量)
source /opt/ros/foxy/setup.bash
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export FASTRTPS_DEFAULT_PROFILES_FILE=$(pwd)/fastdds_lo.xml
ros2 topic list
1.1.3CycloneDDS
终端1:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 run demo_nodes_cpp talker
终端2:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
ros2 topic list
1.1.4CycloneDDS且只本地回环(本机解决方法)
终端1:
sudo apt update
sudo apt install ros-foxy-rmw-cyclonedds-cpp
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI='<CycloneDDS><Domain><General><NetworkInterfaceAddress>lo</NetworkInterfaceAddress><AllowMulticast>spdp</AllowMulticast></General></Domain></CycloneDDS>'
ros2 run demo_nodes_cpp talker
终端2:
export RMW_IMPLEMENTATION=rmw_cyclonedds_cpp
export CYCLONEDDS_URI='<CycloneDDS><Domain><General><NetworkInterfaceAddress>lo</NetworkInterfaceAddress><AllowMulticast>spdp</AllowMulticast></General></Domain></CycloneDDS>'
ros2 topic list
1.2检查防火墙或网络命名空间
ros2 daemon stop
ros2 daemon start
2.本地回环、单播的弊端
由于设置了NetworkInterfaceAddress为lo,任何跨主机节点都发现不了对方,一旦你需要把笔记本、工控机、Jetson 集群连在一起,必须重新放开多播或手动指定 peer 列表,否则它们永远“看不见”彼此。
docker0:Docker网桥。它是Docker容器的虚拟网络接口,用于连接容器和主机之间的网络。
eth0:以太网接口,也就是有线网卡。
lo:本地回环接口,主要用于测试本机的网络功能。
rndis0:远程网络驱动接口,是一种局域网技术,可以通过USB或其他网络连接到计算机系统。
usb0:USB网络接口,用于连接USB设备,如手机、平板等。
dummy0:是一个虚拟设备,可以用来测试网络功能,但不会连接到物理网络中。
l4tbr0:是一个Linux bridge,它可以将多个网卡桥接在一起,以创建一个虚拟网络,允许多台Linux机器通过一个网络互相通信。