讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下:
(02)Cartographer源码无死角解析- (00)目录_最新无死角讲解:https://blog.csdn.net/weixin_43013761/article/details/127350885
文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证{\color{blue}{文末正下方中心}提供了本人 \color{red} 联系方式,\color{blue}点击本人照片即可显示WX→官方认证}文末正下方中心提供了本人联系方式,点击本人照片即可显示WX→官方认证
在上一篇博客,介绍了激光雷达运动畸变较正,其原理是利用每个点云数据生成时机器人的位姿 Robottrackinglocal\mathbf {Robot}^{local}_{tracking}Robottrackinglocal(相对于local坐标系)对该点云进行校正,校正之后的点云记为 PointlocalPoint^{local}Pointlocal,其表示为在 local 坐标系下的位置。总的来说,此时的点云数据,已经完成了时间同步,以及运动畸变校正。
回到 LocalTrajectoryBuilder2D::AddRangeData() 函数,还有一部分代码没有进行讲解,先先粘贴一下代码如下所示:
// 有一帧有效的数据了++num_accumulated_;// param: num_accumulated_range_data 几帧有效的点云数据进行一次扫描匹配if (num_accumulated_ >= options_.num_accumulated_range_data()) {// 计算2次有效点云数据的的时间差const common::Time current_sensor_time = synchronized_data.time;absl::optional sensor_duration;if (last_sensor_time_.has_value()) {sensor_duration = current_sensor_time - last_sensor_time_.value();}last_sensor_time_ = current_sensor_time;// 重置变量num_accumulated_ = 0;// 获取重力对齐变换矩阵,该矩阵只包含旋转,平移为0,//可理解机器人坐标系的Z轴需要与重力矢量平行const transform::Rigid3d gravity_alignment = transform::Rigid3d::Rotation(extrapolator_->EstimateGravityOrientation(time));// TODO(gaschler): This assumes that 'range_data_poses.back()' is at time// 'time'.// 以最后一个点的时间戳估计出的坐标为这帧数据的原点accumulated_range_data_.origin = range_data_poses.back().translation();return AddAccumulatedRangeData(time,// 对点云进行重力对齐,也就是让点云的Z轴与重力方向平行TransformToGravityAlignedFrameAndFilter(gravity_alignment.cast() * range_data_poses.back().inverse(),accumulated_range_data_),gravity_alignment, sensor_duration);}
其主要目的就是对点云进行重力对立,这里假设一个坐标系的 Z轴与重力方向平行,则认为该坐标系为世界坐标系。那么这里所谓的重力对齐,就是把 local 坐标系下的点云变换到世界坐标系。那么下面,就来对这些代码逐句分析吧。