转载自公众号:敢敢AUTOHUB
1. 引言:惯性测量单元在机器人定位中的角色
惯性测量单元(Inertial Measurement Unit, IMU)是现代移动机器人和自动驾驶系统中不可或缺的传感器。IMU通过集成三轴加速度计和三轴陀螺仪,能够以高频率(通常为100-400Hz)测量载体的线性加速度和角速度。相比于激光雷达(LiDAR)或相机等外感受传感器,IMU具有体积小、成本低、不受光照和环境影响的优势,这使其成为传感器融合系统中的重要组成部分。
然而,IMU数据的直接积分会导致误差快速累积。加速度计的测量值包含重力分量和传感器偏置,陀螺仪存在漂移现象,这些因素使得纯IMU里程计在长时间运行后会产生显著的位姿估计偏差。传统的解决方案依赖于卡尔曼滤波器或优化方法,将IMU与其他传感器(如GPS、视觉或LiDAR)进行融合,但这些方法通常需要精确的传感器标定和手工设计的噪声模型。
近年来,深度学习方法为IMU去噪和里程计估计提供了新的思路。通过神经网络学习IMU数据中的模式,可以自动补偿传感器误差并提高定位精度。**KISS-IMU(Keep IMU Stable and Strong)正是这一方向上的重要进展,它提出了一种自监督学习框架**,通过运动平衡学习和不确定性感知推理,实现了高精度的纯IMU里程计估计。
论文地址:https://arxiv.org/html/2603.06205v1
GitHub仓库:https://github.com/sparolab/KISS-IMU
KISS-IMU主图
2. 问题与挑战:传统IMU里程计的困境
传统的IMU里程计面临三个核心挑战,这些挑战限制了其在实际应用中的性能表现。
2.1 传感器噪声与偏置
IMU传感器的原始测量值受到多种噪声源的影响。加速度计测量值包含高斯白噪声、温度漂移和标定误差,陀螺仪则存在角度随机游走和速率随机游走。这些噪声在积分过程中会被放大,导致位置误差呈二次增长、姿态误差呈线性增长。即使是高精度的工业级IMU,在没有外部观测修正的情况下,也会在数十秒内产生米级的位置漂移。
传统方法通过Allan方差分析来表征IMU噪声特性,并在滤波器中使用固定的噪声协方差矩阵。然而,这种方法假设噪声统计特性是时不变的,无法适应实际运动中噪声水平的动态变化。例如,在高速运动或剧烈转向时,IMU的噪声特性会显著不同于静止或匀速运动状态。
2.2 运动模式的不平衡分布
在实际的机器人运动数据中,不同运动模式的出现频率存在显著差异。以自动驾驶场景为例,车辆大部分时间处于直线行驶状态,急转弯、加速和减速等动态运动的占比相对较少。这种不平衡的数据分布会导致神经网络在训练时过度拟合高频出现的运动模式,而对低频但同样重要的动态运动学习不足。
具体而言,当训练数据中静态或低速运动占主导时,网络会倾向于输出接近零的速度估计,因为这样可以最小化大部分样本的损失函数。但在实际应用中,机器人需要在各种运动状态下都保持准确的定位能力。这种训练与测试分布的不匹配会严重影响系统在动态场景下的鲁棒性。
2.3 不确定性量化的缺失
传统的深度学习IMU里程计方法通常只输出点估计(point estimate),即单一的速度或位姿预测值,而不提供预测的不确定性信息。然而,在传感器融合和决策系统中,不确定性量化至关重要。例如,在多传感器融合框架中,需要根据各传感器的置信度动态调整融合权重;在路径规划中,需要考虑定位不确定性来保证安全性。
现有的不确定性估计方法,如贝叶斯神经网络或集成学习,通常计算成本高昂且难以实时部署。此外,这些方法往往假设不确定性是各向同性的,忽略了IMU在不同运动方向上误差特性的差异。例如,在高速直线运动中,横向位置的不确定性通常小于纵向位置,而在原地旋转时,姿态不确定性会显著增加。
KISS-IMU正是针对这三个核心挑战提出的系统性解决方案。通过自监督学习框架、运动平衡采样策略和协方差感知的网络设计,KISS-IMU实现了在各种运动模式下的鲁棒IMU里程计估计,并提供了可靠的不确定性量化。
3. KISS-IMU核心思想:Keep IMU Stable and Strong
KISS-IMU的设计理念体现在其名称中:Keep IMU Stable and Strong,即保持IMU的稳定性和鲁棒性。这一理念通过三个关键技术组件得以实现:自监督学习框架、运动平衡学习机制和不确定性感知推理模块。
3.1 自监督学习框架
KISS-IMU采用自监督学习范式,利用LiDAR里程计作为伪标签来训练IMU去噪网络。具体而言,系统首先使用KISS-ICP(一种快速的LiDAR里程计算法)处理点云数据,生成高精度的位姿轨迹作为监督信号。然后,神经网络学习从原始IMU数据中预测与LiDAR里程计一致的运动估计。
这种自监督方法的优势在于无需人工标注的真值数据。在实际应用中,获取高精度的地面真值轨迹通常需要昂贵的设备(如RTK-GPS或运动捕捉系统),且受到环境限制。而LiDAR里程计可以在多种场景下提供可靠的短期位姿估计,使得KISS-IMU能够利用大规模未标注数据进行训练。
值得注意的是,KISS-IMU并不简单地将LiDAR里程计的输出作为硬标签。系统通过频率门(frequency gate)机制过滤掉LiDAR里程计中的高频噪声和异常值,确保训练信号的质量。此外,在推理阶段,KISS-IMU完全独立于LiDAR,可以作为纯IMU里程计使用,也可以与其他传感器进行融合。
3.2 运动平衡学习机制
为了解决训练数据中运动模式不平衡的问题,KISS-IMU引入了基于高斯混合模型(Gaussian Mixture Model, GMM)的运动平衡采样器。该采样器的核心思想是将运动空间划分为多个模式(如静止、低速、高速、转弯等),并在训练时确保每种模式都有足够的代表性。
GMM采样器首先在二维运动特征空间(线速度和角速度)上拟合高斯混合模型,自动发现数据中的运动聚类。然后,在每个训练批次中,采样器从各个聚类中均匀抽取样本,而不是按照原始数据分布进行采样。这种策略确保了网络在训练时能够充分学习各种运动模式的特征,避免了对高频模式的过拟合。
实验表明,运动平衡采样显著提升了系统在动态场景下的性能。在包含急转弯和加速的测试序列中,使用GMM采样器的模型相比基线方法,旋转误差降低了约30%,平移误差降低了约20%。这验证了运动平衡学习对于提升IMU里程计鲁棒性的重要性。
3.3 不确定性感知推理
KISS-IMU的网络不仅输出去噪后的IMU测量值(加速度和角速度),还同时预测每个测量值的协方差矩阵。这种协方差感知的设计使得系统能够量化预测的不确定性,为下游的传感器融合和决策模块提供可靠的置信度信息。
协方差预测通过独立的解码器分支实现。网络的特征提取层(CNN和GRU)共享,但在输出层分为四个解码器:加速度解码器、陀螺仪解码器、加速度协方差解码器和陀螺仪协方差解码器。协方差解码器输出对角协方差矩阵的对数值,确保协方差始终为正定。
在训练时,系统使用**负对数似然损失(Negative Log-Likelihood Loss)**来联合优化测量值和协方差的预测。这种损失函数鼓励网络在预测不确定时输出较大的协方差,在预测确定时输出较小的协方差。实验表明,KISS-IMU预测的不确定性与实际误差高度相关,验证了协方差估计的有效性。
协方差解码器的实现采用了指数变换来确保输出的协方差矩阵始终为正定:
# 协方差解码器实现 (imu_net.py)
def cov_decoder(self, x):
"""
协方差解码器:输出对角协方差矩阵
- 输入: x (B, T, 128) 编码器特征
- 输出: acc_cov, gyr_cov (B, T, 3) 对角协方差
"""
# 通过MLP解码,输出对数协方差
acc_cov_log = self.acccov_decoder(x) # (B, T, 3)
gyr_cov_log = self.gyrcov_decoder(x) # (B, T, 3)
# 指数变换确保正定性,减5保证初始值合理
acc_cov = torch.exp(acc_cov_log - 5.) # (B, T, 3)
gyr_cov = torch.exp(gyr_cov_log - 5.) # (B, T, 3)
return acc_cov, gyr_cov
这里的关键设计是减5操作,它确保训练初期的协方差值在合理范围内(约0.0067),避免数值不稳定。指数函数保证了无论MLP输出什么值,最终的协方差都是正数,满足协方差矩阵的数学约束。
4. 技术架构:从原始IMU到精确里程计
KISS-IMU的技术架构可以分为三个主要阶段:数据预处理与伪标签生成、运动平衡采样、神经网络去噪与协方差估计。整个流程形成了一个端到端的自监督学习系统。
4.1 系统整体流程
KISS-IMU的训练流程始于原始传感器数据的采集。系统接收同步的IMU数据流(加速度和角速度)和LiDAR点云序列作为输入。首先,LiDAR里程计模块(如KISS-ICP或其他点云配准算法)处理点云数据,生成相邻帧之间的相对位姿变换。这些位姿变换经过频率门滤波后,转换为速度域的监督信号(线速度和角速度)。
接下来,GMM运动平衡采样器分析训练数据的运动分布,将运动空间划分为K个高斯分量(通常K=3-6)。在训练时,采样器确保每个批次中包含来自各个运动模式的样本,避免数据不平衡导致的偏差。采样后的IMU窗口(通常为0.2秒,包含20-80个IMU测量值)被送入神经网络进行处理。
神经网络的输出包括去噪后的加速度、角速度及其对应的协方差矩阵。这些输出通过预积分模块转换为位姿增量,并与LiDAR里程计的伪标签进行比较,计算损失函数并更新网络参数。在推理阶段,训练好的网络可以独立处理IMU数据流,输出实时的去噪测量值和不确定性估计,供后端优化或滤波器使用。
4.2 IMUNet网络结构详解
IMUNet是KISS-IMU的核心神经网络模块,其设计充分考虑了IMU数据的时序特性和多模态输出需求。网络采用编码器-解码器架构,包含卷积层、循环层和多个解码分支。
编码器部分由一维卷积神经网络(1D-CNN)和门控循环单元(GRU)组成。输入的IMU窗口形状为(B, T, 6),其中B是批次大小,T是时间步数,6表示三轴加速度和三轴角速度。卷积层使用kernel_size=10和stride=5的配置,对输入信号进行下采样和特征提取,将6通道输入映射到32通道特征。卷积层后接GELU激活函数和Dropout层(p=0.2),增强网络的非线性表达能力和泛化性能。
# 卷积特征提取层
self.cnn = nn.Sequential(
nn.Conv1d(in_channels=6, out_channels=32, kernel_size=10, stride=5, padding=0),
nn.GELU(),
nn.Dropout(0.2),
)
卷积层的输出被送入两层GRU网络。第一层GRU将32维特征映射到64维隐藏状态,第二层GRU进一步映射到128维。GRU的使用使得网络能够捕捉IMU数据中的长期时序依赖关系,这对于补偿传感器漂移和识别运动模式至关重要。GRU的参数初始化采用**正交初始化(orthogonal initialization)**策略,确保训练初期的梯度稳定性。
# 循环时序建模层
self.gru1 = nn.GRU(input_size=32, hidden_size=64, num_layers=1, batch_first=True)
self.gru2 = nn.GRU(input_size=64, hidden_size=128, num_layers=1, batch_first=True)
解码器部分包含四个独立的多层感知机(MLP)分支,分别负责预测加速度、角速度及其协方差。每个解码器由两层全连接网络组成,中间使用GELU激活函数。加速度和角速度解码器输出3维向量,对应三轴测量值;协方差解码器同样输出3维向量,表示对角协方差矩阵的对数值。
# 多任务解码器
self.accdecoder = nn.Sequential(nn.Linear(128, 64), nn.GELU(), nn.Linear(64, 3))
self.gyrdecoder = nn.Sequential(nn.Linear(128, 64), nn.GELU(), nn.Linear(64, 3))
self.acccov_decoder = nn.Sequential(nn.Linear(128, 64), nn.GELU(), nn.Linear(64, 3))
self.gyrcov_decoder = nn.Sequential(nn.Linear(128, 64), nn.GELU(), nn.Linear(64, 3))
这种多分支设计允许网络同时学习测量值的去噪和不确定性估计,两个任务共享底层特征表示,但在输出层保持独立。协方差解码器的输出经过指数变换(exp)后得到正定的协方差值,确保数值稳定性。
完整的前向传播流程整合了编码器和解码器,并处理变长序列:
# IMUNet前向传播完整流程 (imu_net.py)
def forward(self, data):
"""
完整的前向传播流程
输入: data字典包含 accels, gyros, imu_dts, valid_length
输出: 去噪后的IMU测量值和协方差
"""
# 1. 数据准备
data['accels'] = data['accels'].to(self.device).to(torch.float32)
data['gyros'] = data['gyros'].to(self.device).to(torch.float32)
valid_length = data['valid_length']
# 2. 推理:编码器提取特征 + 解码器预测
correction_acc, correction_gyr, cov_acc, cov_gyr = self.inference(data, valid_length)
# 3. 广播到有效长度(处理变长序列)
valid_acc = self.broadcast_to_valid(data['accels'], correction_acc, valid_length, mode='add')
valid_gyr = self.broadcast_to_valid(data['gyros'], correction_gyr, valid_length, mode='add')
valid_cov_acc = self.broadcast_to_valid(torch.zeros_like(data['accels']), cov_acc, valid_length, mode='assign')
valid_cov_gyr = self.broadcast_to_valid(torch.zeros_like(data['gyros']), cov_gyr, valid_length, mode='assign')
# 4. 返回去噪结果和协方差
return {
'accels_corr': valid_acc,
'gyros_corr': valid_gyr,
'acc_cov': valid_cov_acc,
'gyr_cov': valid_cov_gyr,
}
这里的broadcast_to_valid方法是处理变长序列的关键,它将下采样后的网络输出(由于CNN的stride=5)映射回原始IMU采样率,确保每个时间步都有对应的去噪值和协方差估计。
5. 运动平衡学习:GMM采样器的实现
运动平衡学习是KISS-IMU区别于传统深度学习方法的关键创新。通过高斯混合模型对运动空间进行建模,系统能够识别并平衡不同运动模式的训练样本分布。
5.1 运动特征空间的定义
GMM采样器在二维运动特征空间上工作,该空间由**线速度(linear speed)和角速度(angular speed)**的标量值构成。对于每个IMU窗口,系统首先计算该窗口对应的平均线速度和角速度,形成一个二维特征向量。线速度通过对三轴线性加速度积分并计算模长得到,角速度则直接取三轴角速度的模长。
这种二维表示的优势在于其简洁性和可解释性。相比于使用高维IMU原始数据或复杂的手工特征,二维运动特征能够直观地反映机器人的运动状态:
静止(低线速度、低角速度)•
直线运动(高线速度、低角速度)•
原地旋转(低线速度、高角速度)•
动态转弯(高线速度、高角速度)
这种表示使得GMM能够有效地发现数据中的运动聚类。
5.2 GMM模型的训练与聚类
GMM模型的训练在整个训练数据集上进行,作为预处理步骤。系统首先遍历所有训练序列,提取每个IMU窗口的二维运动特征,形成特征矩阵X,其形状为(N, 2),其中N是总窗口数。然后,使用StandardScaler对特征进行标准化,确保线速度和角速度在相同的尺度上。
# GMM模型训练流程
# 特征标准化
self.scaler = StandardScaler().fit(X_all)
Xn = self.scaler.transform(X_all)
# GMM拟合
self.gmm = GaussianMixture(
n_components=self.K, # 聚类数量(通常3-6)
covariance_type="full", # 完整协方差矩阵
random_state=self.random_state,
n_init=self.n_init
).fit(Xn)
GMM的组件数K可以手动指定,也可以通过**贝叶斯信息准则(BIC)**自动选择。在自动选择模式下,系统尝试K=2到K=7的不同配置,选择BIC值最小的模型。实验表明,对于大多数机器人运动数据,K=3到K=5能够很好地捕捉主要的运动模式。协方差类型设置为"full",允许每个高斯分量具有完整的协方差矩阵,提高模型的表达能力。
训练完成后,GMM模型能够将任意运动特征向量分配到K个聚类之一。每个聚类对应一种典型的运动模式,例如在自动驾驶数据中,通常会出现"静止/低速"、"匀速直行"和"动态转弯"三个主要聚类。
运动特征的提取是GMM采样器的核心,它通过yaw积分近似和重力补偿从原始IMU数据计算线速度和角速度:
# 运动特征提取核心算法 (gmm.py)
def _imu_linear_angular_speed(self, t_imu, acc_b, gyr_b, g_vec):
"""
从IMU数据计算线速度和角速度
核心思路:
1. 通过yaw积分近似world坐标系旋转
2. 将加速度转到world系并去除重力
3. 积分得到速度,计算模长作为线速度
"""
# 计算时间间隔并处理异常值
dt = np.diff(t_imu, prepend=t_imu[0])
dt[dt <= 0] = np.median(dt[dt > 0])
# yaw积分(平面假设)
yaw = np.cumsum(gyr_b[:, 2] * dt)
R_wb = self._yaw_only_Rz(yaw) # 构造旋转矩阵
# 加速度转world系并去重力
acc_w = (R_wb @ acc_b[..., None]).squeeze(-1)
acc_w = acc_w - g_vec
# 速度和角度增量
dv = acc_w * dt[:, None]
dth = gyr_b * dt[:, None]
# 滑动窗口求和(窗口大小由win_sec决定)
L = max(1, int(round(self.win_sec / float(np.median(dt)))))
sum_dv = self._moving_sum(dv, L)
sum_dth = self._moving_sum(dth, L)
sum_dt = self._moving_sum(dt, L)
# 计算速度模长
lin_speed = np.linalg.norm(sum_dv, axis=1) / np.clip(sum_dt, 1e-6, None)
ang_speed = np.linalg.norm(sum_dth, axis=1) / np.clip(sum_dt, 1e-6, None)
return lin_speed, ang_speed
这种方法的优势在于无需完整的姿态估计,仅通过yaw角的积分就能近似地将加速度转换到世界坐标系,大大降低了计算复杂度。
5.3 平衡采样策略
在训练神经网络时,GMM采样器确保每个批次中包含来自各个运动聚类的样本。具体而言,对于批次大小B和聚类数K,采样器从每个聚类中抽取约B/K个样本。这种策略打破了原始数据分布的不平衡性,使得低频运动模式获得与高频模式相同的学习机会。
平衡采样的实现通过分层采样(stratified sampling)完成。系统首先使用GMM模型预测所有训练样本的聚类标签,然后在每个epoch中,从各个聚类中独立采样。为了避免某些聚类样本不足的问题,采样器允许重复采样(sampling with replacement),确保每个批次都能填满。
def predict(self, X: np.ndarray) -> np.ndarray:
"""预测运动特征的聚类标签"""
self._ensure_fitted()
Xn = self.scaler.transform(np.asarray(X))
return self.gmm.predict(Xn)
def predict_proba(self, X: np.ndarray) -> np.ndarray:
"""预测运动特征属于各聚类的概率"""
self._ensure_fitted()
Xn = self.scaler.transform(np.asarray(X))
return self.gmm.predict_proba(Xn)
实验结果表明,运动平衡采样显著提升了模型在动态场景下的性能。在包含大量静态或低速运动的训练集上,使用平衡采样的模型在高速和转弯场景的测试误差降低了20-30%,而在静态场景的性能仅略有下降(约5%)。这种权衡是合理的,因为在实际应用中,动态运动的准确性往往更为关键。
6. 损失函数与训练策略
KISS-IMU的训练目标是使神经网络输出的去噪IMU测量值与LiDAR里程计生成的伪标签保持一致,同时准确估计预测的不确定性。这一目标通过精心设计的损失函数和训练策略实现。
6.1 负对数似然损失
KISS-IMU使用负对数似然(Negative Log-Likelihood, NLL)损失函数来联合优化测量值预测和协方差估计。对于加速度和角速度,损失函数的形式为:
L_NLL = 0.5 * [(y_pred - y_true)^T * Σ^(-1) * (y_pred - y_true) + log|Σ|]
其中,y_pred是网络预测的测量值,y_true是LiDAR里程计生成的伪标签,Σ是预测的协方差矩阵。这个损失函数包含两项:
第一项是马氏距离(Mahalanobis distance),衡量预测值与真值之间的加权误差
第二项是协方差矩阵行列式的对数,作为正则化项防止协方差退化为零
NLL损失的优势在于其自适应性。当网络预测不确定时(Σ较大),第一项的惩罚会减小,允许较大的预测误差;但第二项会增大,防止网络简单地输出无限大的协方差来逃避惩罚。这种机制鼓励网络在真正不确定的情况下输出大协方差,在确定的情况下输出小协方差,从而实现准确的不确定性量化。
6.2 频率门与伪标签过滤
LiDAR里程计生成的伪标签虽然总体上准确,但在某些情况下会包含高频噪声或异常值。例如,在点云退化场景(如长走廊或开阔场地)中,LiDAR配准可能产生较大误差。为了提高训练信号的质量,KISS-IMU引入了频率门机制。
频率门通过低通滤波器处理LiDAR里程计的输出,去除高频噪声成分。具体而言,系统对位姿轨迹进行数值微分得到速度,然后应用**巴特沃斯滤波器(Butterworth filter)**或移动平均滤波器平滑速度曲线。滤波后的速度作为训练的监督信号,确保网络学习的是平滑的运动模式而非瞬时噪声。
此外,系统还实现了基于**重叠分数(overlap score)**的异常值检测。对于每对相邻点云帧,系统计算其几何重叠程度。当重叠分数低于阈值时(表明LiDAR配准可能不可靠),该时间段的样本会被排除在训练集之外。这种质量控制机制确保了伪标签的可靠性,避免了"垃圾进,垃圾出"的问题。
6.3 训练超参数与优化策略
KISS-IMU的训练使用Adam优化器,初始学习率设置为1e-3,并采用余弦退火学习率调度(cosine annealing)策略。训练过程通常持续20-30个epoch,每个epoch遍历所有训练序列。批次大小设置为32-64,取决于GPU内存容量。
网络参数的初始化对训练稳定性至关重要。卷积层和全连接层使用高斯初始化(均值0,标准差0.02),GRU层的输入权重使用高斯初始化,隐藏权重使用正交初始化。协方差解码器的最后一层使用零初始化,确保训练初期输出接近单位协方差,避免数值不稳定。
def gaussian_init_weights(m, mean=0.0, std=0.02):
"""高斯初始化权重"""
if isinstance(m, (nn.Linear, nn.Conv1d)):
nn.init.normal_(m.weight, mean=mean, std=std)
if m.bias is not None:
nn.init.constant_(m.bias, 0)
def init_gru(m):
"""GRU层初始化"""
if isinstance(m, nn.GRU):
for name, param in m.named_parameters():
if "weight_ih" in name:
nn.init.normal_(param, mean=0.0, std=0.02)
elif "weight_hh" in name:
nn.init.orthogonal_(param) # 正交初始化
elif "bias" in name:
nn.init.constant_(param, 0.0)
训练过程中,系统监控验证集上的性能指标,包括绝对位姿误差(APE)和相对位姿误差(RPE)。当验证误差连续多个epoch不再下降时,训练提前停止,防止过拟合。最佳模型的检查点被保存用于后续评估和部署。
7. 代码实现与使用指南
KISS-IMU提供了完整的开源实现,支持Docker容器化部署和本地安装两种方式。项目代码结构清晰,易于理解和扩展,为研究人员和工程师提供了便捷的使用体验。
7.1 环境配置与快速启动
KISS-IMU推荐使用Docker进行部署,这可以避免复杂的依赖配置问题。项目提供的Docker镜像(sparolab/kiss-imu:v1.0)已经包含了所有运行时依赖,包括CUDA、PyTorch、pypose、KISS-ICP等。用户只需要配置数据集路径,即可快速启动训练和评估流程。
# 克隆代码仓库
git clone <https://github.com/sparolab/KISS-IMU.git>
cd KISS-IMU
# 编辑docker-compose.yml,配置数据集路径
# 将{dataset_folder}替换为实际的数据集目录
# 启动Docker容器
docker compose -f docker/docker-compose.yml up -d
docker exec -it kiss-imu-ws bash
# 在容器内启动训练
bash scripts/train.sh
对于不使用Docker的用户,可以通过pip安装依赖包。项目的requirements.txt文件列出了所有必需的Python包及其版本。建议使用Python 3.8或更高版本,并确保CUDA环境已正确配置。
# 安装依赖
pip install -r requirements.txt
# 启动训练
bash scripts/train.sh
7.2 数据集准备与格式要求
KISS-IMU对数据集格式有明确的要求。每个序列需要包含三个主要组件:
IMU数据文件(imu.csv):包含时间戳、三轴加速度和三轴角速度•
地面真值位姿文件(gt_pose.csv):包含时间戳和位姿信息•
LiDAR点云目录(points/):以二进制格式存储点云数据
数据集目录结构:
<data_root>/
└── <SEQUENCE_NAME>/
├── imu.csv # IMU数据:timestamp, ax, ay, az, gx, gy, gz
├── gt_pose.csv # 地面真值:timestamp, x, y, z, qx, qy, qz, qw
└── points/
├── data/
│ ├── 000000.bin # 点云二进制文件
│ └── ...
└── timestamps.txt # 点云时间戳
系统支持多种数据集格式,包括KITTI、MulRan和DiTer-OS。不同数据集的坐标系和数据格式略有差异,通过--data-type参数指定数据集类型后,系统会自动处理这些差异。对于自定义数据集,用户需要编写相应的数据加载器,参考examples/dataset_layout.md中的详细说明。
7.3 训练脚本与参数配置
训练脚本scripts/train.sh封装了完整的训练流程,包括数据加载、GMM采样器初始化、网络训练和模型保存。脚本通过环境变量接收配置参数,用户可以灵活调整训练设置而无需修改代码。
# 默认配置:使用DiTer-OS数据集,KISS-ICP作为LiDAR里程计后端
bash scripts/train.sh
# 自定义配置:使用KITTI数据集,指定训练和验证序列
DATA_DIR=/storage/KITTI \
DATA_TYPE=kitti \
TRAIN_SEQS="07" \
VALID_SEQS="07" \
LO_MODEL=kiss_icp \
bash scripts/train.sh
关键的训练参数包括:
学习率:默认1e-3•
批次大小:默认32•
训练轮数:默认30•
GMM组件数:默认自动选择•
窗口大小:默认0.2秒
这些参数可以通过修改scripts/train.sh文件顶部的环境变量进行调整。对于大多数应用场景,默认参数已经能够提供良好的性能。
训练过程中,系统会定期保存检查点文件到results/目录,并记录训练和验证损失曲线。用户可以通过TensorBoard或其他可视化工具监控训练进度。当验证误差不再下降时,训练会自动停止,最佳模型被保存为best.ckpt。
7.4 推理与部署
训练完成后,模型可以用于实时IMU去噪和里程计估计。推理流程相对简单,但需要注意几个关键细节以确保性能和准确性。
模型加载与初始化:
# 加载训练好的模型
checkpoint = torch.load("results/best.ckpt")
model = IMUNet(config)
model.load_state_dict(checkpoint['model_state_dict'])
model.eval() # 切换到评估模式
实时推理流程:在实时应用中,IMU数据以流式方式到达。系统维护一个滑动窗口缓冲区,每当窗口填满时(通常0.2秒),就进行一次前向推理。网络输出去噪后的IMU测量值和协方差,这些输出可以直接送入预积分模块或卡尔曼滤波器。
# 滑动窗口推理
imu_buffer = []
for imu_data in imu_stream:
imu_buffer.append(imu_data)
if len(imu_buffer) >= window_size:
# 构造输入张量
imu_window = torch.tensor(imu_buffer[-window_size:]).unsqueeze(0)
# 前向推理
with torch.no_grad():
acc_denoised, gyr_denoised, acc_cov, gyr_cov = model(imu_window)
# 使用去噪后的测量值进行位姿估计
pose_increment = preintegrate(acc_denoised, gyr_denoised, dt)
current_pose = current_pose @ pose_increment
性能优化:对于实时应用,推理速度至关重要。KISS-IMU的网络设计已经考虑了计算效率,在NVIDIA Jetson Xavier上可以达到200Hz以上的推理频率,满足大多数机器人应用的需求。进一步的优化可以通过模型量化、TensorRT加速或ONNX导出实现。
# 使用TensorRT加速(可选)
python scripts/export_tensorrt.py --checkpoint results/best.ckpt --output model.trt
# 或导出为ONNX格式
python scripts/export_onnx.py --checkpoint results/best.ckpt --output model.onnx
与传感器融合系统集成:KISS-IMU的输出可以无缝集成到现有的传感器融合框架中。协方差输出使得系统能够动态调整IMU在融合中的权重,提高整体定位精度。例如,在GTSAM或Ceres等优化框架中,可以直接使用预测的协方差作为测量噪声模型。
# 集成到GTSAM优化框架
import gtsam
# 使用KISS-IMU预测的协方差构造噪声模型
imu_noise = gtsam.noiseModel.Diagonal.Variances(
np.concatenate([acc_cov.numpy(), gyr_cov.numpy()])
)
# 添加IMU因子到因子图
imu_factor = gtsam.ImuFactor(
pose_key_i, vel_key_i, pose_key_j, vel_key_j, bias_key,
preintegrated_measurements, imu_noise
)
graph.add(imu_factor)
8. 总结与展望
KISS-IMU的技术创新转化为了实际应用中的显著优势。在多个公开数据集上的实验表明,KISS-IMU相比传统IMU预积分方法,将绝对位姿误差降低了约60%,相对位姿误差降低了约50%。这种性能提升使得纯IMU里程计在短时间内(数十秒)能够提供可靠的位姿估计,为传感器融合系统提供了强有力的支撑。
系统的实时性能也满足了实际应用需求。在NVIDIA Jetson Xavier等嵌入式平台上,KISS-IMU可以达到200Hz以上的推理频率,远超IMU的采样率。这种高效的推理能力使得系统能够部署在资源受限的移动机器人和无人机上。
参考资源
论文:KISS-IMU: Keep IMU Stable and Strong (IEEE ICRA 2026 Award Finalist)•
代码仓库:https://github.com/sparolab/KISS-IMU•
KISS-ICP:https://github.com/PRBonn/kiss-icp•
PyTorch:https://pytorch.org•
pypose:https://github.com/pypose/pypose
379