论文名称:CTIN: Robust Contextual Transformer Network for Inertial Navigation
会议:AAAI
时间:2020
围绕基于 IMU 的惯性导航定位展开,提出了一种基于 Transformer 架构的深度学习模型,用于从 IMU 数据中预测二维速度和轨迹
数据集
| 数据集名称 | 是否开源 | 是否仅 IMU | 是否作者采集 | 备注 |
|---|---|---|---|---|
| RIDI | ✅ 开源 | ✅ 仅 IMU | ❌ | RIDI GitHub |
| OxIOD | ✅ 开源 | ✅ 仅 IMU | ❌ | OxIOD 官网 |
| RoNIN | ✅ 开源 | ✅ 仅 IMU | ❌ | RoNIN GitHub |
| IDOL | ✅ 开源 | ✅ 仅 IMU | ❌ | IDOL GitHub |
| CTIN | ✅ 开源 | ✅ 仅 IMU | ✅ 作者采集 | 作者自行采集的新数据集,用于补充现有数据不足 |
所有数据集均为仅 IMU 采集,未融合 GNSS 或其他传感器,目的是测试纯 IMU 导航性能
主要工作
这篇论文还是通过预测速度,再积分获得位置,属于数据驱动的惯性导航
首次将 Transformer 架构引入 IMU 惯性导航任务
提出 CTIN 模型,融合空间-时序上下文信息,使用注意力机制提取 IMU 数据中的 空间关系与时序依赖
引入多任务学习(预测速度 + 估计不确定性)来提升鲁棒性,在多个公开数据集上实现 SOTA,并开放了一个新采集的数据集
深度学习模型:CTIN
模型整体结构
数据预处理与嵌入层 (Embedding)
空间编码器 (Spatial Encoder)
时序解码器 (Temporal Decoder)
两个任务头(MLP 分支):
- Velocity Head:回归二维速度 v;
- Covariance Head:回归 2×2 协方差 Σ
Embedding 层(输入 → 连续表征)
输入:长度为 m 的 IMU 窗口
[α, ω] ∈ ℝ^{m×6}(3 轴加速度 + 3 轴角速度,已转到导航坐标系)
Spatial Embedding
Spatial Embedding 把单帧 IMU 6 轴原始测量”映射成高维空间特征,为 Encoder 提供纯传感器物理量的紧凑表达;它不含时序或位置信息,仅刻画这一帧 IMU 数据本身在空间/通道上的模式
- Spatial Embedding 与 Temporal Embedding 是两个完全独立的子模块,都以同一 IMU 窗口 [α, ω] ∈ ℝ^{m×6} 为原始输入
- 输入 X_{raw},经过 1 × 1 Conv,把 6 维 IMU 特征线性映射到 d_{model} 维,卷积核在时间维度上为 1,只在通道维做变换,输出 X_{conv} ∈ ℝ^{m × d_{model}}
- 对 X_{conv} 进行BatchNorm标准化,输出 X_{bn} ∈ ℝ^{m × d_{model}}
- 再进行ReLU非线性激活,得到 X_{relu} ∈ ℝ^{m × d_{model}}
- 最后进行全连接Linear,经过最终空间嵌入,进入下一步与 Temporal Embedding 相加;得到X^{spat} ∈ ℝ^{m × d_{model}}
即:1×1 Conv → BN → ReLU → Linear → 得到 X^{spat} ∈ ℝ^{m×d_{model}}
X^{spat} 补充当前帧的静态物理量特征(即时序维度:前后帧如何互相影响)
Temporal Embedding
-
输入同上,经过1层双向
LSTM,把 6 维IMU序列编码成 d_{model} 维时序特征;hidden_size = d_model -
构建可学习的Positional Encoding(与序列位置相关的可训练向量),P∈ℝ^{m × d_{model}},初始化使用标准正态分布 × 0.02(即随机初始化,接近 Xavier 小方差)
- Positional Encoding 给 LSTM 输出的“内容特征”再补上“我在序列的第几位”这一信息,防止 Transformer 的自注意力层把“先/后”顺序搞混
- Bi-LSTM 本身理论上能感知顺序,但 CTIN 的后续模块是 纯注意力(Transformer)。注意力计算是“一袋子向量”操作——如果不显式告诉它“第 1 帧、第 2 帧……”,模型就无法区分时间先后。可学习 Positional Encoding 就是“第 t 帧的位置身份证” ,让注意力层仍知道时间顺序
-
将
H_lstm + P逐元素相加,得到最终时间嵌入,输出 X^{temp}∈ ℝ^{m × d_model}- 这里使用“逐元素相加”而不是拼接。相加在 Transformer 中足够表达位置信息,同时保持维度不变,计算量小。拼接会把通道数翻倍,后面再做线性映射其实等价于“加权相加” ,不如直接相加高效
即:1 层 Bi-LSTM 提取局部时序特征,再加一段可学习的 Positional Encoding(与 Transformer 原版不同,这里是可训练向量),得到输出 X^{temp} ∈ ℝ^{m×d}
作为 Decoder 的 Query 初始值,也作为 Encoder 输入的一部分,使网络在后续空间-时序注意力计算里同时看到:
- 这帧 IMU 的物理量(由 Spatial Embedding 提供)
- 这帧在时间轴上的绝对/相对位置(由 Positional Encoding 提供)
- 局部邻域的时序动态,领帧关系(由 Bi-LSTM 提供)
Temporal Embedding 是把“时序位置 + 时序上下文”压缩进同一向量,与 Spatial Embedding 一起构成 CTIN 的完整输入表示(即空间维度:哪些通道/传感器彼此相关)
融合
X^{spat} 与 X^{temp} 逐元素相加 → Z₀ = X^{spat} + X^{temp} ∈ ℝ^{m × d_{model}}
直接把 X^{spat} 与 X^{temp} 逐元素相加 → 得到最终输入序列,输出 X^{temp} ∈ ℝ^{m×d}
Spatial Encoder(N 个相同 block 堆叠)
- Spatial Encoder = N 个相同的 Spatial Bottleneck Block 串行堆叠,论文中
N=4 - 每个Block内部保持
ResNet-18 bottleneck的残差骨架,只是把卷积核换成了“局部+全局”两种自注意力模块 - 整个 Encoder 的输入是 Z₀ ∈ ℝ^{m×d_model}(Embedding 层已处理过的
IMU序列) - 输出是 E ∈ ℝ^{m×d_{model}},供 Decoder 的交叉注意力使用
每个 Block 内部把 ResNet-18 的瓶颈单元改造成”双注意力“结构
各Spatial Bottleneck Block完整数据流
以第I个Block为例(I=1…N),给出每一步的张量维度与数据来源
m = 时间窗长度,d = 基础通道数(论文里 d = 128 或 256),4d = 升维后的通道数
Block-1
输入 Z₀ ∈ ℝ^{m × d}
-
经过
Conv1×1提升通道数 (d→4d)输入Embedding层的
IMU序列 ℝ^{m × d},输出升维后的高维空间特征 ℝ^{m × 4d}把通道数从d扩到4d,提高特征容量,为后面两个注意力模块提供更大的子空间来刻画局部/全局关系。纯线性映射,不扩大时间维度,也不改变时间顺序
-
3×3 Local Multi-Head Self-Attention
输入上一步得到的4d空间特征,输出在3×3邻域内做局部注意力后的局部空间上下文特征
在领域3×3内做多头注意力,捕获“局部空间上下文”(哪几轴
IMU信号在同一时刻互相耦合) -
1×1 Global Multi-Head Self-Attention
输入4d空间特征(同上),再次全局注意力,得到跨时间、跨通道的全局上下文特征
在整个m×4d特征图上做全局注意力,捕获”跨时间步、跨通道”的长程依赖(与前一步互补)
-
Fusion Gate(α 加权融合)
输入局部特征和全局特征 C₁ ∈ ℝ^{m × 4d},C₂ ∈ ℝ^{m × 4d}(Local 结果和 Global 结果),输出按学习到的权重融合后的综合空间特征 Y ∈ ℝ^{m × 4d}
让网络自适应地决定当前位置更依赖局部还是全局信息
concat(C₁,C₂)→1×1 Conv→Sigmoid→逐通道加权求和
-
经过 Conv1×1降低通道数 (4d→d)
输入融合后的高维特征 Y ∈ ℝ^{m × 4d},输出 Y′ ∈ ℝ^{m × d}
把4d压缩回d,恢复原始通道数,保证残差相加时维度一致;同时起到信息瓶颈效果,只让最精炼的特征通过
-
Residual +
LayerNorm残差用于缓解梯度消失,保持低层特征流通
LayerNorm用于稳定分布,加速收敛
Block-1的输出为 Z₁ ∈ ℝ^{m × d}
Block-2、Block3、Block4
输入为上一层输出,操作同Block-1
4 层全部经过后,Spatial Encoder 的最终输出为 E ∈ ℝ^{m × d},直接送入 Temporal Decoder
Temporal Decoder
Temporal Decoder同样由N=4个完全相同的解码层(Decoder Layer)堆叠而成
Layer-1
第一层的整体输入为来自Encoder的输出 E ∈ ℝ^{m × d},
Temporal Decder的同一E,因第一层没有历史,故Query也来自E,记作 Q₀ = E ∈ ℝ^{m × d}
在Transformer Decoder中,真正用来产生Query的是上一次Decoder的输出(即“历史”)
-
Masked Multi-Head Self-Attention
输入 Q = K = V = Q₀ ∈ ℝ^{m × d}
让当前时间步只能”看“到自己及之前的时间步,防止未来信息泄露
输出 A_{1} ∈ ℝ^{m × d} (经过掩码,防止未来信息泄露)
-
Add & LayerNorm(第一次)输入 A_{1} ∈ ℝ^{m × d},Q₀ ∈ ℝ^{m × d}(这里表示 A_{1}与E)
通过残差连接+归一化,稳定梯度、保持信息流
输出 S_{1} ∈ ℝ^{m × d}
-
Multi-Head Cross-Attention(Encoder-Decoder Attention)
输入 Query = S₁ ∈ ℝ^{m × d}, Key = Value = E ∈ ℝ^{m × d} (来自 Spatial Encoder)
把Encoder的空间-时序特征E融合到Decoder当前表示中
输出 C₁ ∈ ℝ^{m × d}
-
Add & LayerNorm(第二次)输入:C₁ ∈ ℝ^{m × d},S₁ ∈ ℝ^{m × d}
再次残差+归一化,融合交叉注意力结果
输出:T₁ ∈ ℝ^{m × d}
-
Position-wise Feed-Forward(两层
MLP)输入:T₁ ∈ ℝ^{m × d}
操作:
Linear(d → 4d) → ReLU → Dropout → Linear(4d → d),通过非线性变化,提高表达能力输出:F₁ ∈ ℝ^{m × d}
-
Add & LayerNorm(第三次)输入:F₁ ∈ ℝ^{m × d},T₁ ∈ ℝ^{m × d}
通过最后的残差+归一化,得到本层最终输出
输出:Z_{dec}¹ ∈ ℝ^{m × d} (Layer-1 的最终结果,将成为 Layer-2 的 Q₀)
Transformer的”残差+归一化”遵循每经过一个子层就做一次的惯例
第4个解码层之后
Decoder的4个解码层全部完成后,得到的张量不会再经过任何额外的Transformer层,而是直接同时送到两个 独立的前馈头(Feed-Forward Heads)
第四层输出维度 Z_{dec}⁴ ∈ ℝ^{m × d} (m = 时间窗长度,d=128/256,与Encoder通道数相同),为融合了全部空间-时序上下文的高维隐状态,每一行对应一帧IMU的”精炼表示“,即包含局部运动模式,也包含全局轨迹依赖。Velocity / Covariance 头只需在这之上做一次线性映射即可得到所需的速度与不确定性
-
Velocity Head
两层 MLP (d → 128 → 2) → ℝ^{m × 2}
输出:每一帧的二维速度 ((v_x, v_y))
-
Covariance Head
两层 MLP (d → 128 → 2) → ℝ^{m × 2}
输出对应速度的不确定性对角方差 (σx², σy²)
两个头各自有一套独立的权重参数,训练时通过多任务损失同时优化两个头
补充:Query、Value、Key的作用
把输入向量拆成3个向量
- Query(Q):提出“我要查什么”;
- Key(K):给出“我能提供什么索引”;
- Value(V):给出“索引对应的实际内容”。
计算过程(缩放点积注意力)
- 相似度矩阵:S = Q·Kᵀ / √dₖ 每对(query,key)的打分
- 权重:W=softmax(S) 概率化,行和为1
- 聚合:O=W·V 把Value按权重加权求和
每个位置用Query问所有Key:”谁跟我最相关?“,再用得到的权重去取 Value
多头(Multi-Head)只是把d维切成h份,并行做h次上述过程,再拼回 d 维,以捕获不同子空间关系
Transformer就是用自注意力一次性建立序列中任意两位置的关系,并用残差、归一化、前馈网络保持深度可训练性
补充:残差+归一化怎么做
设子层函数为 F(·)(例如 Self-Attention 或 Feed-Forward),输入为 x:
-
残差
y = F(x) + x
y的形状假设为(batch, m, d)
-
层归一化
μ = mean(y, last_dim),在d这一维上求平均,返回形状 (batch, m, 1)
- last_dim就是 张量最末尾的那一维(也叫“特征维”或“通道维”)
σ = std(y, last_dim),在d这一维上求标准差,返回形状 (batch, m, 1)
z = (y − μ) / √(σ² + ε) * γ + β 通过广播机制把 μ、σ 扩展到与 y 相同形状,再逐元素做归一化
γ、β 为可学习缩放和平移参数,ε 防除零
-
输出
z ∈ ℝ^{same_shape_as_x},继续传给下一模块
在Transfomer中,每经过一个子层就执行一次”残差+LayerNorm“保持梯度顺畅、训练稳定
模型对比情况
| 对比模型 | 简介 | 结果对比(ATE 指标) |
|---|---|---|
| R-LSTM | RoNIN 中的 LSTM 变体 | CTIN 提升约 34.7% |
| R-ResNet | RoNIN 中的 CNN 变体 | CTIN 提升约 21.8% |
| R-TCN | RoNIN 中的 TCN 变体 | CTIN 提升约 37.5% |
| SINS | 传统双积分法 | 误差极高,CTIN 显著优于 |
| PDR | 基于步态的行人航位推算 | 长期漂移严重,CTIN 更稳定 |
CTIN 是首个将 Transformer 引入纯 IMU 惯性导航的模型,通过空间-时序注意力机制与多任务学习,在多个开源与自建数据集上实现了轨迹预测的新 SOTA