主要代码结构:
Preprocess
和ImuProcess
实例pcl::VoxelGrid<PointType> downSizeFilterSurf;
ROS转PCL:
#include <pcl_conversions/pcl_conversions.h>
template<PointType>
pcl::PointCloud<PointType> pcl_pointcloud;//模板点云类,模板参数是点的格式
pcl::fromROSMsg(*msg, pcl_poincloud);//把ROS消息转化成pcl点云格式
for (uint i = 0; i < pointcloud_size; i++)//遍历点云的每一个点
pcl_pointcloud.points[i];//每一个点
}
livox雷达数据格式
livox的时间戳是以ns为单位,点云的header->stamp记录了这一帧点云的起始时间,每个点的offset_time记录了每个点相对点云stamp的偏移量。
robosense的时间戳是以s为单位,点云的header->stamp记录了这一帧点云的结束时间
问题记录:
point_filter_num
参数设置大建图效果变差。在传统SLAM框架下搭建了一套高性能雷达odometry-彩色点云Mapping-三维重建的体系,将Lidar-相机-IMU更直接有效的融合。它在建图的同时把RGB信息通过VIO子系统给点云上色,并通过一定的方法优化这个上色。
注意: R3live默认雷达和IMU坐标系重合,在R3live发布的tf中有两个坐标系:
对于雷达和IMU坐标系不重合的设备,可以在Lidar_front_end.cpp中添加将雷达点云转换到IMU系的程序来适配。
前端LiDAR_front_end.cpp负责将雷达原始点云处理成pcl::PointCloudXYZINormal
格式
主函数在r3live.cpp
Eigen::initParallel();//从多个线程调用Eigen时必须首先调用
R3LIVE * fast_lio_instance = new R3LIVE();//创建r3live类实例
初始化操作在R3LIVE
的构造函数中:
/IMU_topic
读取 ->回调函数 R3LIVE::imu_cbk
imu_buffer_lio
和imu_buffer_vio
/LiDAR_pointcloud_topic
读取->回调函数R3LIVE::feat_points_cbk
,每一帧数据压入lidar_buffer
/Image_topic
读取 ->回调函数R3LIVE::image_callback
/Image_topic/compressed
->回调函数R3LIVE::image_comp_callback
service_LIO_update
sync_packages
获取一帧雷达点云及其对应的IMU数据 -> MeasureGroup视觉部分全部放在r3live_vio.cpp
中
入口是图像话题回调函数image_callback
i
m
a
g
e
_
c
a
l
l
b
a
c
k
→
{
s
e
r
v
i
c
e
_
p
r
o
c
e
s
s
_
i
m
a
g
e
_
b
u
f
e
r
p
r
o
c
e
s
s
_
i
m
a
g
e
→
{
s
e
r
v
i
c
e
_
V
I
O
_
u
p
d
a
t
e
s
e
r
v
i
c
e
_
p
u
b
_
r
g
b
_
m
a
p
s
\rm image\_callback \to \begin{cases} \rm service\_process\_image\_bufer \\ \rm process\_image\to \end{cases} \begin{cases}{} \rm service\_VIO\_update\\ \rm service\_pub\_rgb\_maps \end{cases}
image_callback→{service_process_image_buferprocess_image→{service_VIO_updateservice_pub_rgb_maps
#include<opencv2/core/eigen.hpp>
cv::eigen2cv(const Eigen::Matrix& src, cv::Mat& dst);
cv::cv2eigen(const cv::Mat& src, Eigen::Matrix& dst);