初创实习-IMU模型

1. IMU 数据

一般由 6 轴或者 9 轴数据组成,单位是 g ,也是是重力加速度单位 1g=9.81 m/s2 。例子如以下所示:

csv 复制代码
,Acc_x,Acc_y,Acc_z,Gyro_x,Gyro_y,Gyro_z,Mag_x,Mag_y,Mag_z,label
0,-0.109497,-0.130493,-1.009521,-21.827697,2.431869,-17.713546,-45.6501,46.182479,-7.128815,Eating/Drinking
1,-0.109985,-0.087036,-1.02417,-18.714904,2.187729,-18.018722,-44.1501,46.632476,-4.578812,Eating/Drinking
2,-0.133423,-0.087036,-1.01001,-5.470276,-1.470566,-18.445968,-44.750106,47.532485,-4.428818,Eating/Drinking
1.1 三轴加速度 Acc_x,Acc_y,Acc_z

测量物体直线方向上的加速度,永远包含地球重力。它的作用如下:

  1. 判断倾斜角度(俯仰、横滚)
    静止的时候,重力在三个轴上分配不一样。手机倾斜,Acc‑z、Acc‑x 读数就变,就能算出板子歪了多少度。

局限:只有静止 / 慢速时角度才准;一动起来有运动加速度,角度就不准了。

  1. 检测震动、冲击、跌落
    突然摔下去,加速度会剧烈变化。比如猫咪跌倒检测、手环计步、碰撞报警。
  2. 计步、运动识别
    走路、跑步时身体上下晃动,Acc_z 周期性起伏,就能数步数。
  3. 理论积分得到速度、位移(不推荐单用)
    加速度积分 → 速度;速度再积分 → 位置。
    ❌ 致命缺点:噪声会快速累积漂移,几秒位置就完全跑偏。不能单独用 Acc 做定位

加速度每列字段的含义:

字段 数值 > 0 数值 < 0 数值 ≈ 0 数值突然很高
Acc_x 沿 X 轴正向加速(如板子向右倾) 沿 X 轴负向加速(如板子向左倾) X 方向无重力分量、无加速度 冲击 / 震动方向偏向 X 轴
Acc_y 沿 Y 轴正向加速(如前倾) 沿 Y 轴负向加速(如后倾) Y 方向无重力分量、无加速度 冲击 / 震动方向偏向 Y 轴
Acc_z Z 轴朝上,静止≈+9.81 Z 轴朝下,静止≈‑9.81 失重 / 自由下落瞬间 跳跃落地、撞击、剧烈抖动(如 20‑40)
1.2 三轴陀螺仪 Gyro_x,Gyro_y,Gyro_z

测量绕 X/Y/Z 轴转得有多快(角速度),作用如下:

  1. 捕捉瞬间旋转动作

    快速扭头、翻身、转身,陀螺仪立刻读到转速。

    例:猫咪快速甩头、无人机快速转弯。

  2. 积分算出旋转角度

    角速度 × 时间 = 转过多少角度。

例:Gyro_x=50°/s,持续 0.2s → 绕 X 轴转了 10°

  1. 短时间内姿态非常精准
    转动的一瞬间,陀螺仪比加速度计靠谱得多。

测量绕轴旋转的角速度,单位 rad/s 或 °/s;静止理想值≈0,正负代表转向

字段 数值 > 0 数值 < 0 数值 ≈ 0 数值突然很高
Gyro_x 绕 X 轴正向旋转(向前翻滚) 绕 X 轴反向旋转(向后翻滚) 无绕 X 轴转动 快速翻滚、翻身
Gyro_y 绕 Y 轴正向旋转(抬头) 绕 Y 轴反向旋转(低头) 无绕 Y 轴转动 猛地抬头 / 低头
Gyro_z 绕 Z 轴正向旋转(顺时针转头) 绕 Z 轴反向旋转(逆时针转头) 无水平转向 快速转头、转身
1.3 Acc 加速度和 Gyro 陀螺仪的融合

加速度计 Acc: 适合计算生物是否为 active(剧烈 Active 或者轻轻 Active,运动步数,摔倒次数,横移速度);

  • 个人运动计划也是这么来的;

