IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 激光点云的畸变校正 -> 正文阅读

[人工智能]激光点云的畸变校正

0.引言

校正由于运动引起的激光点云畸变。

点云去畸变的方法包括:

  • 纯估计方法(ICP/VICP)
  • 传感器辅助方法(IMU/ODOM)
  • 融合的方法

这里学习的也是传感器辅助方法。多余的也不再赘述,自己理一下几个坐标关系并做记录。

1.理解几个坐标系的关系

畸变产生的原因如图所示,自己理解也是基于这张图进行理解。


图片来源

这个坐标系关系和后续的代码相对应。

请添加图片描述

通过线性插值,计算补偿矩阵的原理:

请添加图片描述
雷达扫描一帧的时间是固定的,通过计算得到每个点的采集时刻,将所有点都统一到同一时刻,**假设选择每完成一帧扫描的结束时刻,**如图所示,直观的理解就是:

  • 1.时间越靠近 t k t_k tk? ,补偿矩阵越近似于 T k + 1 , k T_{k+1,k} Tk+1,k?
  • 2.时间越靠近 t k + 1 t_{k+1} tk+1? ,补偿矩阵越接近于单位阵,就是不需要补偿

T i = t k + 1 ? t i t k + 1 ? t k T k + 1 , k T^{i}=\frac{t_{k+1}-t_{i}}{t_{k+1}-t_{k}} T_{k+1, k} Ti=tk+1??tk?tk+1??ti??Tk+1,k?

最后将相应的点云乘上补偿矩阵即可。

2.代码阅读


/**
 * @description:激光雷达运动补偿: 使用里程计数据进行运动补偿
 *              IMU 与 lidar先标定
 *              里程计数据是通过IMU计算所得
 * @param :Transform &extr: the extr is T_imu_lidar
            LoaderPointcloudPtr org_pc:运动补偿前
            PointCloudXYZNPtr comp_pc:运动补偿后
            double min_time:t_k
            double max_time:t_k+1
            Transform &start_pose:IMU pose t_k
            Transform &end_pose:IMU pose t_k+1
 */
void LidarMotionCompensation(Transform &extr, LoaderPointcloudPtr org_pc,
                             PointCloudXYZNPtr comp_pc, double min_time,
                             double max_time, Transform &start_pose,
                             Transform &end_pose) {
  // the pose is imu pose T_w_imu
  // 将IMU pose转到lidar下
  Transform start_lidar_pose = start_pose * extr;
  Transform end_lidar_pose = end_pose * extr;
  // 两帧之间的相对位姿 T_k+1,k
  Transform relative_pose = end_lidar_pose.inverse() * start_lidar_pose;

  Eigen::Vector3f relative_tran = relative_pose.translation_;
  Eigen::Quaternionf relative_quat = relative_pose.rotation_;

  pcl::PointCloud<pcl::PointXYZ>::Ptr temp_pc(
      new pcl::PointCloud<pcl::PointXYZ>());

  // 使用其他传感器辅助进行运动补偿
  // https://zhuanlan.zhihu.com/p/351109327
  //  temp_pc->resize(org_pc->size());
  double time_range = max_time - min_time;
  // !对每个点计算补偿变换矩阵
  for (int i = 0; i < org_pc->size(); i++) {
    auto point = org_pc->points[i]; // 补偿前的点
    double ratio = (max_time - point.timestamp) / time_range;
    Eigen::Quaternionf identity_; 
    identity_.setIdentity(); // 初始化为单位四元数
    // step 1.计算两个四元数间的球面线性插值,并利用四元数初始化补偿变换矩阵;
    Eigen::Affine3f trans(identity_.slerp(ratio, relative_quat));
    // step 2 平移部分直接进行线性插值
    trans.translation() = ratio * relative_tran;
    Eigen::Vector3f pt(point.x, point.y, point.z);
    Eigen::Vector3f comp_pt = pt;
    // step 3 原始点 * 补偿矩阵
    if (max_time - min_time > 1e-3) {
      comp_pt = trans * pt;
      std::cout << "trans the point" << std::endl;
    }

    // std::cout<<"org pt "<<pt.transpose()<<std::endl;
    // std::cout<<"comp pt "<<comp_pt.transpose()<<std::endl;
    // std::cout<<"trans pose " <<trans.matrix()<<std::endl;

    if (std::isnan(comp_pt[0]) || std::isnan(comp_pt[1]) ||
        std::isnan(comp_pt[2]))
      continue;
    pcl::PointXYZ pc;
    pc.x = comp_pt[0];
    pc.y = comp_pt[1];
    pc.z = comp_pt[2];

    temp_pc->points.push_back(pc);
    // temp_pc->points[i].x = comp_pt[0];
    // temp_pc->points[i].y = comp_pt[1];
    // temp_pc->points[i].z = comp_pt[2];
  }

  // std::cout<<"org pc is "<<org_pc->size()<<std::endl;
  // std::cout<<"temp pc is "<<temp_pc->size()<<std::endl;
  // step 4 估计法向量
  pcl::NormalEstimationOMP<pcl::PointXYZ, PointXYZN> norm_est;
  pcl::search::KdTree<pcl::PointXYZ>::Ptr kdtree(
      new pcl::search::KdTree<pcl::PointXYZ>());

  norm_est.setNumberOfThreads(8);
  norm_est.setInputCloud(temp_pc);
  norm_est.setSearchMethod(kdtree);
  norm_est.setKSearch(20);
  norm_est.compute(*comp_pc);
}
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-03-24 00:32:32  更:2022-03-24 00:34:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 14:43:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码