【论文导读】IDOL: Inertial Deep Orientation-Estimation and Localization

论文名称:IDOL: Inertial Deep Orientation-Estimation and Localization

开源项目地址:https://github.com/cmu-isl/idol-dataset

会议:AAAI

时间:2021

这篇论文主要解决的是基于智能手机IMU(惯性测量单元)的行人定位问题 ,特别针对传统IMU定位中因姿态估计误差导致的轨迹漂移问题 ,提出了一种两阶段深度学习框架 ,分别进行3D姿态估计2D位置估计

数据集

未明确命名,通常称为 IDOL Dataset,由作者团队自行采集

采集方式:

  • 使用 Kaarta Stencil SLAM系统(LiDAR+相机+Xsens IMU)作为高精度ground truth
  • 智能手机为 iPhone 8,采集频率为100Hz
  • 总时长:20小时
  • 覆盖:3栋不同建筑、15位不同体型用户
  • 包含:自然行走、变速、转弯、手持姿态变化等行为

已开源,github.com/cmu-isl/ido...

包含原始IMU数据(加速度、陀螺仪、磁力计)、ground truth轨迹(6D pose)、校准信息

主要工作

智能手机IMU(加速度计、陀螺仪、磁力计)可用于行人定位,但传统方法依赖手机提供的姿态估计(如iOS CoreMotion),这些估计存在较大误差 (>20°),会导致严重的定位漂移

论文提出:先估计准确的设备姿态(orientation),再基于该姿态估计位置(position) ,从而提升整体定位精度

方法阶段:

  • 阶段1:Orientation Module(姿态估计)

    • 输入:IMU原始数据(加速度、角速度、磁场)
    • 模型:2层LSTM(100隐藏单元) + Extended Kalman FilterEKF)融合陀螺仪积分
    • 输出:设备在全局坐标系下的3D姿态(四元数)
  • 阶段2:Position Module(位置估计)

    • 输入:经姿态旋转后的IMU数据(世界坐标系下)
    • 模型:2层双向LSTMBiLSTM)+ 全连接层
    • 输出:2D位移向量(Δx, Δy),累积得到轨迹

深度学习模型

Orientation Module: 3D 姿态估计

功能:把原始IMU读数映射为全局坐标系下的3D姿态(四元数),并给出该姿态的协方差,供后续 EKF 做融合

输入层

输入 a_{t}, ω_{t}, B_{t}

表示 t 时刻手机坐标系下的三轴加速度、三轴角速度、三轴磁场,共9维

维度:[B, T, 9]​ 其中,B: Batch, T: 时间窗长度, 训练时100 → 2000

  • 这里的 100 → 2000 是 curriculum learning
  • 第一个epoch,把20小时的轨迹切成 T=100 的小段送进网络
  • 每隔几个 epoch 把 T 增大(100 → 200 → 500 ... → 2000)
  • 目的:先让网络学会"短程不漂",再把能力外推到 20 秒级长序列

推断(测试)阶段

  • 不再用2000的固定窗,而是滑动1s长度的窗(≈100 步),每滑一次就 reset LSTM 状态

姿态网络

LSTM 编码器

结构为2层 LSTM, 每个100个隐藏单元

  • 输入:[B, T, 9]
  • 输出:隐藏状态序列 h_{t}: [B, T, 100], 最后一步隐藏 h_{T}: [B, 100](作为下一步全连接的输入)
姿态头(quaternion head)
  • h_{T} → FC(100→50) → tanh → FC(50→4) → L2-normalize
  • 输出:\hat{q_{t}}​(单位四元数,表示手机到世界坐标系的旋转)

维度:[B, 4]

协方差头(covariance head)
  • 操作:h_{T} → FC(100→50) → tanh → FC(50→6)
  • 输出:6维向量 → 解析为 3× 3 对称正定矩阵 \hat{Σ_{t}}

OrientNet 整体输入 [B, T, 9] → 输出 \hat{q_{t}} [B, 4] \hat{Σ_{t}} [B, 3, 3]

EKF 融合

状态:四元数 q_{t}(4 维)

过程更新:用陀螺仪 ω_{t}​ 做四元数加法

  • EKF 的"过程模型"要把角速度转成"旋转"加到上一时刻的估计姿态上

    • 角速度 → 轴角

      θ = ‖ω_{t}‖·Δt , a = ω_{t} / ‖ω_{t}‖​

    • 轴角 → 四元数增量

      Δq = [cos(θ/2), sin(θ/2)·a] (维度 [B,4​],单位四元数)

    • 四元数乘法(区别于逐元素加法!)

      q_{k}|{k-1} = q{k-1} ⊗ Δq (⊗ 是四元数乘法)

  • "四元数加法"只是论文里的口语化说法,实际是四元数乘法

