在ros2使用的过程中,一开始选用的foxy版本,后来发现,foxy版本的ros2有很多问题。一个是foxy版本已经停止维护了。另一个问题是这个版本有很多bug, 后续的版本在功能实现上做了很大的改动,甚至说进行了重写。修复的一些问题,foxy版本上的问题也没有修复。
最近遇到的问题是,service有时候没有应答,根据输出的log看是中间件出的问题,错误的的日志如下
E0229 15:04:57.981310 2354 main.cpp:43] [me] rclcpp::exception::RCLError caught! failed to send response: client will not receive response, at /tmp/binarydeb/ros-foxy-rmw-fastrtps-shared-cpp-1.3.2/src/rmw_response.cpp:127, at /tmp/binarydeb/ros-foxy-rcl-1.1.14/src/rcl/service.c:356
后面查看源码发现如下的内容,看到这个if条件是Maybe就很崩溃了。
遇到节点启动时,负载很高,通过perf工具查看,是启动的时候共享内存一直创建失败。抛出异常,
然后进入某种死循环,一直在创建共享内存。一直在find_segment()函数中转。
目前没有从网上找到很好的处理方法,其实也无法确定是ros2的问题导致的,还是中间件导致的。
所以采取的方式是换中间件。
ros2 中间件
foxy版本的中间件使用的是fast-rtps, 这个版本默认是使用共享内存的。也就是遇到了上面的问题。通过查一些资料,用的比较多的是cyclone-dds. 所以决定先替换中间件。
替换方法比较简单。
直接apt安装,再加声明环境变量RMW_IMPLEMENTATION就可以。
安装方法:
sudo