关键词:紧耦合,gtsam
IMU在此处的效果:使用imu的结果对点云去畸变;对Lidar Odometry提供较好的初值(取消了帧间里程计);lidar odometry得到的结果也可以用来估计imu的零偏(紧耦合的体现)
为了保证实时性:
在位姿优化时边缘化旧的Lidar帧,而不是用Lidar帧和全局地图去匹配。在局部范围的帧匹配(不是全局范围)极大的提高了实时性。这个局部的地图是由选取的关键帧组成的,用的是一种滑窗的方法,让新的关键帧和固定大小的”sub-keyframes”进行配准。
这里主要是提及了使用imu进行松耦合和紧耦合:
符号定义:
世界坐标系 W W W,机器人坐标系 B B B,把IMU的坐标系就认为是 B B B系(在紧耦合框架中是常用做法)。机器人的状态量 x x x就可以写成:
x = [ R T , p T , v T , b T ] T ( 1 ) x = [R^T, p^T, v^T, b^T]^T \ \ \ \ (1) x=[RT,pT,vT,bT]T (1)
此处有 R ∈ S O ( 3 ) R \in SO(3) R∈SO(3)表旋转矩阵 p ∈ R 3 p \in \mathbb{R}^3 p∈R3为位移, v v v是速度, b b b是imu的bias。从 B B B系到 W W W系的变换矩阵 T ∈ S E ( 3 ) T \in SE(3) T∈SE(3)可以被表示为: T = [ R ∣ p ] T = [R | p] T=[R∣p].
问题的提出:
这里就是用Lidar,imu,GPS(可选)几种数据的观测值,来求得机器人的位姿。这个问题可以可以被构建成最大后验问题,作者使用因子图来对该问题进行建模(论文中说:factor graph is better suited to perform inference when compared with Bayes nets,也是isam的优点(? 不太理解原因))。基于高斯噪声的假设,这个问题的MAP inference就相当于是来解决非线性最小二乘优化问题
<怎么把slam问题转化成最小二乘问题见slam十四讲>
四个因子:imu预积分,激光雷达里程计,GPS,回环
因子图的变量:机器人的状态量
什么时候把新的机器人状态量节点加入因子图?
答:当且仅当机器人的位姿变化超过了用户定义的阈值时(此时认为他是关键帧,只有关键帧才被加入因子图)。使用isam2插入新节点对因子图进行优化。
作用:提供两帧间的相对约束关系
LIO-SAM中是使用的9轴的imu,除了加速度计和陀螺仪(角速度),还有三个自由度的姿态信息(朝向)。预积分只用到前六个信息。注意加速度计中要考虑到重力的影响(如果是在本地做实验,重力加速度的变化忽略不计)。
imu的观测值(在B系):
ω ^ t = ω t + b t ω + n t ω a ^ t = R t B W ( a t − g ) + b t a + n t a \hat{\omega}_t = \omega_t + b_t^{\omega} + n_t^{\omega} \\ \hat{a}_t = R_t^{BW} (a_t - g)+ b_t^a+ n_t^a ω^t=ωt+btω+ntωa^t=RtBW(at−g)+bta+nta
即测量值除了真值还包括了零偏和噪声,重力g在世界坐标系下不变。
可以利用imu的测量结果来推测机器人的运动,可以求得世界坐标系下的速度,位置,旋转,这里代入的就是imu系下加速度的真值:
v t + Δ t = v t + g Δ t + R t W B ( a ^ t − b t a − n t a ) Δ t p t + Δ t = p t + v t Δ t + 1 2 g Δ t 2 + 1 2 R t W B ( a ^ t − b t a − n t a ) Δ t 2 R t + Δ t = R t e x p ( ( ω t − b t ω − n t ω ) Δ t ) v_{t+\Delta t} = v_t + g \Delta t + R_t^{WB}(\hat{a}_t - b_t^a - n_t^a) \Delta t \\ p_{t + \Delta t}= p_t + v_t \Delta t + \frac{1}{2} g \Delta t^2 + \frac{1}{2}R_t^{WB}(\hat{a}_t - b_t^a - n_t^a)\Delta t^2 \\ R_{t+\Delta t} = R_t exp((\omega_t - b_t^{\omega} - n_t^{\omega}) \Delta t) vt+Δt=vt+gΔt+RtWB(a^t−bta−nta)Δtpt+Δt=pt+vtΔt+21gΔt2+21RtWB(a^t−bta−nta)Δt2Rt+Δt=Rtexp((ωt−btω−ntω)Δt)(最后的式子是把角度做指数映射变旋转矩阵)
由于 Δ t \Delta t Δt时间特别短,所以假定这段时间内加速度,角速度和零偏是定值。
然后使用imu预积分来获得两帧之间的相对运动,在时间i和j之间的预积分的测量值 Δ v i j \Delta v_{ij} Δvij, Δ p i j \Delta p_{ij} Δpij和 Δ R i j \Delta R_{ij} ΔRij可以按照如下计算:
Δ v i j = R i T ( v j − v i − g Δ t i j ) p i j = R i T ( p j − p i − v i Δ t i j − 1 2 g Δ t i j 2 ) Δ R i j = R i T R j \Delta v_{ij} = R_i^T(v_j - v_i -g\Delta t_{ij}) \\ p_{ij} = R_i^T(p_j - p_i -v_i\Delta t_{ij} - \frac{1}{2}g \Delta t_{ij}^2) \\ \Delta R_{ij} = R_i^T R_j Δvij=RiT(vj−vi−gΔtij)pij=RiT(pj−pi−viΔtij−21gΔtij2)ΔRij=RiTRj
∗ * ∗预积分论文 On-Manifold Preintegration for Real-Time Visual-Inertial Odometry
类似于LOAM,使用边缘点和面特征点。
但在这里,作者考虑到如果用每一帧来计算和增加因子,计算量会很大,所以这里引入了视觉slam中“关键帧”方法。被选择为关键帧的条件是:如果和之前的状态 x i x_i xi相比,机器人位姿的变化超过了设定的阈值(平移1m/角度10°),那么就把当前帧设置为关键帧 F i + 1 \mathbb{F}_{i+1} Fi+1。新保存的这个关键帧在因子图中和一个新的机器人状态节点 x i + 1 x_{i+1} xi+1关联,两关键帧之间的帧会被舍弃。
使用关键帧的好处: 不仅是对地图密度和内存的平衡,也有利于保持相对稀疏的因子图(才能做实时非线性优化)。
如何生成Lidar里程计因子?
1)构建局部地图 M i M_i Mi:选离当前帧最近的25个关键帧,使用变换矩阵并把他们转到世界坐标系下拼成一个局部地图;由于提取了边缘点和面点两种特征,所以这里的局部地图也是分成了两个,最后还要分别对他两进行下采样,对 M i e M_i^e Mie下采样分辨率为0.2m, M i p M_i^p Mip的为0.4m。
2)帧匹配:此时就是要把当前帧 F i + 1 \mathbb{F}_{i+1} Fi+1,即两个特征点云 { F i + 1 e , F i + 1 p } \{ F_{i+1}^e, F_{i+1}^p\} {Fi+1e,Fi+1p}和局部地图 M i M_i Mi进行匹配,这里还是使用了LOAM中的方法。先把当前帧的特征点转到世界坐标系,这个初始的转换矩阵 T ~ i + 1 \tilde{T}_{i+1} T~i+1是从imu的数据得来,然后在地图中用KD树找到当前关键帧中对应的特征点,用LOAM中的点到线&点到面距离最小化得到优化后的位姿。
3)相对变换:此时可以得到i+1时刻的位姿 T i + 1 T_{i+1} Ti+1, 又因为已知 T i T_{i} Ti, 所以可求 Δ T i , i + 1 = T i T T i + 1 \Delta T_{i,i+1} = T_i^T T_{i+1} ΔTi,i+1=TiTTi+1。一方面,imu预积分会对第i和第i+1帧进行约束,同时帧匹配的结果也会对这两帧的旋转和平移进行约束。
如果只用imu和lidar,系统还是会在长期任务中有漂移,所以要有提供全局测量信息的传感器消除漂移,比如高度仪,指南针,GPS。
作者认为:没有必要频繁的插入GPS的观测,因为lidar inertial odometry的漂移是十分缓慢的,所以只在估计的位姿不确定度大于收到的GPS位姿不确定度时,采增加GPS因子。
具体方法: 首先,先把GPS的测量值(经度和纬度)转换到本地的笛卡尔坐标系。一旦因子图中增加了新的节点,就要把一个新的GPS因子关联到这个节点。如果GPS信号没有和lidar做硬件同步,就要在lidar帧时间戳的基础上对GPS的测量值进行线性插值。
具体方法: 基于欧氏距离的回环检测方法 + 帧到局部地图的ICP匹配。
当一个新的状态 x i + 1 x_{i+1} xi+1加入了因子图时,首先去找在欧几里得空间中靠近 x i + 1 x_{i+1} xi+1的先验状态(15m),如下图所示,比如说 x 3 x_3 x3是返回的候选,接下来就尝试用 F i + 1 \mathbb{F}_{i+1} Fi+1去和 { F 3 − m , . . . , F 3 , . . . , F 3 + m } \{ \mathbb{F_{3-m}},...,\mathbb{F_3},...,\mathbb{F_{3+m}}\} {F3−m,...,F3,...,F3+m}进行匹配(文中m=12)。在匹配之前,先把当前关键帧和局部地图投影到世界坐标系。在获得相对变换 Δ T 3 , i + 1 \Delta T_{3, i+1} ΔT3,i+1之后将它作为回环因子加入图中。
实际中,作者发现使用回环因子对于修正机器人在高度方向的漂移是非常有用的,因为GPS的高度的测量是非常不准确的(作者的代码中只采用了GPS的x和y方向的信息)。作者说没有回环的情况下,仅用GPS高度误差能到100m这种离谱程度。
实验设备:16线lidar,9轴imu,GPS
数据集:5个场景,包括“Rotation”, “Walking”, “Campus”,“Park”, “Amsterdam” 。
数据集Rotation
这个数据集只使用了imu预积分和lidar里程计因子
LIO-SAM的结构细节更多,因为在快速旋转时,它的lidar帧在 S O ( 3 ) SO(3) SO(3)匹配更准。
数据集walking
用来评价系统在大位移大旋转SE(3)时的表现。
LIOM会处理所有的测量值,所以达不到实时的表现,而LOAM和LIO-SAM都可以实时。这个测试中也没有用上GPS和回环因子
数据集Campus
这个测试是为了看引入GPS和回环因子的好处。关于这个场景,论文有说校园里有很多树,所以GPS的结果多数时候不太准。GPS有效的时间看下面的轨迹图。
数据集Park
LIOM依然不能实时运行。在这个数据集,LIO-GPS虽然在俯视图回到了远点,但是高度漂移太大了,导致不能回环。
数据集Amsterdam
这个数据集的挑战性:
由于这些挑战,LOAM、LIOM和LIO-odom
在这个测试中都没有产生有意义的结果。与在公园数据集中遇到的问题类似,LIO-GPS在返回机器人的初始位置时,由于高度的漂移而无法闭环,这进一步促使作者在LIO-SAM中使用闭环因子。
F. Benchmarking Results
这里作者提到,运行速度主要是受环境中特征点云的密度的影响,受因子图节点数量和因子数量的影响更小。