测量更新:以 \hat{q_{t}}作为测量,\hat{Σ_{t}}​​ 作为测量噪声,用 box-minus/box-plus 在流形上更新

EKF 融合阶段,除了 OrientNet 给出的观测值\hat{q_{t}}(四元数姿态)观测噪声协方差\hat{Σ_{t}} (3×3)之外,还必须有以下3项才能完整运行滤波器:

  • 上一时刻的后验姿态 q_{t-1}|_{t-1} (4维四元数)

    这是 EKF 在上一次测量更新后保存下来的"当前最佳估计"

  • 当前陀螺仪角速度 ω_{t}

    用于过程模型:把 ω_{t} 转成四元数增量,预测下一时刻姿态 q_{t}|q_{t-1}

  • 过程噪声协方差 Q (3×3对角阵,论文设为 0.005·I_{3})

    描述陀螺仪积分的不确定性(漂移、噪声)

因此,EKF 每一次迭代真正融合的是:

{q_{t-1|{t-1}}, ω{t}, Q}(预测步)与 {\hat{q_{t}},\hat{Σ_{t}}}(更新步)

最后,输出当前时刻的最优姿态四元数,即最终姿态 q_{t}^{ekf}(维度仍为 [B,4])

坐标变换

用 q_{t}^{ekf} 把 IMU 读数 a_{body}, w_{body}(仍在手机坐标系) 旋转到世界坐标系

输出:a_{t}^{world}, ω_{t}^{world},维度仍为 [B,T,6],但坐标系已变成"世界系",可以直接喂给 PositionNet

之所以"坐标变换",是因为所有后续计算都需要把 IMU 读数转到统一的世界坐标系

Position Module: 2D 位置估计

把世界坐标系下的IMU读数映射为行人2D位移,再累积成轨迹

输入层

输入 a_{t}^{world}, ω_{t}^{world}(6 维)

维度:[B, T, 6]

PositionNet(位置网络)

Bi-LSTM 编码器

结构:2层双向LSTM,每层100维隐藏(前向 100 + 反向 100 = 200 维输出)

  • 输入:a_{t}^{world}, ω_{t}^{world} [B, T, 6]
  • 输出:隐藏状态 h_{t}^{pos}: [B, T, 200]
位移头(displacement head)

对每个时间步 t(或每个窗口)独立: h_{t}^{pos} → FC(200→50) → tanh → FC(50→20) → tanh → FC(20→2)

这里的"独立"有两层含义:

  • 位移预测只依赖当前窗口的局部信息,而不继承上一个窗口的任何内部状态

    • 在训练阶段:一条 20 min 的轨迹被切成 N 个互不重叠的 2000 步窗口;每个窗口送进网络时,LSTM 的隐藏状态都初始化为 0。窗口 A 算出的隐藏状态不会作为窗口 B 的初始状态
    • 在推断阶段:即便窗口之间有 50 % 重叠,每次把新的 2 s 片段送进网络时,同样把 LSTM 隐藏状态清零。上一个窗口的"记忆"被完全丢弃
  • 每个窗口只输出"这一段"的位移向量(而不是每帧都输出一次位移)

    • 网络只看这 2 s 的 IMU 数据,直接给出"这 2 s 内行人走了 (Δx, Δy) 米"
    • 不同窗口的位移预测互不影响------这就是"独立"

输出:Δx_{t}, Δy_{t}(相对窗口起始点的 2D 位移增量)

维度:[B, T, 2]

累积器

操作:把 Δx_{t}, Δy_{t} 累加 → X_{t}, Y_{t}​(相对窗口起点)

  • 这里的累加指的是把刚刚这个窗口算出的单一位移加到上一轨迹的终点,形成新的轨迹点
  • 第1个窗口输出Δ¹ → 轨迹从 0 走到 Δ¹;第 2 个窗口输出 Δ² → 轨迹继续走到 Δ¹+Δ²

维度:[B,T,2]

窗口化训练技巧

训练:窗口长度从 100 逐步升到 2000(课程式学习)

推断:每次滑动 1s 窗口,LSTM 状态不跨窗口传递,以抑制漂移

  • 每滑1次窗口就把隐藏状态清零(h_{0}、c_{0} 设 0),让网络只在 2 s 的局部上下文里做推断
  • 这样就能把漂移限制在2s内,而不会随着整条轨迹无限累积

损失函数

