3. 传感器与数据采集:关节编码器、力矩传感器、IMU的数据特性与噪声分析
做机器人关节标定,说白了就是跟传感器打交道。你算法写得再漂亮,传感器数据不准,后面全是白搭。我这些年调过的机器人,十有八九的问题都出在“没读懂传感器”上。
这一章咱们就聊聊三种核心传感器:关节编码器、力矩传感器、IMU。不扯理论推导,只讲实际项目中你一定会碰到的数据特性和噪声坑。
3.1 关节编码器:位置与速度的“眼睛”
编码器是机器人关节里最基础的传感器。它告诉你电机转了多少度,或者转得多快。但同样是编码器,类型不同,脾气完全不同。
3.1.1 增量式 vs 式
| 特性 | 增量式编码器 | 式编码器 |
|---|---|---|
| 上电位置 | 未知,需要回零 | 立即知道 |
| 分辨率 | 高(可做电子细分) | 受限于码盘位数 |
| 抗干扰 | 脉冲易受电磁干扰 | 数字通信,抗干扰强 |
| 成本 | 低 | 高 |
| 典型应用 | 轮式机器人、轻载关节 | 协作臂、精密转台 |
我个人习惯:只要预算允许,式编码器是首选。尤其是协作机器人,上电就知道姿态,省去回零流程,安全性高一大截。增量式虽然便宜,但脉冲丢失的问题很头疼——我在一个AGV项目里遇到过,电机振动导致编码器丢了几十个脉冲,定位直接偏了半厘米。
3.1.2 编码器噪声来源
编码器的噪声,不是白噪声,而是有规律的。常见的有这么几类:
- 量化噪声:分辨率有限导致的阶梯误差。比如12位编码器,每圈4096个脉冲,角度分辨率约0.088°。这个误差是固定的,无法消除。
- 安装偏心:码盘中心与旋转轴中心不重合。表现为位置误差随角度呈正弦变化。我见过一个案例,偏心0.1mm,在半径50mm的码盘上,最大角度误差达到0.11°。
- 电磁干扰:电机PWM切换时,高频噪声耦合到编码器信号线上。增量式编码器的A/B相脉冲会多出毛刺,导致计数错误。
- 温度漂移:光学编码器的LED发光效率随温度变化,信号幅值波动,严重时会导致丢码。
3.1.3 速度计算:直接差分 vs 测频法
从编码器位置算速度,最直接的方法是差分:v = (p2 - p1) / Δt。但这个方法对噪声极其敏感。你想想看,位置量化误差0.01°,如果采样周期1ms,速度误差就是10°/s。这噪声太大了。
实际工程中,我常用两种方法:
- M法(测频法):固定时间窗口内计数脉冲数。适合高速场景。
- T法(测周法):测量两个脉冲之间的时间间隔。适合低速场景。
- M/T法:结合两者,宽速域适用。
// M/T法速度计算示例(伪代码)
uint32_t pulse_count; // 时间窗口内的脉冲数
uint32_t time_interval_us; // 时间窗口长度(微秒)
float speed_deg_per_s;
// 假设编码器每圈脉冲数 PPR = 4096
speed_deg_per_s = (float)pulse_count / 4096.0f * 360.0f / (time_interval_us / 1e6f);
// 注意:当 pulse_count 很小时(低速),误差会急剧增大
// 此时应切换到 T 法:测量单个脉冲的宽度
3.2 力矩传感器:力控的“手感”
力矩传感器让机器人有了“触觉”。没有它,力控就是盲人摸象。但力矩传感器的噪声特性,比编码器复杂得多。
3.2.1 应变式 vs 磁弹性式
| 特性 | 应变式力矩传感器 | 磁弹性式力矩传感器 |
|---|---|---|
| 原理 | 应变片电桥 | 磁致伸缩效应 |
| 刚度 | 高(变形小) | 较低 |
| 带宽 | 可达5kHz | 1~2kHz |
| 温漂 | 明显(需补偿) | 较小 |
| 抗过载 | 弱(易损坏) | 强 |
我个人更偏爱应变式,虽然温漂麻烦,但刚度和带宽是实打实的优势。磁弹性式在重载场景有优势,但响应慢,不适合精细力控。
3.2.2 力矩传感器的噪声模型
力矩传感器的噪声,可以分解为:
- 白噪声:电子热噪声、ADC量化噪声。功率谱密度平坦,通常用RMS值描述。
- 1/f噪声:低频段功率谱密度与频率成反比。表现为零点缓慢漂移。
- 振动噪声:机器人运动时,关节振动通过机械结构耦合到传感器。频率通常在几十Hz到几百Hz。
- 温度漂移:应变片电阻随温度变化,导致零点偏移。典型值0.1%~0.5% FS/10°C。
3.2.3 滤波策略
对付力矩噪声,不能一刀切地低通滤波。滤波太狠,力控带宽不够,机器人反应迟钝;滤波太轻,噪声直接进控制器,系统会抖。
我常用的策略是分层滤波:
- 硬件低通滤波:在ADC前端加RC滤波器,截止频率设为力控带宽的5~10倍。比如力控带宽50Hz,RC截止频率设在250~500Hz。
- 软件均值滤波:对ADC采样值做滑动平均,窗口长度根据采样率调整。比如1kHz采样率,窗口取4~8个点。
- 自适应陷波滤波器:针对特定频率的振动(比如关节的机械共振频率),用陷波滤波器消除。这个频率可以通过扫频实验获得。
// 滑动均值滤波示例
#define FILTER_WINDOW 8
float torque_buffer[FILTER_WINDOW] = {0};
int buffer_index = 0;
float torque_filtered = 0;
float filter_torque(float raw_torque) {
torque_buffer[buffer_index] = raw_torque;
buffer_index = (buffer_index + 1) % FILTER_WINDOW;
float sum = 0;
for (int i = 0; i < FILTER_WINDOW; i++) {
sum += torque_buffer[i];
}
torque_filtered = sum / FILTER_WINDOW;
return torque_filtered;
}
3.3 IMU:姿态感知的“小雷达”
IMU(惯性测量单元)包含加速度计和陀螺仪。在机器人上,IMU通常安装在基座或末端,用于感知姿态和振动。但IMU的数据,是所有传感器里最“脏”的。
3.3.1 加速度计 vs 陀螺仪
| 特性 | 加速度计 | 陀螺仪 |
|---|---|---|
| 测量量 | 比力(加速度 + 重力) | 角速度 |
| 静态特性 | 可测重力方向(倾角) | 零偏不稳定 |
| 动态特性 | 对振动敏感 | 高频响应好 |
| 主要误差 | 零偏、比例因子、噪声 | 零偏、角度随机游走 |
为什么说IMU数据脏? 加速度计测的是“比力”,不是纯加速度。机器人运动时,关节振动、电机电磁力都会叠加在信号上。陀螺仪更麻烦,它的零偏会随时间缓慢变化,积分出来的角度会漂移。
3.3.2 IMU噪声参数
IMU的噪声,通常用两个指标描述:
- 角度随机游走(ARW):陀螺仪白噪声积分后,角度误差随时间以√t增长。单位:°/√h。
- 速度随机游走(VRW):加速度计白噪声积分后,速度误差随时间以√t增长。单位:m/s/√h。
举个例子:一个陀螺仪的ARW为0.01°/√h。这意味着积分1小时后,角度误差约0.01°;积分10小时后,误差约0.032°。看起来不大?但如果你做纯积分姿态估计,10分钟误差就可能达到0.1°以上。
3.3.3 传感器融合:互补滤波 vs 卡尔曼滤波
单独用加速度计或陀螺仪都不靠谱。加速度计低频准、高频噪;陀螺仪高频准、低频漂。互补滤波就是利用这个特性:
// 互补滤波姿态估计(简化版)
float angle = 0; // 估计角度
float gyro_rate; // 陀螺仪角速度
float acc_angle; // 加速度计计算的角度
float dt; // 采样周期
float alpha = 0.98; // 互补系数
// 每次采样执行
angle = alpha * (angle + gyro_rate * dt) + (1 - alpha) * acc_angle;
alpha取0.98,意味着98%信任陀螺仪的积分,2%信任加速度计。这个系数决定了融合的截止频率。alpha越大,截止频率越低,对加速度计噪声的抑制越强,但动态响应越慢。
卡尔曼滤波更优,但调参麻烦。你需要知道过程噪声协方差Q和测量噪声协方差R。Q越大,越信任测量值;R越大,越信任模型预测。我一般先通过Allan方差分析确定IMU的噪声参数,再据此设定Q和R的初值。
3.4 本章知识体系
下面这张图总结了三种传感器的数据特性、噪声来源和应对策略。你可以把它当作选型和调试的快速参考。