简单理解VIO(一)


随着AIOT(AI+Iot)技术的发展,任务移动的模块在不久的未来都将配备MEMS IMU,以确定设备的位置与姿态,做出更智能的决策与反应。以手机为例,从iPhone4开始,后续的手机均配备了三轴陀螺仪,从小米2开始就配备IMU,相信未来不管是旗舰机还是普通手机,配备IMU都将是基本配置,就像手机配备照相的镜头一样。
但是由于IMU本身只能提供局部信息且与环境无关,仅依赖IMU并不能为移动设备提供定姿定位服务,使用IMU与视觉的融合,可以为移动设备提供稳定高频的定位信息。

一、预备知识回顾

1. 场景预设

为了更好的简化复杂的逻辑,我们假设机器人在屋里的平面上移动。

2. 三维刚体运动

可以用一个比较形象的例子来说明,假设人的眼睛为视觉,人体的陀螺仪(@todo)为惯性设备,那需要定义三个坐标系:

  • 世界坐标系W,原点在一楼
  • IMU坐标系I; 原点在后脑勺(小脑部分)
  • 相机坐标系C;原点在左眼

坐标系之间的变换关系是一个旋转与平移,由 T W I ∈ S E ( 3 ) T_{WI} \in SE(3) TWISE(3) 给出,如从I到W的变换矩阵为 T W I T_{WI} TWI, 坐标系转换关系:
P W = T W I ∗ P I P^{W} = T_{WI} * P^{I} PW=TWIPI
其中 P P P为齐次坐标形式,当表示为正常坐标形式时:
P W = R W I P I + t W I P^{W} = R_{WI}P^{I} + t_{WI} PW=RWIPI+tWI

3. 四元数

  • 四元数解决的问题有两个:
    • 解决了欧拉角旋转奇异的问题
    • 提高了旋转计算的精度
  • 四元数的表示,用一个实部和一个虚部来表示: q = [ q 0 , q 1 , q 2 , q 3 ] q = [q_0, q_1, q_2, q_3] q=[q0,q1,q2,q3]. 当我们只有yaw角(z轴)时,例如逆时针旋转30°,用欧拉角表示为[0, 0, π / 6 \pi/6 π/6]. 对应的四元数为 q = [ 0.966 , 0 , 0 , 0.259 ] q = [0.966, 0, 0, 0.259] q=[0.966,0,0,0.259]. 其中x轴,y轴都是0.
  • 四元数之间可以进行乘法运算(以yaw角转动为例):
    • q a ⊗ q b = ( w a w b − z a z b ) + ( w a z b + z a w b ) k q_a \otimes q_b = (w_aw_b - z_az_b) + (w_az_b + z_aw_b)k qaqb=(wawbzazb)+(wazb+zawb)k
    • y a w = π / 6 yaw = \pi/6 yaw=π/6为例, q a ⊗ q b = [ 0.866 , 0 , 0 , 0.500 ] q_a \otimes q_b = [0.866, 0, 0, 0.500] qaqb=[0.866,0,0,0.500],即等于两个三十度相乘。验证方法:四元数在线转换
  • 四元数的精妙之处在于,利用复数的乘法,定义了四元数的乘法,以此来表示旋转矩阵的相乘
  • 四元数时间导数
    • WHY:为什么要求时间的导数呢?那四元数是一个关于时间的函数吗?任何系统应该都是与时间相关的,对于移动设备尤其如此 。前面的这个理解不精准,求导的原因与泰勒公式有关,与系统动态有关,见我的另外一篇控制的笔记
    • HOW:通过角速度,就可以将姿态与时间联系起来
    • WHAT:假设以1°/s的速度逆时针旋转,以当前旋转为局部坐标系,那么时间基准t时刻的角度可以认为是0(因为偏导数是一个向量,与起点在哪里并没有关系),那么就有(@todo):
      lim ⁡ δ t − > 0 q ( t + δ t ) − q ( t ) δ t = lim ⁡ δ t − > 0 q ( δ t ) − q ( 0 ) δ t \lim_{\delta t->0} \frac{q(t+\delta t) - q(t)}{\delta t} = \lim_{\delta t->0} \frac{q(\delta t) - q(0)}{\delta t} δt>0limδtq(t+δt)q(t)=δt>0limδtq(δt)q(0)
      = lim ⁡ δ t − > 0 [ cos ⁡ ( δ t / 2 ) , [ 0 , 0 , 1 ] T sin ⁡ ( δ / 2 ) ] − [ 1 , 0 , 0 , 0 ] δ t = \lim_{\delta t->0} \frac{[\cos(\delta t/2), [0,0,1]^T\sin(\delta /2)] - [1, 0, 0, 0]}{\delta t} =δt>0limδt[cos(δt/2),[0,0,1]Tsin(δ/2)][1,0,0,0]
      = lim ⁡ δ t − > 0 [ − 1 / 2 sin ⁡ ( δ t / 2 ) , 1 / 2 [ 0 , 0 , 1 ] T cos ⁡ ( δ / 2 ) ] = [ 0 , 1 2 w ] = \lim_{\delta t->0} [-1/2\sin(\delta t/2), 1/2[0,0,1]^T\cos(\delta /2)] = [0, \frac{1}{2}w] =δt>0lim[1/2sin(δt/2),1/2[0,0,1]Tcos(δ/2)]=[0,21w]
      这里是我的一种证明方式,我认为是最简单的
  • 一个函数关于四元数的导数,可以通过求导工具来求。或者,使用李代数中求导法则。
  1. 李代数
    关于李代数在机器人中的应用,最好的参考文献是2.

作业

  1. 使用R或者是q更新,当w足够小时,差异不大。
clc
angles1 = [pi/6, 0, 0];
q1 = quaternion(eul2quat(angles1));
R1 = quat2rotm(q1);
w = [0.01, 0.02, 0.03]';
R2 = R1 * expm(skew(w(1), w(2), w(3)));
q2 = q1 * quaternion([1; 0.5 * w]');
dif = rotm2eul(R2) - quat2eul(q2)
dif =   1.0e-05 *
    0.3524    0.2297    0.1236

参考文献

  1. VIO第一讲课件: 链接: https://pan.baidu.com/s/1iqOANw_zmX9ujk_6KsZmBQ 提取码: x269
  2. 链接: https://pan.baidu.com/s/1Wh48ra7_5Qyu-G05BnXysA 提取码: i1rh 复制这段内容后打开百度网盘手机App,操作更方便哦
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手持电烙铁的侠客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值