VINS-Mono-VIO初始化 (六:基于已知重力对重力方向进行调整)

可以通过查表的方式直到重力的大小,假设为9.81,我们取出重力的方向然后大小直接设置为9.81
这样调整的目的是因为,上一节求解的方程中的已知量中也是包含的重力的误差影响在里面的,需要这样对误差调整回来

论文中的图如下
VINS-Mono-VIO初始化 (六:基于已知重力对重力方向进行调整)_第1张图片
我们就调整重力的方向 g ^ ⃗ \vec{\hat{g}} g^
我们一定是在球面上运动的,我们以向之前求出的向量的起点为圆心,9.81作为半径,与球面的切平面取相互正交的两个向量 b 1 ⃗ , b 2 ⃗ \vec{b_{1}},\vec{b_{2}} b1 ,b2 ,这两个向量相乘就是重力方向,这样就能对重力方向进行调整,三个量是必然互相垂直的
调整公式为,调整 w 1 , w 2 w_{1},w_{2} w1,w2 的大小就可以调整重力方向大小
g = ∣ ∣ g ∣ ∣ ⋅ g ⃗ + w 1 b 1 ⃗ + w 2 b 2 ⃗ g=||g||·\vec{g}+w_{1}\vec{b_{1}}+w_{2}\vec{b_{2}} g=∣∣g∣∣g +w1b1 +w2b2
然后还是和上一节一样的求解方式去叠加矩阵,不过这时候代码中的 g g g 变成 B ⋅ W B·W BW 来代替, W ∈ 2 × 1 W∈2×1 W2×1 指的是权重变化, B ∈ 3 × 2 B∈3×2 B3×2 指的是两个垂直向量

需要先找到两个垂直向量再重复上一节的操作进行相乘,不过这里是迭代操作进行求解,上一节的操作其实相当于是提供一个初始值

代码中进行矩阵相乘实际上是相当于点乘
a ⃗ ⋅ t e m p ⃗ = ∣ ∣ a ∣ ∣ ⋅ ∣ ∣ t e m p ∣ ∣ ⋅ c o s θ \vec{a}·\vec{temp}=||a||·||temp||·cosθ a temp =∣∣a∣∣∣∣temp∣∣cosθ,这两个模都是1,temp是1 0 0或者0 0 1 ,这里的 a ⃗ \vec{a} a 是重力归一化的结果,则这两个点乘的结果就是 c o s θ cosθ cosθ
在这里插入图片描述

a.transport*temp=cosθ

然后向量 a ⃗ \vec{a} a 再乘上这个 c o s θ cosθ cosθ 获得了向量a的长度,这个 a ⃗ \vec{a} a 是平行于 g ⃗ \vec{g} g 的,和重力方向相同

VINS-Mono-VIO初始化 (六:基于已知重力对重力方向进行调整)_第2张图片
再使用 t e m p ⃗ \vec{temp} temp 减去 a ⃗ \vec{a} a 即可获得垂直于 a ⃗ \vec{a} a 的向量
根据这个示意图,这样就可以获得与 a ⃗ \vec{a} a 垂直的向量了,减完后用 normalized() 这样就变成单位矢量了
然后把 a ⃗ × b ⃗ \vec{a}×\vec{b} a ×b 就获得了第3个垂直的向量了
个人理解: 其实这个切平面的向量是可以任意方向的,毕竟绕着重力向量旋转的任意正交向量都符合,这个temp向量只是一个临时向量去固定其中一个平面,找到对应的向量而已

代码中系数除以100,结果也除以100是因为,系数除以100的话那么结果为了满足要求就会放大100倍,所以结果也要除以100,这是放大数据为了数值解的稳定性

你可能感兴趣的:(VINS系列专栏,自动驾驶,算法,线性代数,slam)