L_{pos} = MSE( (X_{T},Y_{T}) , (\hat{X_{T}}, \hat{Y_{T}}) )(仅监督窗口末端的位移误差

小结

Orientation Module 的核心是「LSTM 回归四元数 + EKF 平滑」

Position Module 的核心是「Bi-LSTM 回归位移」

两阶段通过「旋转后的 IMU 数据」解耦,既减少了姿态误差对定位的放大,又允许两网络分别优化(分开训练,单独调参,不会一个网络的误差直接放大到另一个网络)

补充:四元数

"在流形上更新"是什么意思

四元数属于三维球面 S³(一个流形),不能直接拿向量减法做更新

  • box-minus (⊟):把两个四元数的"差异"映射到 3 维切空间

δ = q₁ ⊟ q₂ = 2·log(q₂⁻¹ ⊗ q₁) (结果 [B,3] 轴角向量)

  • box-plus (⊞):把 3 维误差 δ 再映射回四元数

q₂ = q₁ ⊞ δ = q₁ ⊗ exp(δ/2) (结果回到 [B,4])

  • EKF 的校正公式

qₖ = qₖ|ₖ₋₁ ⊞ (Kₖ · (q̂ₖ ⊟ qₖ|ₖ₋₁))

就是先把预测 q_{k}|{k-1} 与测量 \hat{q{k}} 的误差搬到切空间,用线性卡尔曼增益 K_{k} 修正,再搬回四元数流形

简单解释

想象你和朋友站在一个大地球仪

地球仪表面就是"四元数流形",你俩的位置就是两个四元数 q₁、q₂

  • box-minus(⊟)

你问:"如果我要从 q₂ 走到 q₁,该往哪个方向、走多少度?"

答案是一个三维小箭头 δ(轴角向量)。

这个箭头 δ 不在地球仪表面上,而是在 q₂ 点的切平面上,所以可以直接做加加减减。

  • box-plus(⊞)

现在反过来:你站在 q₁,手里拿刚才那根小箭头 δ,把箭头"贴"回地球仪表面,就得到新位置 q₂。

换句话说:

  • 先在切平面上做"普通向量加减";
  • 再用 ⊞ 把结果"贴回"球面。

EKF 就是这样: 把四元数的"误差"拉到切平面里用线性卡尔曼公式处理,算完再贴回去,既不会"掉到地球仪里面",也不会"飞出去"。

对比方法与实验结果

姿态估计对比(Orientation RMSE

方法 RMSE(弧度) 说明
OrientNet+EKF(本文) 0.08--0.14 最优,远优于其他方法
iOS CoreMotion 0.37--0.40 系统API,误差大
MUSE(传统滤波) 0.21--0.45 传统互补滤波
Brossard et al. 2020(CNN+陀螺积分) 0.23--0.47 深度学习方法

位置估计对比(ATE:Absolute Trajectory Error,单位:米)

方法 Building 1 ATE 说明
本文方法(IDOL) 4.39 最优
TLIO 4.62 使用EKF融合RoNIN输出
RoNIN-ResNet 9.03 使用iOS姿态估计
IONet 33.42 小场景训练,泛化差
PDR 26.98 传统步长+方向法

消融实验:

RoNIN/TLIO中的姿态估计替换为本文的OrientNet后,ATE误差显著下降 (如RoNIN-ResNet从9.03降至5.66),证明姿态误差是定位漂移的主要来源

简单来说,这篇论文先用 LSTM+EKF 把 IMU 原始数据变成高精度姿态,再把世界系 IMU 数据喂给 Bi-LSTM 直接回归位移,避免姿态误差放大。用 box-minus/box-plus 在三维球面上做卡尔曼更新,兼顾短期陀螺仪精度与长期网络无漂。位移网络先短窗后长窗,抑制漂移又保持实时性

把传统「姿态→积分→位置」的耦合链拆成「深度学习姿态 + 深度学习位移」的并行双塔,首次让 IMU 导航也能像视觉里程计一样端到端

用网络输出的协方差当观测噪声,EKF 不再是手工调参,而是数据驱动的自适应滤波

相关推荐
老姜洛克4 小时前
自然语言处理(NLP)之n-gram从原理到实战
算法·nlp
爱学习的茄子4 小时前
Function Call:让AI从文本生成走向智能交互的技术革命
前端·深度学习·openai
CoovallyAIHub4 小时前
基于YOLO集成模型的无人机多光谱风电部件缺陷检测
深度学习·算法·计算机视觉
CoovallyAIHub4 小时前
几十个像素的小目标,为何难倒无人机?LCW-YOLO让无人机小目标检测不再卡顿
深度学习·算法·计算机视觉
怀旧,5 小时前
【C++】19. 封装红⿊树实现set和map
linux·c++·算法
往事随风去5 小时前
Redis的内存淘汰策略(Eviction Policies)有哪些?
redis·后端·算法
IMER SIMPLE5 小时前
人工智能-python-深度学习-经典网络模型-LeNets5
人工智能·python·深度学习
却道天凉_好个秋5 小时前
深度学习(五):过拟合、欠拟合与代价函数
人工智能·深度学习·过拟合·欠拟合·代价函数
神里流~霜灭5 小时前
(C++)数据结构初阶(顺序表的实现)
linux·c语言·数据结构·c++·算法·顺序表·单链表