4. 数学模型建立:运动学模型、动力学模型、驱动与执行器模型、传感器模型
做运动控制仿真,最核心的一步就是建数学模型。说白了,就是把物理世界的运动规律,翻译成计算机能算的数学公式。我这些年踩过的坑,十有八九都出在这个环节——模型建得不对,后面仿真跑得再花哨也是白搭。
核心观点:数学模型是仿真验证的“地基”。地基歪了,楼盖得再高也得塌。
4.1 运动学模型
运动学模型只关心“怎么动”,不关心“为什么动”。它描述的是位置、速度、加速度之间的关系,跟力、力矩这些无关。
我个人习惯把运动学模型分成两类:
- 正运动学:已知关节角度,求末端位姿。比如六轴机器人,给你六个关节角,算出末端在空间的位置和姿态。
- 逆运动学:已知末端位姿,求关节角度。这个更常用,但也更头疼——解不唯一,甚至可能无解。
举个例子,一个简单的二连杆机构:
// 二连杆正运动学
x = L1 * cos(q1) + L2 * cos(q1 + q2);
y = L1 * sin(q1) + L2 * sin(q1 + q2);
嗯,这里要注意:运动学模型里,时间不是直接变量。我们通过微分关系,把速度、加速度映射到关节空间和任务空间。雅可比矩阵就是干这个活的。
我的经验:做运动学建模时,先画坐标系。坐标系画对了,公式基本就写对了一半。我曾经在一个项目里坐标系画反了,结果仿真跑出来末端位置在天花板上……
4.2 动力学模型
动力学模型比运动学复杂一个量级。它要回答:给多大的力,能产生多大的加速度?
标准形式是:
M(q) * q̈ + C(q, q̇) * q̇ + G(q) = τ
其中:
- M(q):惯性矩阵,跟位姿有关
- C(q, q̇):科里奥利力和离心力项
- G(q):重力项
- τ:驱动力矩
你想想看,这个方程看着简单,但实际推导起来特别繁琐。尤其是多轴系统,M矩阵里全是耦合项。
我建议用拉格朗日法或者牛顿-欧拉法来推导。拉格朗日法适合手算,牛顿-欧拉法适合编程实现。
避坑指南:我曾经在一个六自由度机械臂项目里,直接用了简化动力学模型,忽略了科里奥利力。结果高速运动时仿真误差超过30%。后来老老实实把完整模型写进去,才把误差压到5%以内。
4.3 驱动与执行器模型
驱动模型把“控制指令”变成“实际力/力矩”。常见的驱动方式有:
| 驱动类型 | 典型模型 | 关键参数 |
|---|---|---|
| 直流电机 | 一阶惯性 + 反电动势 | 电阻、电感、转矩常数 |
| 伺服电机 | 二阶系统 + 电流环 | 带宽、阻尼比、响应时间 |
| 液压缸 | 非线性流量方程 | 阀口面积、油液弹性模量 |
| 气动执行器 | 可压缩流体模型 | 气缸容积、气体常数 |
驱动模型里最容易忽略的是“饱和”和“死区”。电机有最大扭矩,液压阀有最大开口。这些非线性特性,在仿真里必须体现。
我一般这样建模:
// 直流电机简化模型
function motorModel(u, omega)
// u: 输入电压, omega: 当前转速
tau = Kt * (u - Ke * omega) / R;
// 限幅
if tau > tau_max then tau = tau_max;
if tau < -tau_max then tau = -tau_max;
return tau;
end
小技巧:驱动模型的带宽一定要比控制系统带宽高3-5倍。否则仿真里会出现“驱动跟不上控制”的假象。我见过有人把电机模型带宽设得太低,结果PID怎么调都震荡——其实是模型的问题。
4.4 传感器模型
传感器模型负责把“真实物理量”变成“测量值”。这里的关键是:传感器永远有误差。
常见的传感器模型包括:
- 编码器:位置测量,有量化误差和零位偏移
- 陀螺仪:角速度测量,有漂移和噪声
- 加速度计:线加速度测量,有偏置和振动噪声
- 力传感器:接触力测量,有温漂和迟滞
我常用的传感器建模套路:
// 带噪声的编码器模型
function encoderModel(truePos)
// 量化误差:分辨率0.001度
quantized = round(truePos / 0.001) * 0.001;
// 零位偏移:固定偏差
offset = 0.005; // 单位:度
// 随机噪声
noise = randn() * 0.002;
return quantized + offset + noise;
end
为什么会这样?因为真实传感器就是这样工作的。你想想看,编码器输出的是脉冲数,不是连续角度。陀螺仪数据里永远有零漂。这些细节不建模,仿真结果就跟实际对不上。
重要提醒:传感器模型里,采样率和延迟必须跟实际硬件一致。我曾经在仿真里用了1kHz的传感器采样率,但实际硬件只有100Hz。结果仿真里控制效果很好,一上硬件就抖得不行。
4.5 模型集成与验证
四个模型建好之后,怎么把它们拼起来?我的做法是:
- 先独立验证:每个子模型单独测试,看输入输出是否合理
- 再开环联调:驱动→执行器→运动学→传感器,信号流走一遍
- 最后闭环验证:加上控制器,看整个系统能不能稳定
这里有个关键点:模型集成时,信号类型和单位必须统一。我见过最离谱的bug,是角度用了弧度,但控制器里当成了度——结果系统直接飞了。
总结一下:数学模型是仿真验证的基石。运动学管“几何关系”,动力学管“力与运动”,驱动管“能量转换”,传感器管“测量误差”。四个模型缺一不可,而且必须相互匹配。
下面这张图是我常用的模型结构,你可以参考:
这张图展示了信号在四个模型之间的流向。控制器发出指令,经过驱动、执行器,变成实际的力。动力学模型算出加速度,运动学模型算出位置和速度。传感器再把测量值反馈给控制器——闭环就形成了。
最后说一句:模型不是越复杂越好。够用就行。我见过有人给一个简单的直流电机加了20个参数的非线性模型,结果参数辨识都做不了。先建简单模型,跑通了再逐步加细节——这才是工程思维。