
τff 在 MIT 模式中只是一个控制输入端口,驱动器不关心往里填了什么。它收到一个数值,就把它作为力矩前馈加到 PD 输出上,在工程实现上,τff的内容是一个函数:

针对低速清洁任务:
tau_ff = (
gravity_compensation(q_actual) # 只依赖角度
+ friction_compensation(dq_actual) # 只依赖速度
+ inertia_compensation(q_actual, ddq_des) # 只依赖加速度(可选)
)
send_mit_command(q_des, dq_des, tau_ff)分量 | 形式 | 依赖 | 何时显著 | 整定方式 |
|---|---|---|---|---|
重力项 | τg(q) | 关节角度 | 始终存在(J3、J5、J6) | 多姿态悬浮标定 |
摩擦项 | τf(q˙) | 关节速度 | 有速度时存在,低速时主导 | 匀速运动实验辨识 |
惯性项 | τi(q,q¨) | 关节角加速度 | 仅加速/减速瞬间显著 | CAD模型或动态辨识 |
前面介绍了通过实验获得了这两项:
使用方式:
def gravity_compensation(q):
# 使用查表+线性插值,或多项式拟合
return interp(q, q_table, tau_g_table) # 或 polyval(g_coeffs, q)
def friction_compensation(dq):
# 平滑sign函数避免零速跳变
return fc * tanh(dq / eps) + fv * dq当关节加速时,连杆的惯量会产生一个抵抗加速的力矩:

其中 Jeff(q)是关节的有效转动惯量,随关节角度变化(因为质心到关节轴的距离变化)。
工况 | 惯性项重要性 | 是否需要补偿 |
|---|---|---|
低速清洁(加速度 < 0.1 rad/s²) | 可忽略 | 不需要 |
中速运动(加速度 1~10 rad/s²) | 开始显现 | 可选 |
快速启停(加速度 > 10 rad/s²) | 显著 | 建议补偿 |
对于清洁场景,运动速度低、加速度小,惯性项可以暂时不补偿,PD控制器本身的 Kp就能产生足够的加速力矩。
有三种方法,按推荐度排序:
如果模型可用,直接从CAD读取连杆质量 m、质心位置、惯性张量,通过正运动学计算任意姿态下的有效惯量 Jeff(q),然后用以下公式:

其中 q¨从上位机的轨迹规划器获得(不是从编码器差分,因为差分噪声大)。
原理:在已知加速度下测力矩,反解有效惯量。
步骤:

,减去已知的重力和摩擦补偿,剩下的部分就是 τ_inertia。


优点:完全实测,不需要CAD。
缺点:加速度信号如果来自编码器差分,噪声大,需要良好滤波。在慢速清洁场景中,惯性项小,辨识精度有限。
对于纯旋转关节,如果把连杆简化为一个集中质量 m 位于质心距离 d 处:

可以从重力补偿标定中反向估算出 m⋅d(因为 τg=mgdcos(q)),进而得到:

这种方法精度不高,但对于判断惯性项是否可以忽略非常有用。