mloam

以读“pcd”:

读取4个激光雷达数据,input

       estimator.inputCloud(cloud_time, laser_cloud_list);

inputCloud展开:
给每个激光雷达的三维点赋⼀个0-1值,为这个点的时间戳相对于这⼀帧点云的相对时
间,这个与A-LOAM⼀致

	 f_extract_.calTimestamp(v_laser_cloud_in[i], laser_cloud);

聚类分割
⽤类似Lego LOAM的⽅法,给点云⽣成深度图
深度优先搜索对上述深度图进⾏聚类 去除聚类中尺⼨过小或者过⼤的。
⽣成⼀个与上述图同样⼤的label_mat。

  • -1表⽰对应的像素处⽆数据
  • 999999表⽰⽆效的聚类
  • 否则表⽰这个像素属于的聚类的标号

根据label_mat来去除点云中的⽆效点

	img_segment_.segmentCloud(laser_cloud, laser_cloud_segment, laser_cloud_outlier, scan_info);

特征提取

    f_extract_.extractCloud(laser_cloud_segment, scan_info, *feature_frame_ptr[i]);

求出的特征都保存到cloudFeature这样一个数据结构里

std::queue<std::pair<double, std::vector<cloudFeature> > > feature_buf_;

feature_buf_报错了当前4个激光雷达的特征和时间戳,以队列+pair形式
cloudFeature是字符串-点云对应格式,相当于给点云打一个label

typedef std::map<std::string, common::PointICloud> cloudFeature;

然后就是数据处理:

        processMeasurements();

展开里面有一个 process();和 pubOdometry(*this, cur_time_);

process()展开:
如果没有先验外参,对于每个激光雷达,trackCloud以获得每帧的相对位移与绝对位姿,同每个激光雷达单独计算里程计

        pose_rlt_[n] = lidar_tracker_.trackCloud(prev_cloud_feature, cur_cloud_feature, pose_rlt_[n], cur_feature_.first, n);

pose_rlt_ 保存存了第i时刻 全部雷达的运动增量数据
将上⾯得到的每个激光雷达的相对位姿加⼊到待优化队列中

		if (initial_extrinsics_.addPose(pose_rlt_) && (cir_buf_cnt_ == WINDOW_SIZE))//将上⾯得到的每个激光雷达的相对位姿加⼊到待优化队列中

对于每⼀个激光雷达,标定其到主激光雷达的外参的旋转

        if (initial_extrinsics_.calibExRotation(IDX_REF, n, calib_result)) // 标定其到主激光雷达的外参的旋转

成功则标定其到主激光雷达的外参的平移

        if (initial_extrinsics_.calibExTranslation(IDX_REF, n, calib_result)) // 标定其到主激光雷达的外参的平移
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值