robomaster-oss / rmoss_core

RoboMaster OSS中的基础项目,为RoboMaster提供通用基础功能模块包,如相机模块,弹道运动模块等。
Apache License 2.0
105 stars 17 forks source link

optimization for image pipeline in rmoss_cam #8

Closed gezp closed 1 year ago

gezp commented 2 years ago

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)

gezp commented 2 years ago

考虑引入新的相机管理模型(CamServerManager),提供add_cam_server() , get_cam_server()两个API,每次创建新的CamServer时,将其加入CamServerManager中,并且CamServerManager采用shared pointer类型,可以共享给每一个CamClient (IntraCamClient), 如图所示

实现步骤

gezp commented 2 years ago

根据 #11 中的测试结果,composition机制能够很好的降低延迟,几乎不产生丢帧,特别是rclcpp use_intra_process_comms 特性,几乎达到了#10 提出的基于CamServerManager 专用 component container 方案。目前rclcpp use_intra_process_comms 处于实验开发阶段,支持不够完善,使用仍需谨慎。

gezp commented 1 year ago

done