R3live笔记:r3live的几个线程分析

今天在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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值