LOAM代码笔记(一)

LOAM主要由四个节点组成,分别为:

multiScanRegistration、laserOdometry、laserMapping和transformMaintenance。

其中,核心算法封装在BasicScanRegistration、BasicLaserOdomotry、BasicLaserMapping和BasicTransformMaintenance中,这几个类的实现不涉及ROS的函数,为loam移植到其他平台提供了方便。

按照数据流的顺序,我们来一步一步分析loam的算法。首先是multiScanRegistraition。

multiScanRegistration

设置节点的主程序位于multi_scan_registration_node.cpp中,代码十分简洁,只有20行,事实上,四个节点的主程序部分都是20行,非常工整。

multi_scan_registration_node.cpp:

#include <ros/ros.h>
#include "loam_velodyne/MultiScanRegistration.h"


/** Main node entry point. */
int main(int argc, char **argv)
{
  ros::init(argc, argv, "scanRegistration");
  ros::NodeHandle node;
  ros::NodeHandle privateNode("~");

  loam::MultiScanRegistration multiScan;

  if (multiScan.setup(node, privateNode)) {
    // initialization successful
    ros::spin();
  }

  return 0;
}

点云注册的算法被封装在了MultiScanRegistration类中,他的继承关系为:

BasicLaserRegistration ———> ScanRegistraition ——>MultiScanRegistraion

ScanRegistration在父类的基础上增加了读取节点参数、发布/订阅消息的函数。MultiScanRegistraion在父类的基础上增加了对点云数据的预处理。

loam支持16线、32线和64线的激光雷达,默认参数为16线,可以对MultiScanMapper进行修改来切换不同的激光雷达模式。

MultiScanRegistration算法流程:

(1)预处理:读取点云后,先计算激光雷达的起始角度和终止角度,这里有一点需要注意一下,激光雷达一个扫描周期扫过的角度不一定刚好是360度。起始角为一帧点云数据中第一个点的水平角,终止角为最后一个点的水平角。去除点云中的极小值(坐标接近于0),对点云的坐标顺序进行调整,将坐标系改成:向左—x轴,向上—y轴,向前—z轴,根据垂直角计算每个点在第几条扫描线上(scanID),然后根据数据点的水平角计算该点在一个扫描周期中的相对时间,公式为:
R e l a t i v e T i m e = S c a n P e r i o d × H o r

  • 0
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值