运行LVI-SAM,并打开rqt_graph,查看节点关系如图所示:
激光雷达原始数据的topic为/points_raw,观察发现它仅被imageProjection节点订阅,因此我们分析这个节点。
imageProjection节点订阅三个节点:points_raw节点、imu_raw节点、和imu_propagate_ros节点,并被cloud_info节点订阅。(rviz可视化部分暂不考虑)
可以猜想出,imageProjection节点的主要功能是将点云投影变成类似于图片的格式,进行一些预处理方便后续的slam过程。
二、主函数int main(int argc, char** argv) { ros::init(argc, argv, "lidar"); 本node的主要工作都体现在ImageProjection的构造函数当中 ImageProjection IP; ROS_INFO("\033[1;32m----> Lidar Cloud Deskew Started.\033[0m"); 创建三个相同的线程,在A线程忙碌的时候启用B线程,A,B线程都忙碌的时候启用C线程 ros::MultiThreadedSpinner spinner(3); spinner.spin(); return 0; }三、ImageProjection类 3.1 父类ParamServer类
ParamServer是一个重要的类,它的子类包括:
FeatureExtraction IMUPreintegration ImageProjection mapOptimization
它的成员包括:
上述ros参数均可以根据名称判断其含义,且与param_lidar.yaml参数文件紧密关联。
3.2 ImageProjection类的成员
在主函数当中,主要依靠的就是ImageProjection类的构造函数,因此重点分析它,结合以上ImageProjection类成员变量和成员函数的解读可以很容易看懂其过程。
ImageProjection(): deskewFlag(0) // 去畸变标志位置零 { // 订阅imu原始数据,回调函数负责将测量信息坐标变换到激光雷达并存储到队列 subImu = nh.subscribe(imuTopic, 2000, &ImageProjection::imuHandler, this, ros::TransportHints().tcpNoDelay()); // 订阅Odom原始数据,此Odom来自于VIS,可能早于点云采集时间,也可能稍晚于点云采集时间,回调函数负责将位姿信息存放到队列 subOdom = nh.subscribe(PROJECT_NAME + "/vins/odometry/imu_propagate_ros", 2000, &ImageProjection::odometryHandler, this, ros::TransportHints().tcpNoDelay()); // 订阅原始点云,回调函数负责检查、获取对齐的imu帧旋转矩阵、获取相邻帧的位姿变换、点云投影成图片从而使点云有序化,最后把去畸变有序化点云和自定义格式点云发布出去 subLaserCloud = nh.subscribe(pointCloudTopic, 5, &ImageProjection::cloudHandler, this, ros::TransportHints().tcpNoDelay()); // 发布处理过后的点云和自定义格式的点云 pubExtractedCloud = nh.advertise(PROJECT_NAME + "/lidar/deskew/cloud_deskewed", 5); pubLaserCloudInfo = nh.advertise(PROJECT_NAME + "/lidar/deskew/cloud_info", 5); // 为下一次处理分配内存空间并重置所有参数 allocateMemory(); resetParameters(); // 设置控制台输出信息 pcl::console::setVerbosityLevel(pcl::console::L_ERROR); }
本文仅做学术分享,如有侵权,请联系删文。
3D视觉精品课程推荐:
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码) 3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进 4.国内首个面向工业级实战的点云处理课程 5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解 6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦 7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化 8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
9.从零搭建一套结构光3D重建系统[理论+源码+实践]
10.单目深度估计方法:算法梳理与代码实现
11.自动驾驶中的深度学习模型部署实战
12.相机模型与标定(单目+双目+鱼眼)
13.重磅!四旋翼飞行器:算法与实战
14.ROS2从入门到精通:理论与实战
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~