深蓝学院 《多传感器融合定位》 第2章作业

博客围绕SLAM展开,先介绍闭环修正及精度评价,包括闭环检测相关参数理解,在SC - LeGO - LOAM中使用scan context方法,在自己工程实现回环检测及实验结果对比;还提及位姿初始化,要求实现地图中任意位置的位姿初始化,并给出了实现思路和相关实验结果。

整体框架参考 从零开始做自动驾驶定位(九): 建图系统结构优化

在这里插入图片描述我的电脑上 rosbag play kitti_2011_10_03_drive_0027_synced.bag -r 1.3 基本前端里程计能跟上gnss轨迹

先跑通建图

roslaunch mapping.launch

下图结果为后端刚优化完前950帧后建立出一部分全局地图的结果:
在这里插入图片描述
橙色 组合导航位姿 /synced_gnss(基本与绿色重合)
红色 前端里程计位姿 /transformed_odom
绿色 优化后的位姿 /optimized_key_frames
/optimized_odom(未用上)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

back_end中,关键帧点云数据保存在 slam_data 文件夹下 使用的时候再去读取(节省内存)

        // 把关键帧点云存储到硬盘里
        std::string file_path = key_frames_path_ + "/key_frame_" + std::to_string(key_frames_deque_.size()) + ".pcd";
        pcl::io::savePCDFileBinary(file_path, *cloud_data.cloud_ptr);

回环检测中订阅了两个来自后端的数据:

    // subscriber
    key_frame_sub_ptr_ = std::make_shared<KeyFrameSubscriber>(nh, "/key_frame", 100000);
    key_gnss_sub_ptr_ = std::make_shared<KeyFrameSubscriber>(nh, "/key_gnss", 100000);

两个数据区别如下:

        KeyFrame key_frame;
        key_frame.time = laser_odom.time;
        key_frame.index = (unsigned int)key_frames_deque_.size();
        key_frame.pose = laser_odom.pose;
        key_frames_deque_.push_back(key_frame);
        current_key_frame_ = key_frame;

        current_key_gnss_.time = gnss_odom.time;
        current_key_gnss_.index = key_frame.index;
        current_key_gnss_.pose = gnss_odom.pose;

/key_frame数据中存的是激光里程计的时间和位姿,/key_gnss存的是原始组合导航的

class KeyFrame:

class KeyFrame {
   
   
  public:
    double time = 0.0;
    unsigned int index = 0;
    Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();

  public:
    Eigen::Quaternionf GetQuaternion();
};
bool LoopClosingFlow::Run() {
   
   
    if (!ReadData())
        return false;

    while(HasData()) {
   
   
    
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值