今天在r3live类的构造函数里看到这样一行代码:
m_thread_pool_ptr = std::make_shared<Common_tools::ThreadPool>(6, true, false); // At least 5 threads are needs, here we allocate 6 threads.
大意是初始化一个包含6个线程的线程池子,然后作者注释
// At least 5 threads are needs, here we allocate 6 threads.
说明至少需要5个线程,就仔细来数一下都有哪些:
1. 一个取出image处理线程
订阅IMAGE_topic的回调函数image_callback和image_comp_callback里,开启一个取出image处理线程service_process_img_buffer:
m_thread_pool_ptr->commit_task( &R3LIVE::service_process_img_buffer, this );
这个线程里的主要内容:
首先为防止等待vio处理的图像队列m_queue_image_with_pose占用过多的缓存,m_queue_image_with_pose超过4帧时,先减少内存的占用
然后,根据输入图像是压缩图还是原图作出相应的处理,主要是把ros格式的图像转换成cv格式
最后,调用process_image函数处理图像:
process_image( image_get, img_rec_time );
2. 一个VIO线程
VIO线程之前介绍过参考:[R3live笔记:视觉-惯性里程计VIO部分]
3. 一个LIO线程
在
R3LIVE()构造函数最后一行代码:
m_thread_pool_ptr->commit_task(&R3LIVE::service_LIO_update, this);//开启lio线程
开启lio线程
LIO线程来源于r2live,fast-lio,
主要是接收雷达数据,畸变补偿,特征提取,IMU状态传播,LIO状态更新
LIO线程参考:R3live笔记:从代码看lio线程
4. 一个发布rgb map的线程
在R3LIVE::process_image函数里,开启VIO线程和service_pub_rgb_maps线程:
m_thread_pool_ptr->commit_task( &R3LIVE::service_pub_rgb_maps, this);
m_thread_pool_ptr->commit_task( &R3LIVE::service_VIO_update, this);
VIO发布了一系列/RGB_map_xx话题(参见R3live:整体分析),这是将RGB点云地图拆分成了子点云发布,由一个线程专门负责,这个线程就是service_pub_rgb_maps线程
// /RGB_map_xx:将RGB点云地图拆分成子点云发布,由一个线程专门负责
void R3LIVE::service_pub_rgb_maps()
{
int last_publish_map_idx = -3e8;
int sleep_time_aft_pub = 10;
int

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



