跳到正文
孔乙己

返回成果

机器人动力学建模与参数辨识

从符号化动力学建模,到激励轨迹设计、闭环数据采集、基参数辨识,再到完整惯性参数恢复

−93.0%RRR 独立验证力矩 RMSE,0.4964 → 0.0350 N·m
−86.8%Franka 独立验证力矩 RMSE,0.4354 → 0.0576 N·m
满秩RRR 22/22、Franka 62/62 基参数线性无关
29×Franka 回归矩阵求值,56.4 s → 1.9 s
我的角色独立完成(建模 / 辨识 / 实验 / 文档)
时间2026.09 起,持续维护
状态已开源
技术栈Python · MuJoCo · SymPy · SciPy · NumPy

机械臂的动力学模型里,连杆质量、质心、惯性张量这些参数在图纸和实际装配之间总有偏差。 如果直接拿 CAD 或名义参数去做前馈控制和力控,力矩误差会明显吃掉精度。

这个项目做的是参数辨识:设计一组能充分激励系统动力学的轨迹,采集运动与力矩数据, 从测量里反推出真实参数,并用独立轨迹验证辨识结果——而不是用拟合时见过的数据自我验证。

我不想把它写成一次性脚本,所以按可复用库来组织:模型定义、符号推导、激励设计、数据预处理、 辨识算法、仿真接入彼此独立,换一台机器人只需要加一份模型定义和配置。

两个机器人都走同一条闭环流程:在 MuJoCo 里执行激励轨迹、采集带噪声的数据、辨识基参数, 再用另一条从未参与拟合的轨迹验证。

指标 RRR(3 轴) Franka Panda(7 轴)
基参数秩 22 / 22 62 / 62
训练力矩 RMSE 0.0143 N·m 0.0163 N·m(相对 0.13%)
验证 RMSE(名义模型) 0.4964 N·m 0.4354 N·m
验证 RMSE(辨识模型) 0.0350 N·m 0.0576 N·m
相对下降 93.0% 86.8%
基参数相对真值投影误差 5.19% 2.98%

也就是说,在校验轨迹上辨识模型的力矩预测误差比名义模型低了一个数量级以上。

基参数只是一组线性组合,物理意义不直观。项目额外做了完整惯性参数恢复: 在基参数拟合的约束下,反解出每个连杆的质量、质心和质心惯性张量, 并检查收敛性、物理可行性(惯量正定、满足三角不等式)和基参数一致性。

Franka 连杆质心:名义模型 / 对象真值 / 恢复结果

质心用各连杆坐标系表示。恢复结果整体通过检查,但逐连杆参数仍不能被唯一确定。

Franka 的连杆质量对照(单位 kg):

连杆 名义模型 对象真值 恢复结果
1 4.971 5.381 4.970
2 0.647 0.688 0.653
3 3.229 3.019 3.518
4 3.588 3.249 3.117
5 1.226 1.197 1.228
6 1.667 1.729 1.712
7 0.736 0.708 0.737

约束用的是名义参数软先验和质量/质心/惯量的几何包络,没有按扰动真值或验证误差调过参数。 恢复模型在验证集上的整体 RMSE 为 RRR 0.0321 N·m、Franka 0.0655 N·m,用少量预测精度换取了更合理的参数量级。 恢复后的总质量 Franka 为 15.937 kg(名义 16.062 kg),所有连杆的质量和质心均未贴到约束边界。

机器人定义 → 运动学/动力学模型 → 基参数回归矩阵
↓
激励轨迹生成、优化、筛选
↓
MuJoCo 跟踪执行 → 测量数据
↓
对齐、滤波、周期平均、辨识
↓
可选:恢复物理可行的完整惯性参数
↓
独立轨迹验证 → 保存报告
  1. 符号建模:用 DH / MDH / PoE 三种约定统一建模,符号推导出逆动力学和回归矩阵, 再最小化为基参数集。同一份模型可以导出成 Python、C 和 LaTeX。
  2. 激励轨迹设计:以有限傅里叶级数为参数化形式,先随机搜索一批候选, 可选地用 SLSQP 做约束优化,目标是最小化回归矩阵的条件数。
  3. 轨迹筛选:不只看条件数,还要闭环试跑,检查跟踪精度、加速度是否超限、饱和和样本保留率。 RRR 的 10 条候选里 2 条因为实际加速度超限被淘汰——解析预览好看但执行不了的情况是真实存在的。
  4. 数据预处理:补偿已知的整数拍延迟、零相位低通滤波、裁掉首尾边缘, 再剔除低速段(|dq| 过小时力矩信噪比差)。Franka 的 5000 点里保留了 2255 点。
  5. 辨识与验证:最小二乘求解基参数,用独立轨迹评分,把完整报告落盘。

候选轨迹的实测条件数分布,条件数越小说明参数越“可分”:

Franka 候选激励轨迹筛选

选中的轨迹(虚线为关节限位与速度、加速度设计上限):

Franka 选中激励轨迹的一个周期

下图是独立验证轨迹上的逐轴力矩误差。灰底是低速剔除区间,白底是参与评分的样本:

Franka 验证轨迹逐轴力矩预测误差

RRR 验证轨迹逐轴力矩预测误差

Franka 基参数辨识值与对象真值对照

  • 符号求值太慢,就生成代码。Franka 的回归矩阵用符号表达式直接求值要 56.4 s, 改成生成数值代码后降到 1.9 s(约 29 倍),2255 个训练样本、62 个辨识参数逐项一致—— 优化前后结果必须完全对齐,否则不是优化而是换了算法。
  • 层间单向依赖。data/ 和 identification/ 不反向依赖仿真器、CLI 和测试, 仿真只是数据源的一种实现。这样将来接实机时可以沿用 MotionData 和辨识接口,只换采集与控制器。
  • 报告即产物。每次实验输出独立的 outputs/<机器人>/<实验名>/, 保存配置、测量数据、筛选结果和恢复报告;展示图表由脚本从同一份实验数据成套生成, 重建后的保留样本要与实际辨识数据逐点一致。
  • 测试按维度组织。建模、激励、辨识、恢复、仿真各有一组 pytest,常规用例与慢速符号导出分开。

  • 实验在 MuJoCo 闭环中完成,控制增益、摩擦和传感器误差都是仿真假设,未经实机标定。 项目目前没有提供真实设备驱动。
  • 基参数是个线性组合,逐连杆的质量、质心和惯量通常不唯一。 报告里给出的是一组满足约束的可行解,受先验影响;力矩拟合好不等价于每个连杆参数都准确。
  • 验证轨迹上出现过实际加速度超过配置上限的情况(RRR 关节 3 达到 7.98 rad/s²,上限 6 rad/s²), 该轨迹只用于验证,超限记录保留在报告中。

完整的推导、参数表、复现命令和逐项验收记录见仓库文档: https://github.com/JiangShangJiu/robot_model

这个项目在博客里有配套的长文推导,建议按顺序读: 机械臂运动学 → 机械臂动力学 → 机械臂标定; 想了解激励与状态估计可以从状态估计开始。