3、关节传感器:编码器原理(增量式/式)、霍尔传感器、电位计、IMU
聊到人形机器人的关节,传感器就是它的「眼睛」和「耳朵」。没有传感器,电机就是个瞎转的蛮牛,控制器根本不知道关节到底转到了哪。
我个人习惯把关节传感器分成两大类:一类是测位置的,一类是测姿态的。位置传感器里,编码器是的主角;霍尔和电位计则是特定场景下的「老兵」;而IMU,嗯,它更像是给整个身体找平衡的「小脑」。
今天咱们就把这几个家伙挨个捋一遍。我踩过的坑,也会一并告诉你。
核心逻辑图:关节传感器家族
3.1 编码器:关节位置的「眼睛」
编码器是关节里用得最多的传感器。说白了,它就是把机械转角变成电信号的东西。我做过一个项目,电机选型时没注意编码器分辨率,结果机器人走路时脚底一直抖——那就是位置反馈太粗糙了。
编码器分两种:增量式和式。区别在哪?我打个比方你就懂了。
3.1.1 增量式编码器
增量式编码器只输出脉冲。它告诉你「我转了多少步」,但不告诉你「我现在在哪儿」。就像你闭着眼睛走路,有人在你耳边数「一步、两步、三步…」,但你不知道自己在房间的哪个角落。
它的原理很简单:码盘上刻了一圈明暗相间的条纹,光耦透过条纹产生脉冲。A、B两相相差90度,用来判断方向;Z相是零位信号,每转一圈出一个脉冲。
我的经验:增量式编码器便宜、响应快,但有个致命缺点——断电后位置丢失。每次上电必须回零。我在调试双足机器人时,就因为忘记写回零逻辑,开机后机器人直接劈了个叉…嗯,从那以后我都在代码里加了上电自检。
// 增量式编码器读取示例(伪代码)
int count = 0;
int lastA = 0;
void encoderISR() {
int A = digitalRead(ENCODER_A);
int B = digitalRead(ENCODER_B);
if (A != lastA) {
if (A == B) {
count++; // 正转
} else {
count--; // 反转
}
}
lastA = A;
}
float getAngle() {
return (float)count / PULSES_PER_REV * 360.0f;
}
3.1.2 式编码器
式编码器就高级多了。它直接输出一个二进制码,告诉你当前角度。你想想看,就像你手里拿了个指南针,任何时候都知道自己面朝哪边。
它的码盘上刻的是格雷码或二进制码,每个位置对应唯一编码。常用的有SSI接口、BiSS接口,现在很多也用SPI。
| 特性 | 增量式 | 式 |
|---|---|---|
| 断电记忆 | ❌ 丢失 | ✅ 保持 |
| 分辨率 | 高(可到几万线) | 中高(常见12-20位) |
| 成本 | 低 | 高 |
| 接线 | 3-6根线 | 4-8根线(含通信) |
| 典型应用 | 轮式机器人、低成本关节 | 人形机器人髋/膝/踝关节 |
注意:式编码器虽然不掉位置,但多圈式编码器内部有机械齿轮或电子计数器,长时间运行后可能因电池掉电导致多圈值丢失。我建议在关键关节(如支撑腿)使用多圈式,并定期校准。
3.2 霍尔传感器:简单可靠的「磁感」方案
霍尔传感器利用霍尔效应——当磁场垂直于电流方向时,导体两侧会产生电势差。说白了,就是靠磁铁和霍尔芯片的相对位置来测角度。
我在早期做舵机时用过霍尔。它比编码器便宜,而且不怕油污、不怕震动。但精度嘛…一般也就8-12位,用在手指关节或不太精度的位置还行。
霍尔传感器有两种常见用法:
- 开关型:检测磁铁是否靠近,常用于限位开关、电机换相
- 线性型:输出与磁场强度成正比的电压,配合磁铁可测角度
线性霍尔测角度时,通常用一对正交放置的霍尔芯片,配合径向充磁的磁铁。这样能同时测出正弦和余弦值,通过atan2算出角度。
避坑指南:霍尔传感器对安装间隙非常敏感。我曾经因为磁铁和芯片距离差了0.5mm,导致角度输出非线性严重。后来加了机械定位销才解决。记住:霍尔方案的关键是机械一致性。
3.3 电位计:最古老的「分压」方案
电位计,说白了就是个可变电阻。旋转轴带动电刷在电阻体上滑动,输出分压值。ADC一读,就知道角度了。
它便宜、简单、不需要复杂电路。但缺点也很明显:
- 磨损:电刷和电阻体物理接触,用久了会磨损
- 噪声:电刷滑动时会产生噪声,需要滤波
- 有限转角:通常只有300度左右,不能连续旋转
我在一些老式机械臂的腕部关节见过电位计。说实话,现在人形机器人里用得少了。但如果你做低成本教育机器人,或者做关节的位置粗校准,电位计还是能用的。
// 电位计读取示例(Arduino)
int potPin = A0;
int rawValue = analogRead(potPin);
float voltage = rawValue * (5.0f / 1023.0f);
float angle = (voltage / 5.0f) * 300.0f; // 假设电位计量程300度
3.4 IMU:关节的「平衡感」
IMU(惯性测量单元)不是直接测关节角度的,它测的是加速度和角速度。但为什么我要把它放在关节传感器里讲?
因为人形机器人走路时,光靠编码器不够。编码器只能测电机转了多少,但腿有没有打滑?身体有没有倾斜?这些编码器不知道。IMU就是来补这个缺的。
IMU内部通常包含:
- 加速度计:测三轴加速度,静态时可算出俯仰和横滚角
- 陀螺仪:测三轴角速度,积分可得角度变化
- (可选)磁力计:测地磁场,辅助航向角
我习惯把IMU装在机器人躯干中心,而不是关节里。但有些高端关节会在电机后端集成一个微型IMU,用来补偿编码器的动态误差。
注意:陀螺仪有零偏漂移,加速度计有振动噪声。单独用哪个都不靠谱。我建议用卡尔曼滤波或互补滤波把两者融合。千万别直接对陀螺仪积分算角度——我见过有人这么干,结果积分10秒后角度漂了30度,机器人直接摔了。
3.5 传感器选型建议
说了这么多,到底怎么选?我个人的经验是:
| 关节类型 | 推荐方案 | 理由 |
|---|---|---|
| 髋/膝/踝(承重关节) | 多圈式编码器 + IMU | 精度高、不掉位置、可补偿动态误差 |
| 肩/肘(轻载关节) | 增量式编码器 + 限位开关 | 成本低、回零简单 |
| 手指/手腕(小关节) | 霍尔传感器 或 微型电位计 | 体积小、够用就行 |
| 躯干/头部 | IMU(6轴或9轴) | 姿态感知、平衡控制 |
嗯,传感器这块内容不少,但核心就一句话:选对传感器,比选贵的传感器更重要。我见过有人给手指关节装式编码器,结果成本翻了三倍,精度却过剩了。也见过有人给髋关节用增量式,结果每次开机都要摆个「归零pose」,用户体验极差。
好了,这一章就到这儿。传感器是关节标定的基础,下一章咱们聊聊怎么把这些传感器的数据对齐、校准,让它们真正协同工作。
本章要点回顾:
- 增量式编码器:便宜、高速,但断电丢位置
- 式编码器:不掉位置、精度高,但贵
- 霍尔传感器:抗干扰、体积小,精度一般
- 电位计:简单可靠,但磨损和噪声是硬伤
- IMU:测姿态和加速度,需要滤波融合
- 选型原则:按关节重要程度和精度需求来,别盲目堆料
可可精品资料库