首页 / 驱动算法 / 机器人控制专题

端侧 AI 与机器人:为什么在关节模组里跑推理

机器人的 AI 越来越多不在云端,而在设备本地——关节模组、灵巧手、视觉板卡里。本文讲清楚:端侧 AI 是什么、机器人为什么需要它(延迟/带宽/离线可靠性);硬件分层(MCU + CMSIS-NN、MCU+NPU、应用处理器);INT8 量化为什么是端侧的关键技术(体积 1/4、速度 2~4 倍);端侧 AI 在控制环路里的正确位置(FOC 控制律保持确定性,AI 做感知/辨识/补偿);三个典型任务(关节故障检测、视觉抓取、触觉识别);部署全流程(训练→量化→转换→板端);以及先楫 HPM 实战(国产 RISC-V:无 NPU 靠主频 + DSP 指令跑 INT8、hpm_sdk 开源、FOC 与故障检测一芯两用);配部署流水线 + 量化收益对比交互演示与可编译 INT8 推理 C 代码。

1. 端侧 AI 是什么:模型下到设备,数据不出设备

端侧 AI(Edge AI / On-device AI)= 把训练好的模型部署到设备本地,推理在设备上完成,不需要把数据传云端再等结果。三个特征:

  • 模型下到设备:几 KB~几 MB 的参数以代码/常量形式烧进固件;
  • 推理在本地:传感器数据 → 模型前向计算 → 输出,全程不离开设备;
  • 与云端互补:重模型(大语言模型、大规模训练)在云端,实时/敏感/离线任务在端侧。

对你的场景最贴切的一句话:关节模组里跑一个 20KB 的故障检测模型,和云端跑一个 8GB 的大模型,是两种完全不同的工程——本文只讲前者。

2. 为什么机器人要端侧 AI:延迟、带宽、离线

维度云端推理端侧推理机器人的诉求
延迟100ms 级(上传+排队+回传)1~10ms 级(本地前向)控制/避障要 ms 级响应
带宽多关节×高速传感全上传,总线打爆只上传"结论"(几字节)CAN/EtherCAT 帧很贵
离线断网即瘫本地推理不受影响产线/野外不容忍断网
隐私/安全原始数据出境数据本地消化工艺数据不出厂

典型数字(示意):视觉抓取里"看到→决策→动"全链路,云端方案 200ms+,端侧 NPU 方案可以压到 20ms 以内——机械臂抓取飞跑的工件,差的就是这 180ms。

3. 端侧硬件分层:从 MCU 到应用处理器

层级代表算力功耗适合任务
MCU(无 FPU/NPU)Cortex-M0/M3 + CMSIS-NN几十~几百 MOPSmW 级轻量分类:故障检测、振动辨识
RISC-V 高性能 MCU先楫 HPM(HPM6000/5300/6E00)200~816MHz 主频 + DSP 指令百 mW~W 级轻量 CNN、FOC + 故障检测一芯两用(第 9 节)
MCU(带 NPU)STM32N6、瑞萨 RA8、国产 MCU+NPU0.1~几 TOPS百 mW 级视觉检测、语音唤醒、姿态估计
应用处理器RK3588(6 TOPS NPU)、Jetson Orin Nano几~几十 TOPSW 级目标检测/位姿/分割等完整视觉
FPGA/ASIC自定义数据流按需按需超低延迟固定流水线

选型口诀:先在 MCU 上能不能压进 100KB 模型和 10ms 预算,压不进再往上一级——端侧的精髓是用最便宜的硬件完成刚好够用的任务,而不是越大越好。

4. INT8 量化:端侧最关键的"减重"技术

训练出来模型是 FP32(每个权重 4 字节);端侧 MCU 常用 INT8 量化(每个权重 1 字节):

FP32 → INT8 的收益(同一模型): 模型体积:约为原来的 1/4 (4 字节 → 1 字节/权重) 推理速度:约快 2~4 倍 (INT8 乘法用 DSP/SIMD 加速) 内存占用:约为原来的 1/4 (激活也量化) 精度损失:一般 1~3% 以内 (PTQ 后处理量化) 量化原理(对称量化示意): q = round(x / scale) —— 浮点 x 转 8bit 整数 scale = max(|x|) / 127 —— 按范围缩放 INT8 卷积:q_out = Σ q_w × q_in (INT32 累加) 反量化: x_out = q_out × scale_w × scale_in

工程事实:10 万参数的模型 FP32 要 400KB,INT8 只要 100KB——正好卡进主流 MCU 的 Flash 预算。这就是"能不能端侧"的分水岭。

5. 端侧 AI 在控制环路里的位置:不碰 FOC

最常见的误区是把 AI 塞进控制律。正确分层是AI 在外环,确定性控制在里环:

┌─────────────────────────────────────────────┐ │ 感知级(AI 为主): 视觉抓取/触觉识别/异常检测 │ Hz~kHz ├─────────────────────────────────────────────┤ │ 决策级(AI + 规则): 轨迹选择/策略/任务切换 │ Hz~百 Hz ├─────────────────────────────────────────────┤ │ 执行级(确定性控制,FOC 不变): 电流/速度/位置环 │ kHz~十 kHz │ 三闭环仍是 PID/DOB/前馈——AI 不替代控制律 │ └─────────────────────────────────────────────┘ AI 在关节侧的三个合理入口: ① 感知输入:电流/振动/触觉分类 → 输出"状态标签+置信度" ② 参数辨识:齿槽/摩擦/惯量的在线辨识 → 喂给 DOB/前馈 ③ 健康监测:故障预测 → 告警/降额,不进实时环

为什么:FOC 是 10kHz 级的确定性反馈,任何 AI 推理的 jitter 都会直接污染电流环;而AI 擅长的"看状态、做判断"恰恰是确定性算法不擅长的。各干各的,组合最优。

6. 典型任务 1:关节侧的端侧 AI(故障检测与辨识)

  • 输入:一段电流/振动/编码器信号(如 128 点电流窗 + 转速 + 温度);
  • 模型:1D CNN 或轻量 MLP(几万~几十万参数,INT8 后几十 KB);
  • 输出:类别 + 置信度(正常/齿面磨损/润滑不足/匝间短路……);
  • 部署点:关节模组 MCU 内,随每个控制周期采样、低速后台推理;
  • 价值:把"坏了才发现"变成"趋势里提前告警",减速器磨损这类慢变量正合适。

注意区分:这类模型学习的是信号特征(频域/时域模式),不是控制对象——它输出的是"建议/告警",不直接进电流环。

7. 典型任务 2:机器人感知(视觉抓取与触觉识别)

  • 视觉抓取:端侧 NPU 跑目标检测/6D 位姿估计 → 输出抓取点 → 送给运动学(第 30 篇的 IK)→ 执行。相机数据不出板,延迟从"云"压到"端";
  • 触觉识别:灵巧手(第 28 篇)的阵列式触觉 → 端侧分类"抓没抓稳/什么材质/滑动趋势" → 反馈给阻抗控制;
  • 语音唤醒:关节/整机上的关键词检测(几 KB 模型),MCU 上常开监听。

共同点:都是"传感→判断→给上层指令",输出量小、实时性要求高——端侧 AI 的天然主场。

8. 部署流程:训练 → 量化 → 转换 → 板端

步骤做什么常用工具产出
① 训练收集数据、训模型、验证精度PyTorch / TensorFlowFP32 模型
② 量化PTQ(简单)或 QAT(精度敏感时)torch.ao.quantization / TFLite ConverterINT8 模型
③ 转换转成目标运行时格式/算子集TFLite Micro / ONNX Runtime / CMSIS-NN / 厂商 SDK(RKNN、STM32Cube.AI)C 数组/模型文件
④ 板端部署烧进固件、联调、回归验证MCU IDE / 板上脚本可运行固件

两条硬约束:目标算子必须在目标运行时里存在(TFLite Micro 不支持某些层 → 换结构或手写算子);量化后必须重测(PTQ 掉点超 3% 就上 QAT 或换结构)。

9. 先楫 HPM:国产 RISC-V 上的端侧 AI 实战

国产平台里,先楫(HPMicro)HPM 系列是端侧 AI 与电机控制结合的代表——高性能 RISC-V MCU,多数不带 NPU,靠主频 + DSP/SIMD 指令把 INT8 推理跑进毫秒级:

系列定位主频/核端侧 AI 相关
HPM6000 系列(HPM6750 等)高性能通用816MHz 双核小 CNN/音频/视觉前处理
HPM5300 系列电机控制向约 200MHz 双核FOC + 故障检测一芯两用
HPM6E00 系列运动控制 + 工业以太网高主频实时核内置 EtherCAT 从站控制器,AI 做感知/辨识

要点(参数以官方最新 datasheet 为准):

  • 没有 NPU 怎么跑 AI:INT8 卷积本质是乘加——800MHz 级主频 + DSP 指令(对标 CMSIS-NN 的 RISC-V 算子库),几十 KB 模型毫秒级(示意)。选型看"乘加吞吐/主频",不必盯着 TOPS 数字;
  • 软件生态:hpm_sdk 开源(GitHub HPMicro),VS Code + OpenOCD / SEGGER Embedded Studio / IAR;TFLite Micro 可移植,卷积算子换成 RISC-V DSP 实现即可;
  • 与电机控制一芯两用:HPM5300 自带 3 组 PWM + 高精度 ADC + 编码器接口做 FOC,同核后台跑电流窗故障分类(第 6 节任务 1)——省一块芯片,也天然满足第 5 节"AI 不进电流环"的分层;
  • 移植口径:第 11 节的 C 骨架直接可移植到 HPM(把 CMSIS-NN 类算子换成 RISC-V DSP 版本,其余结构不变)。

10. 案例:关节故障分类的小模型长什么样

一个能进 MCU 的最小模型(示意参数):

输入:电流窗 128 点(1 通道,归一化) 网络:1D 卷积(3→8, k=5) → ReLU → 全局平均池化 → 全连接(8→4) 参数:约 8×3×5 + 8 + 4×8 + 4 = 164 个权重(FP32 ≈ 656B,INT8 ≈ 164B) 参数量级:几百~几千字节 —— MCU 里毫无压力 推理开销(Cortex-M4 上 INT8,示意):< 1ms 训练时用 PyTorch,量化后导出 164 字节 C 数组, 固件里就是一个 const int8_t weights[] —— 见第 10 节代码。

这个规模说明一件事:端侧 AI 不都是"大模型"——关节故障分类这种"窄任务、强特征"的问题,模型小到可以手写进代码。

11. 可编译 C 代码:INT8 推理骨架

完整可编译:INT8 对称量化的一维卷积 + 全连接推理,纯 C 无依赖,就是第 9 节模型的前向实现:

/* edge_ai.c —— INT8 1D 卷积 + 全连接推理骨架(关节故障分类示意)*/ #include <stdio.h> #include <stdint.h> #include <string.h> #define IN_LEN 128 /* 输入电流窗 */ #define C_OUT 8 /* 卷积输出通道 */ #define K_SIZE 5 /* 卷积核长度 */ #define N_CLASS 4 /* 类别数 */ /* INT8 对称量化权重(示意值,真实模型由训练导出)*/ static const int8_t w_conv[C_OUT][K_SIZE] = { {1, -2, 3, -1, 1}, {-1, 2, 1, -3, 2}, {2, 1, -2, 1, -1}, {-2, -1, 3, 2, -1}, {1, 3, -1, -2, 2}, {-1, 1, 2, -3, 1}, {2, -2, 1, 1, -1}, {-1, 2, -2, 3, 1} }; static const int8_t w_fc[N_CLASS][C_OUT] = { {1, -1, 2, 1, -1, 2, -1, 1}, {-1, 2, -1, 1, 2, -1, 1, -1}, {2, 1, -1, -1, 1, 2, 1, -1}, {-1, -1, 1, 2, -1, 1, -2, 2} }; static const float s_conv = 0.01f; /* 卷积层 scale(示意)*/ static const float s_fc = 0.02f; /* 全连接层 scale(示意)*/ /* 前向:输入 128 点 INT8 电流窗 → 4 类打分 */ void infer(const int8_t *x, float *score) { int32_t conv_out[128 - K_SIZE + 1][C_OUT]; int i, c, k, n; /* 1D 卷积(valid):INT32 累加,最后乘 scale 反量化 */ for (n = 0; n < IN_LEN - K_SIZE + 1; n++) { for (c = 0; c < C_OUT; c++) { int32_t acc = 0; for (k = 0; k < K_SIZE; k++) acc += (int32_t)w_conv[c][k] * (int32_t)x[n + k]; conv_out[n][c] = acc; } } /* 全局平均池化 → ReLU → 全连接打分 */ float feat[C_OUT]; for (c = 0; c < C_OUT; c++) { int64_t sum = 0; for (n = 0; n < IN_LEN - K_SIZE + 1; n++) sum += conv_out[n][c]; float v = (float)sum / (IN_LEN - K_SIZE + 1) * s_conv; feat[c] = v > 0 ? v : 0; /* ReLU */ } for (i = 0; i < N_CLASS; i++) { int32_t acc = 0; for (c = 0; c < C_OUT; c++) acc += (int32_t)w_fc[i][c] * (int32_t)feat[c]; score[i] = acc * s_fc; /* 未归一化打分,取最大为类别 */ } } int main(void) { static int8_t x[IN_LEN]; float score[N_CLASS]; int i; /* 示意输入:一个直流偏置 + 小幅振荡的"电流窗" */ for (i = 0; i < IN_LEN; i++) x[i] = (int8_t)(30 + 10 * ((i * 7) % 13) / 13); infer(x, score); int best = 0; for (i = 1; i < N_CLASS; i++) if (score[i] > score[best]) best = i; printf("类别打分: %+.3f %+.3f %+.3f %+.3f\n", score[0], score[1], score[2], score[3]); printf("判定: 类别 %d(0=正常 1=齿面磨损 2=润滑不足 3=匝间短路)\n", best); return 0; } /* 编译: gcc edge_ai.c -o edge_ai && ./edge_ai 权重/scale 为示意值——真实部署由训练量化导出(第 8 节流程)*/

这段代码就是"模型进 MCU"的最小闭环:训练出的权重变成 C 数组,前向计算就是纯整数乘加——没有浮点卷积、没有运行时依赖,Cortex-M 上几个微秒到几毫秒跑完。

12. 交互演示:部署流水线 + 量化收益对比

左边推进部署五步,右边看同一个模型 FP32 vs INT8 的体积与推理延迟差距——这就是"能不能上 MCU"的决策依据(示意数据):

端侧部署决策台(示意参数)
部署流水线
量化收益(10 万参数模型)
  • ① 训练 → ② PTQ 量化 → ③ 转换 TFLite Micro/CMSIS-NN → ④ 板端部署 → ⑤ 回归验证——逐步推进看每步产物。
  • 右侧柱状:FP32 模型 400KB / INT8 100KB,Cortex-M4 推理 8ms / 2ms——量化是"进不进得了 MCU"的分水岭(第 4 节)。

13. 常见坑与工程建议

坑现象对策
PTQ 掉点超预期量化后精度崩 5%+换 QAT 量化感知训练;或先查权重范围/激活离群点
算子不支持转换报 "unsupported op"查目标运行时算子表;换结构(如用 GAP 代替 flatten)或手写算子
内存峰值超 SRAM板端跑飞/复位看激活内存峰值;减小 batch/输入窗;分层推理
把 AI 塞进电流环FOC 抖动、不稳定AI 只做感知/辨识/告警,控制律保持确定性(第 5 节)
只看精度不看延迟模型太大跑不完一开始就定延迟/内存预算,按预算反推模型规模
AI 输出没有置信度误判直接执行输出 softmax 概率,低置信度走"人工/保守路径"
固件空间不足模型塞不进 FlashINT8 + 剪枝/蒸馏,或模型存外部 Flash 按需加载
端侧 AI 的正确打开方式

先问三个问题:① 任务真的需要 AI 吗(规则/查表能不能凑合)?② 输出进不进实时环(进环就危险)?③ 模型最小能做到多少(先定预算再训模型)?——三个都答对,端侧 AI 才不是噱头,而是把"故障提前发现、抓取更快、触觉更准"变成真价值。

一句话收尾:端侧 AI = 小模型 + INT8 量化 + 确定性控制不动。模型几 KB 到几百 KB,推理毫秒级,做感知、辨识、告警——把这三件事做好,比硬塞一个大模型进关节有意义得多。