3、仿真环境搭建与校准:如何搭建一个高保真仿真环境?
说实话,很多做机器人控制的朋友,都栽在「仿真跑得飞起,实车一塌糊涂」这个坑里。我当年刚入行时也吃过这个亏——仿真里调好的轨迹,放到真机上直接抖成筛子。后来才明白,问题不在算法,在仿真环境本身不够「真」。
这一章,我们就聊聊怎么搭建一个高保真的仿真环境。重点讲三个物理参数的校准:摩擦系数、质量、惯量。这三个参数要是没调准,你的仿真就是「动画片」,不是「预演」。我个人习惯,把这套流程叫做「物理参数标定三部曲」。
3.1 高保真仿真环境的三个层次
搭建仿真环境,不是把模型丢进 Gazebo 或 MuJoCo 就完事了。我把它分成三个层次:
- 几何层:模型长什么样,碰撞体积对不对。这层相对简单,用 CAD 模型直接导入就行。
- 运动学层:关节自由度、连杆长度、传动比。这层决定了机器人的运动范围。
- 动力学层:质量、惯量、摩擦、阻尼、弹性形变。这层才是高保真的核心。
说白了,前两层决定了机器人「能不能动」,第三层决定了它「动起来像不像真的」。我们重点讲第三层。
3.2 摩擦系数的校准:最容易被忽略的「隐形杀手」
摩擦这东西,在仿真里经常被简化成一个常数。但实际中,摩擦是非线性的,而且随温度、磨损、润滑状态变化。我在项目中遇到过一台六轴机械臂,仿真里摩擦力矩设成 0.5 N·m,结果实机上测出来是 1.8 N·m——差了将近 4 倍。轨迹能调好才怪。
3.2.1 摩擦模型的选型
常用的摩擦模型有几种:
| 模型 | 表达式 | 适用场景 |
|---|---|---|
| 库仑+粘滞 | τ = τ_c * sign(ω) + b * ω | 大多数工业机器人,简单够用 |
| Stribeck 模型 | τ = τ_c + (τ_s - τ_c) * exp(-(ω/ω_s)^2) + b*ω | 低速爬行明显的场景,比如精密定位 |
| LuGre 模型 | 微分方程形式,考虑鬃毛效应 | 高频抖动、微米级精度要求 |
我个人建议,先从库仑+粘滞模型开始。为什么?参数少,好标定。如果这个模型已经能让仿真和实机的误差在 10% 以内,就别折腾更复杂的模型。你想想看,模型越复杂,标定工作量越大,而且容易过拟合。
3.2.2 摩擦参数的实测方法
这里分享一个我常用的方法,叫「恒速力矩法」:
- 让机器人每个关节单独以恒定速度运动(比如 0.1 rad/s、0.5 rad/s、1.0 rad/s...)
- 记录每个速度下的关节力矩指令值
- 画出「速度-力矩」曲线
- 拟合出库仑摩擦系数 τ_c 和粘滞系数 b
代码实现很简单,以 Python 为例:
import numpy as np
from scipy.optimize import curve_fit
# 实测数据:速度 (rad/s) 和 对应力矩 (N·m)
velocities = np.array([0.1, 0.3, 0.5, 0.8, 1.0, 1.5])
torques = np.array([1.2, 1.4, 1.6, 1.9, 2.1, 2.6])
# 库仑+粘滞模型
def friction_model(omega, tau_c, b):
return tau_c * np.sign(omega) + b * omega
# 拟合
params, _ = curve_fit(friction_model, velocities, torques)
tau_c, b = params
print(f"库仑摩擦系数: {tau_c:.3f} N·m")
print(f"粘滞摩擦系数: {b:.3f} N·m·s/rad")
3.3 质量与惯量的校准:别信 CAD 数据
很多工程师直接从 SolidWorks 或 Inventor 里导出质量和惯量参数,然后直接丢进仿真。嗯,这里要注意——CAD 数据只能作为初始值,不能作为最终值。
为什么?因为实际加工有公差,装配有间隙,线缆、气管、螺丝这些「附加物」在 CAD 里往往没算进去。我见过一个协作机器人,CAD 算出来的末端质量是 1.2 kg,实际称重是 1.45 kg——差了 20%。
3.3.1 质量标定:最简单的称重法
这个没什么技术含量,但最可靠:
- 把机器人拆成单个连杆,用电子秤称重
- 注意:要包含所有螺丝、线缆、接头
- 每个连杆称 3 次取平均
如果拆不了(比如已经组装好了),可以用「力矩辨识法」:让机器人做几个特定姿态,记录关节力矩,然后反算质量。这个方法需要一点线性代数,但精度也不错。
3.3.2 惯量标定:摆锤法 vs 激励轨迹法
惯量标定比质量麻烦一些。我常用的有两种方法:
方法一:摆锤法(适合单个连杆)
把连杆悬挂起来,让它做小角度摆动,测周期 T,然后算转动惯量:
I = m * g * d * (T / (2π))^2
其中 m 是质量,d 是悬挂点到质心的距离,g 是重力加速度。
方法二:激励轨迹法(适合整机标定)
设计一条充分激励的轨迹(包含加速、减速、匀速、换向),记录力矩和运动数据,然后用最小二乘法辨识惯量矩阵。这个方法精度高,但需要写点代码。
3.4 校准流程:从粗调到精调
我个人习惯把校准分成三步:
- 粗调:用 CAD 数据作为初始值,跑一遍仿真,对比实机数据。如果误差在 30% 以内,说明方向对了。
- 细调:用实测的摩擦、质量、惯量数据替换 CAD 值。这一步能把误差降到 10% 以内。
- 精调:设计一个「验证轨迹」,比如正弦波或梯形波,对比仿真和实机的力矩曲线。如果还有偏差,微调阻尼系数和弹性系数。
下面这张图展示了整个校准流程的逻辑:
3.5 验证与迭代:别指望一次搞定
校准不是一锤子买卖。我通常的做法是:
- 先做一组简单的验证轨迹(比如单关节正弦运动)
- 如果力矩曲线对得上,再做复杂的多关节协同轨迹
- 如果对不上,回头检查是哪个参数出了问题
举个例子,有一次我发现仿真中某个关节的力矩在换向时出现尖峰,但实机没有。排查了半天,发现是库仑摩擦模型在零速附近不连续导致的。换成 Stribeck 模型后,问题就解决了。你看,有时候不是参数不对,是模型本身不够精细。
嗯,这一章就到这里。下一章我们聊聊轨迹规划中的速度与加速度约束——你会发现,很多仿真里跑得通的轨迹,实机上跑不了,就是因为忽略了执行器的物理极限。