@小鱼 测试了一下:
C++情况下,差异不太大,100Hz频率下foxy 16%,humble 20%
python:
40% foxy 100Hz
85% humble 100Hz
20% foxy 50Hz
51% humble 50Hz
8% foxy 20Hz
20% humble 20Hz
感觉还是rclpy的问题比较大
@小鱼 测试了一下:
C++情况下,差异不太大,100Hz频率下foxy 16%,humble 20%
python:
40% foxy 100Hz
85% humble 100Hz
20% foxy 50Hz
51% humble 50Hz
8% foxy 20Hz
20% humble 20Hz
感觉还是rclpy的问题比较大
@小鱼 测试了一下:
C++情况下,差异不太大,100Hz频率下foxy 16%,humble 20%
python:
40% foxy 100Hz
85% humble 100Hz
20% foxy 50Hz
51% humble 50Hz
8% foxy 20Hz
20% humble 20Hz
感觉还是rclpy的问题比较大
@小鱼 好像还是qemu的问题。我设置了Multicast on,但是依然报错。
我是在x86上运行的armv7的镜像,就会出现这种问题。如果运行的是x86镜像,就正常的。
@小鱼 我后来去rclpy仓库提了issue,经过排查发现,humble的spin_once->add_node()
中的__gc.trigger()
耗时比foxy高。然后,ros2 topic hz
命令的源码实际上是在循环调用spin_once,而不是spin函数,就会导致trigger函数频繁调用,进而导致Humble的ros2 topic hz
命令的CPU占用高。
然后我又进行了测试,我用官方demo改了改,用spin()函数,避免频繁调用trigger。经过测试,在Jetson NX(arm64)上,CPU占用率Foxy和Humble基本持平了。但是,我又在armv7平台进行了测试,发现及其离谱,100Hz的频率收发数据,Humble达到了70%的CPU占用,而foxy仅30%左右。这个目前就没有思路了。
@小鱼 实际上这个问题还是没有解决。我们的场景下确实有需求需要在qemu下使用ROS。这种情况下,还是会报错:ddsi_udp_create_conn: set IP_MULTICAST_IF failed: Bad Parameter
。但是经过测试发现,仅cyclonedds会出现这种情况,而fastdds则没有问题。完整的报错如下:
1700209913.854902 [0] main: selected interface "lo" is not multicast-capable: disabling multicast
1700209913.862237 [0] main: ddsi_udp_create_conn: set IP_MULTICAST_IF failed: Bad Parameter
[ERROR] [1700209913.866479306] [rmw_cyclonedds_cpp]: rmw_create_node: failed to create domain, error Error
>>> [rcutils|error_handling.c:108] rcutils_set_error_state()
This error state is being overwritten:
'error not set, at /opt/ros/foxy/src/ros2/rcl/rcl/src/rcl/node.c:276'
with this new error message:
'rcl node's rmw handle is invalid, at /opt/ros/foxy/src/ros2/rcl/rcl/src/rcl/node.c:428'
rcutils_reset_error() should be called after error handling to avoid this.
<<<
[ERROR] [1700209913.873989803] [rcl]: Failed to fini publisher for node: 1
@小鱼 非常感谢。我去github上再问问吧。
至于rmw_iceoryx,我记得python好像也可以吧?这个只能用C++吗?而且这个库我记得有个问题,就是如果想和其他中间件通信的话,就必须要用到一个gateway来转换,这个我们目前的场景不太适合,我们是多台机器之间需要进行通信
我用C++来接收的话,CPU占用率就基本上没有什么变化,甚至Humble更低一点。所以更怀疑是rclpy的问题。ros2 topic hz
应该也是用python实现的。
Humble:
Foxy:
这是我在一个armv7架构的ubuntu20.04中测试的结果,用的是fastdds。可以看到,此时差异更加明显,humble的CPU占用率高出foxy两倍。我很怀疑是rclpy库的问题。
@小鱼 我用FastDDS也做过测试,CPU占用率Humble依然比Foxy高。
用Humble的主要原因是,我这个是arm64平台(Nvidia jetson),操作系统是ubuntu18.04,通过编译安装的Ros,使用fastdds的时候发现,脚本长时间运行以后,会出现发不出来消息的情况。也就是没有任何报错,但是就是没有任何消息发出了。通过脚本订阅也收不到,通过ros2 topic echo
也看不到,因此换用了cyclonedds。这个不是重点。
我从ros2 foxy迁移到了ros2 humble,但是发现CPU占用率提高了许多。如下图所示,ros2 topic hz命令从15%左右的CPU占用率提升到了21%左右,这是因为什么?
Foxy:
Humble: