2D激光雷达运动畸变校正的介绍见上一篇:SLAM学习日志(一) 2D(单线)激光雷达运动畸变校正(1 介绍篇) 具体代码实现见本人的github链接: 2d_lidar_undistortion emm这篇博文其实是我毕业设计的一部分。我的毕业设计内容主要是从头实现一个2D激光SLAM的框架,由于机器人在运动过程中,旋转的运动畸变对地图质量产生较大影响,就很想先通过IMU数据来实现激光雷达数据的畸变校正。当时查阅网络发现相关的具体资料不是很多,就自己花了几天时间研究并实现了出来。想法主要参考了深蓝学院的激光SLAM课程。 考虑到机器人运动速度较快时,平移带来的畸变同样不可忽视,因此,我也实现了订阅ROS里程计数据进行旋转平移校正的内容,后续也会补充进GitHub。
本论文激光雷达运动畸变校正的原理是:首先,在计算机接收激光雷达数据的同时,以较高频率接收IMU的姿态角数据,并将其保存在循环队列中。然后,根据激光雷达数据的时间戳以及激光雷达的采样间隔,求得每个激光点在采样时的精确时间。最后,在IMU队列中查找在时间上相邻的两帧IMU数据。假设机器人在相邻IMU数据帧间为匀速运动,通过球面线性插值的方法估计每个激光点在测量时刻的姿态,最终依次将同一激光数据帧的所有激光点变换至同一时刻的机器人姿态下。
上述的球面线性插值(Spherical linear interpolation),是四元数的一种线性插值运算,主要用于在两个表示旋转的四元数之间平滑差值,常以 Slerp ( q 0 , q 1 , μ ) \operatorname{Slerp}\left(q_{0}, q_{1}, \mu\right) Slerp(q0,q1,μ)表示,其中 μ ∈ [ 0 , 1 ] \mu \in[0,1] μ∈[0,1]。 球面线性插值的概念最早由Ken Shoemake提出,被广泛用于计算机图形学。其分别给出了在几何形式下与在单位四元数形式下的球面线性插值公式:
几何形式: cos ( Ω ) = q 0 ⋅ q 1 \cos (\Omega)=q_{0} \cdot q_{1} cos(Ω)=q0⋅q1 Slerp ( q 0 , q 1 , μ ) = q 0 sin ( ( 1 − μ ) Ω ) + q 1 sin ( μ Ω ) sin ( Ω ) (1) \operatorname{Slerp}\left(q_{0}, q_{1}, \mu\right)=\frac{q_{0} \sin ((1-\mu) \Omega)+q_{1} \sin (\mu \Omega)}{\sin (\Omega)} \tag{1} Slerp(q0,q1,μ)=sin(Ω)q0sin((1−μ)Ω)+q1sin(μΩ)(1)单位四元数形式: Slerp ( q 0 , q 1 , μ ) = q 0 ( q 0 − 1 q 1 ) μ (2) \operatorname{Slerp}\left(q_{0}, q_{1}, \mu\right)=q_{0}\left(q_{0}^{-1} q_{1}\right)^{\mu}\tag{2} Slerp(q0,q1,μ)=q0(q0−1q1)μ(2)由于四元数的幂运算较为复杂,会耗费大量计算资源,所以在实际应用时,通常使用公式2进行球面线性插值的计算。
假设当前对最新收到的激光雷达的第n个雷达扫描点进行畸变校正。如上图所示,激光雷达数据帧开始时刻为 t lidar t_{\text {lidar}} tlidar,激光雷达采样周期为 Δ t \Delta t Δt,则该扫描点的采样时刻为 t n = t lidar + ( n − 1 ) Δ t t_{n}=t_{\text {lidar}}+(n-1) \Delta t tn=tlidar+(n−1)Δt。经查询得到该扫描点相邻两帧IMU数据的采样时刻与姿态分别为: t m t_{m} tm、 q m q_{m} qm与 t m − 1 t_{m-1} tm−1、 q m − 1 q_{m-1} qm−1则计算可得: μ = t n − t m t m − 1 − t m (3) \mu=\frac{t_{n}-t_{m}}{t_{m-1}-t_{m}}\tag{3} μ=tm−1−tmtn−tm(3) 根据公式1,可以得到: q n = Slerp ( q m , q m − 1 , μ ) (4) q_{n}=\operatorname{Slerp}\left(q_{m}, q_{m-1}, \mu\right)\tag{4} qn=Slerp(qm,qm−1,μ)(4) 已知该雷达扫描点相对于激光雷达坐标系的空间坐标 p n = [ x n , y n , z n ] T p_{n}=\left[x_{n}, y_{n}, z_{n}\right]^{\mathrm{T}} pn=[xn,yn,zn]T,并将四元数 q 0 q_{0} q0、 q n q_{n} qn分别转换至 R 0 \mathbf{R}_{0} R0, R n \mathbf{R}_{n} Rn,最后,通过坐标变换公式可以计算得到该扫描点校正后的坐标: p n ′ = R 0 − 1 R n p n (5) p_{n}^{\prime}=\mathbf{R}_{0}^{-1} \mathbf{R}_{n} p_{n}\tag{5} pn′=R0−1Rnpn(5)
