点击上方“3D视觉工坊”,选择“星标”

干货第一时间送达

作者丨Livox 览沃激光雷达@知乎

来源丨https://zhuanlan.zhihu.com/p/442741667

编辑丨3D视觉工坊

一、什么是激光雷达自运动畸变

激光雷达通过发射激光束来测量周围环境物体的距离和方位,从而判断车辆与障碍物的相对位置。当其发射的激光束足够多时,这一个个的激光点将汇集成一片点云,勾勒出其所处的三维环境信息,这便是我们常说的点云数据。

对于多数激光雷达而言,尽管激光的发射与接收很快,但构成点云的每一个点仍非同一时刻生成的。一般我们会将100ms (对应典型值10Hz) 内累积的数据作为一帧点云输出。若在这100ms内,激光雷达本体或安装所在的机体发生绝对位置的变化,那么此帧点云中每一个点的坐标系就是不同的。直观上看,这一帧点云数据就会发生一定的“变形”,不能真实对应所探测到的环境信息,类似于拍照时手抖了,拍出来的照片就会糊。这便是激光雷达的自运动畸变。

二、自运动畸变产生的本质以及校正

我们来具体看一看自运动畸变是什么样的。激光雷达点云自运动畸变的形态,与其扫描方式是相关的。比如传统360度机械式激光雷达每一帧,是以雷达为中心环绕扫描一周(100ms)得到的。当雷达本体或所在车体静止时,扫描起始点和终止点可以比较好地闭合(坐标原点始终保持不变)。而当雷达或自车运动时,自运动畸变就会发生,环绕一圈的数据就会发生扭曲,导致环绕不再闭合(不同点的坐标原点不同)。

图1 360度机械式激光雷达自运动畸变示意

我们再深入分析一下这一现象的本质。简单来说,激光雷达点云自运动畸变的产生本质上是一帧中每一个点的坐标系不同。如下图,左图 p1~p3 表示激光雷达依次扫描到的三个位置点,这三点在真实世界中共线。但由于激光雷达自身在一帧时间内存在“剧烈”运动,如中间图所示,雷达自身分别在三个不同的实际姿态下对三个点进行了扫描。因此在最后得到的点云中(最右图),三个点坐标实际处于不同的坐标系,看起来不再共线了。

图2 点云坐标系发生变化

下图 3 也给出一个实际应用的例子。

搭载 Livox 激光雷达的车辆因自身掉头发生了自运动畸变:远处的墙体和车辆都因为自车快速旋转产生了分层现象。

图3 由于车体运动,路边停放的车辆点云出现分层

那么,自运动畸变要怎么校正呢?显然,只要我们把车开得足够的慢……

当然不是,只需要我们将这一帧内所有点的坐标系都转换到同一个,如图1 第一个点 p1 所在的雷达坐标系,这本质上就是对雷达的运动进行补偿。

我们以 表示 在雷达坐标系1 中的坐标,坐标系 i 到 j 的转换表示为 。则一帧点云中每个点到第一个点坐标系的转化分别为 ……,用下式可轻松将对应点坐标转到第一个点所在坐标系:

原理上看起来非常简单(实际也非常简单)。只要知道每个点的 就行了,那到底怎么知道呢?

在实际应用中,一般首先设法测量激光雷达的运动信息,如一帧点云首尾(100ms间隔)的雷达位姿变化 T。然后根据某点到初始点或末尾点之间的时间差 Δt,通过短时匀速假设进行线性插值得到该点的 。

位姿变化 T 可通过惯性导航系统(INS)或激光雷达里程计(LiDAR Odometry, 如 LIO-Livox )提供的位姿信息获得。若使用惯性测量单元(IMU,可提供角速度以及加速度信息)计算位姿变化,则需要额外提供雷达或者自车的初始速度信息。

那 Δt 的值怎么获得呢?

Livox 激光雷达输出自带每个点的时间戳。在获取点云的时候就可从点云数据包 Custom Msg中直接读取到。而其他雷达则可能需要根据各自雷达的 SDK 所提供信息或自行手动解算得到每个点的时间戳。

按上述公式将各个点坐标转换到同一坐标系,就是去畸变的过程了。

下图 4 展示了去畸变后的点云。

图4 上例点云去畸变后效果

三、自运动畸变校正工具使用及说明

上述去畸变的过程代码已上传 Github(https://github.com/Livox-SDK/livox_cloud_undistortion), 有兴趣的读者欢迎点击下方阅读原文查看。

代码说明:

依赖:livox_ros_driver,PCL,ROS编译:在工作空间下使用指令 catkin_make运行:

source devel/setup.bash

接口说明:

在 data_process.h 中定义了 ImuProcess 类,该类的成员函数 UndistortPcl 为去畸变函数,该函数参数中 Sophus::SE3d Tbe 为当前帧点云帧头和帧尾之间的位姿,如果可以直接提供该位姿,则可以调用该函数进行去畸变。如果只有IMU数据,则调用 ImuProcess 的成员函 Process 进行去畸变。

使用:

输入:此工具基于ros开发,因此输入信息为两个 topic,点云 topic 为 /livox/lidar, customMsg 格式,IMU 信息 topic为/livox/imu输出:校正后的点云 /livox_unidistort

特别说明:平移畸变的校正需要用户根据各自的平移信息来源(GPS位置坐标、速度等)手动计算对应时间差下的平移变化,作为 UndistortPcl 输入。

本文仅做学术分享,如有侵权,请联系删文。

3D视觉精品课程推荐:

1.面向自动驾驶领域的多传感器数据融合技术

2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)

9.从零搭建一套结构光3D重建系统[理论+源码+实践]

10.单目深度估计方法:算法梳理与代码实现

11.自动驾驶中的深度学习模型部署实战

12.相机模型与标定(单目+双目+鱼眼)

重磅!3DCVer-学术论文写作投稿 交流群已成立

扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。

同时也可申请加入我们的细分方向交流群,目前主要有3D视觉CV&深度学习SLAM三维重建点云后处理自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。

一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。

▲长按加微信群或投稿

▲长按关注公众号

3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

圈里有高质量教程资料、答疑解惑、助你高效解决问题

觉得有用,麻烦给个赞和在看~  

Livox 开源分享:关于激光雷达去畸变的那些事儿相关推荐

  1. 详解2D激光雷达运动畸变去除

    2D激光雷达运动畸变去除 1.激光雷达运动畸变的说明 如果是扫描频率5Hz的激光雷达,一帧数据的首尾时间差200ms,若机器人以0.5m/s的速度向x方向走扫描前面的墙面,那么200ms后尾部的测量距 ...

  2. 【开源分享】VIDO-SLAM:一种视觉惯性动态物体SLAM系统

    文章:Inertial-Only Optimization for Visual-Inertial Initialization 作者:Carlos Campos, Jose M.M. Montiel ...

  3. 图像去畸变矫正及双线性内插法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 通过采集的图像我们可以得到畸变后的图像,要得到没有畸变的图像要通过畸变模型推导其映射关系. 真实图像 ...

  4. 超实用!图像去畸变矫正及双线性内插法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 通过采集的图像我们可以得到畸变后的图像,要得到没有畸变的图像要通过畸变模型推导其映射关系. 真实图像 ...

  5. python导出dxf图_在PDMS中使用python直接生成管口方位图(开源分享第三集)

    在PDMS中使用python直接生成管口方位图(开源分享第三集) 距离上一次发推送已有5个月之久,上周立了冬,这二季我为五斗米折了腰,最近才缓过气来. 令我没想到的是,大家竟然对这个主题这么有兴趣,有 ...

  6. 【PCB开源分享】STC32G12K128/STC8H8K64U开发板

    [PCB开源分享]STC32G12K128/STC8H8K64U开发板 相关开源项目<[开源]STC单片机免冷启动自动下载器> <[PCB开源分享]STC8A8K64D4开发板> ...

  7. Cartographer中对激光雷达运动畸变的处理方法分析

    任务动机:梳理cartographer处理激光雷达运动畸变的原理,并针对特殊数据特性的雷达数据做相应适配,进而提升建图效果. 任务描述:查阅cartographer源码中激光雷达运动畸变的处理流程,对 ...

  8. AVM环视系统:鱼眼相机去畸变算法及实战

    作者丨中投靓仔@知乎 来源丨https://zhuanlan.zhihu.com/p/603296375 编辑丨自动驾驶与AI 点击进入->3D视觉工坊学习交流群 前言 在近一年的AVM算法开发 ...

  9. OpenCV 【十一】—— 图像去畸变,对极约束之undistort,initUndistortRectifyMap,undistort

    目录 0.极限约束,对极校正 1.摄像机成像原理简述 2.成像畸变 2.1. 畸变数学模型 2.2. 公式推导 3.畸变校正 3.1. 理论推导 4. 图像去畸变** 5. 图像尺度缩放与内参的关系* ...

最新文章

  1. Mac-sublime text 3破解版
  2. linux centos 6.8svn,CentOS6.8 安装配置以SVNAdmin管理SVN代码库
  3. 在Centos中yum安装和卸载软件的使用方法
  4. AtCoder Grand Contest 025
  5. HoloLens 2开发:获取并渲染双手
  6. 10 个最佳 GIS 软件应用程序
  7. 【洛谷试炼场】洛谷新手村——循环!循环!循环!
  8. Safari兼容IE
  9. 2021年微信视频号生态趋势调查报告|友望数据发布
  10. 那些变态的javascript输出
  11. C# PPT/PDF文件转图片,图片转PPT
  12. 1964年第一代电子计算机,电子计算机的发展
  13. linux之服务管理
  14. 什么是iBeacon?
  15. 618“低调”谢幕,百秋尚美如何携手品牌跨越“不确定时代”?
  16. 在HMM中,如果已知观察序列和产生观察序列的状态序列,那么可用以下哪种方法直接进行参数估计
  17. 折腾开源WRT的AC无线路由之路-3
  18. c补week1(linux c基本操作及C语言部分基础知识)
  19. 通信达股票交易接口使用步骤
  20. switch的简单举例

热门文章

  1. QT 实用代码片段 (持续更新)
  2. JS操作JSON总结
  3. 《DNS与BIND(第5版)》——4.10 下一步是什么
  4. js中常用的对象—String的属性和方法
  5. SpringMVC+SwfUpload进行多文件同时上传
  6. ICE专题:ICE起步
  7. 六种方式,教你在SpringBoot初始化时搞点事情!
  8. 吵疯了,Pull Request到底是个啥?
  9. BAT集体告别中台上半场!接下来,中台怎么玩?
  10. Redis中五大数据结构的底层实现