Closed gezp closed 1 year ago
考虑引入新的相机管理模型(CamServerManager
),提供add_cam_server()
, get_cam_server()
两个API,每次创建新的CamServer
时,将其加入CamServerManager
中,并且CamServerManager
采用shared pointer
类型,可以共享给每一个CamClient
(IntraCamClient
), 如图所示
NodeFactory
,构建增强的ComponentManager
(支持自定义类型component) 以及 component_container
.实现步骤
CamServerManager
,并适配IntraCamClient
: https://github.com/robomaster-oss/rmoss_core/pull/9根据 #11 中的测试结果,composition机制能够很好的降低延迟,几乎不产生丢帧,特别是rclcpp use_intra_process_comms
特性,几乎达到了#10 提出的基于CamServerManager
专用 component container
方案。目前rclcpp use_intra_process_comms
处于实验开发阶段,支持不够完善,使用仍需谨慎。
done
Feature request
Feature description
背景: rclcpp components机制能够将多个Node运行在一个进程中,可以带来性能的提升,Navigation2已经有效的利用这一点,无需任何其它修改,资源利用(CPU,Mem)减少了25-40%(参考 rclcpp components机制对Navigation2性能影响测试). 但是其本质仍然采用DDS通信 (某些DDS厂商提供共享内存方式优化)。除此之外,ROS2提供了进程内通信机制(Intra-process Communications in ROS 2),不使用DDS,但是其仍处于实验开发阶段,目前使用具有很大的局限性。
问题:rmoss_cam对于图像处理流程提供了相机C/S模型,相机采集图像和图像处理分别在两个节点,之间采用ROS通信机制(DDS)解耦设计有利于提高开发效率,但ROS通信会引入额外的系统开销,特别对于图像,图像消息的数据量一般较大,CPU,Mem,延迟等会明显增加(特别是当相机高帧率时,需要较大带宽),尽管rclcpp components机制能够带来一定性能优化,但即使采用共享内存通信,仍需要消息序列化,反序列化等操作,相比于裸框架开发性能较差。
建议:使用rclcpp components之后,每个节点都运行在一个进程中的不同线程中,同一个进程中本身就支持资源共享,可对节点进行直接管理,采用多线程通信机制实现CamServer和CamClient节点之间之间进行数据传输图像(cv::Mat)