陀螺仪 Gyro: 适合计算翻滚、掉头这些内容;

行为 依靠什么信号
猫咪安静趴着不动 Acc_z≈1g,所有 Gyro≈0
猫咪抬头低头 Gyro_y 出现峰值,Pitch 角度变化
猫咪左右扭头 Gyro_z 出现峰值,Yaw 变化
猫咪翻身打滚 Gyro_x 剧烈变化,Roll 大幅度摆动
猫咪奔跑跳跃 Acc 出现剧烈波动、冲击尖峰

2. IMU 数据预处理

2.1 下采样多数类

数据有一种情况,数据集天然不平衡,A 类目样本极多;B 类目样本极少。模型容易偷懒:一直预测大类,小类识别很差。

  • Resting 只留下原数据 10%;Walking 留下 30%
python 复制代码
# 下采样 Resting - 保留 10%
resting_mask = df['label'] == 'Resting'
resting_df = df[resting_mask].sample(frac=0.1, random_state=42)
# 下采样 Walking - 保留 30%
walking_mask = df['label'] == 'Walking'
walking_df = df[walking_mask].sample(frac=0.3, random_state=42)
2.2 过采样少数类

少数类样本太少,复制重复已有样本扩充数量

⚠️ 缺陷:简单重复过采样容易过拟合,模型死记硬背少数样本;更好方案:SMOTE 时序增强、窗口随机抖动、数据增强,而不是单纯复制。

json 复制代码
pooping_mask = df['label'] == 'Pooping/Urinating'
running_mask = df['label'] == 'Running'
scratching_mask = df['label'] == 'Scratching'
pooping_df = df[pooping_mask]
running_df = df[running_mask]
scratching_df = df[scratching_mask]

# 过采样(重复采样)
pooping_oversampled = pooping_df.sample(n=len(pooping_df)*4, replace=True, random_state=42)  # 5倍
running_oversampled = running_df.sample(n=len(running_df)*6, replace=True, random_state=42)  # 7倍
scratching_oversampled = scratching_df.sample(n=len(scratching_df)*2, replace=True, random_state=42)  # 3倍

结论: 这没啥用,容易直接过拟合;

2.3 取出 IMU 特征 + 标准化

对训练数据进行重采样:

如果你只用单独一行 6 个数字喂给模型,你只看见了某一个瞬时角速度,看不到上升、下降的完整波形,神经网络根本无法区分:抬头 / 低头 / 身体抖动。所以我们需要 window 来选取数据序列:

  • window_size = 40 代表:

一条训练样本 = 连续 40 行 IMU 数据

样本形状:(40, 6)

一条样本的时间间隔依靠 IMU 的采样率(我们的设备):

  • IMU 数据的采样率 40Hz(每秒采集 50 次),一条数据间隔 0.025s

所以,我们需要对 50Hz 的数据进行重采样,保证推理和训练的时间尺度一致:

相关推荐
a187927218311 小时前
【算法】回溯算法(一):从一道 IP 题到万能模板
算法·leetcode·go·回溯·leetcode93·ip复原·算法讲解
鹿角片ljp1 小时前
LeetCode 19:删除链表的倒数第 N 个节点复盘| dummy + 快慢指针
算法·leetcode·链表
枫叶林FYL1 小时前
【群体智能集群控制工程实践】第1章 群体智能核心原理
人工智能·深度学习
是Yu欸1 小时前
实测openPangu-2.0-Pro:昇腾原生, 505B大模型的开源答卷
人工智能·开源·大模型·昇腾·pangu
FPGA开源工坊1 小时前
ISP图像处理--Bayer Raw格式
图像处理·人工智能·verilog·fpga·isp
2601_967659891 小时前
2026停车场巡检机器人排行:地下停车场夜间巡逻怎么选
人工智能·机器人
Csvn1 小时前
第 15 章 规划 Planning
人工智能·aigc·agent
workflower1 小时前
TF-IDF 的基本思想
人工智能·机器学习·机器人·云计算·无人机
数据狐(Datafox)1 小时前
mercadolibre.item_get 工程实战:美客多商品详情API技术解析与落地应用
java·人工智能·mysql·json