@小鱼 测试了一下:
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的问题比较大
Operating System:
Ubuntu 16.04
Installation type:
from source
Version or commit hash:
Foxy
DDS implementation:
CycloneDDS
Client library (if applicable):
rclpy
运行过程中突然报错:
Exception in thread Thread-26:
Traceback (most recent call last):
File "/usr/lib/python3.8/threading.py", line 932, in _bootstrap_inner
self.run()
File "/usr/lib/python3.8/threading.py", line 870, in run
self._target(*self._args, **self._kwargs)
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/executors.py", line 290, in spin
self.spin_once()
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/executors.py", line 770, in spin_once
self._spin_once_impl(timeout_sec)
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/executors.py", line 767, in _spin_once_impl
future.result()
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/task.py", line 94, in result
raise self.exception()
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/task.py", line 239, in __call__
self._handler.send(None)
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/executors.py", line 429, in handler
await call_coroutine(entity, arg)
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/executors.py", line 384, in _execute_service
srv.send_response(response, header)
File "/opt/ros/foxy/install/lib/python3.8/site-packages/rclpy/service.py", line 74, in send_response
_rclpy.rclpy_send_response(capsule, response, header)
_rclpy.RCLError: Failed to send request: cannot publish data, at /opt/ros/foxy/src/ros2/rmw_cyclonedds/rmw_cyclonedds_cpp/src/rmw_node.cpp:3605, at /opt/ros/foxy/src/ros2/rcl/rcl/src/rcl/service.c:356
然后程序就无法正常触发ROS2回调了
关联Github Issue
@luckydoor1991 请问FastDDS的SHM是你手动启动的吗?还是说在相同主机上通信,fastDDS是默认使用的shm?
@小鱼 测试了一下:
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库的问题。