简介:这份PDF文献面向机器人控制、动力学建模与参数辨识方向的研究生、工程师及科研人员,聚焦SCARA机器人在精密装配、搬运等工业场景中工作精度不足的问题。内容以拉格朗日动力学方程建立机器人模型并线性化,选取有限项傅里叶级数作为激励轨迹,以观测矩阵条件数为优化指标,结合MATLAB优化工具箱求解最优轨迹系数,最终通过递推最小二乘法完成动力学参数辨识,并与实测关节力矩对比验证。资源包为1个PDF文件,大小约1.7MB,属于单篇学术论文,便于直接阅读与引用。目前已有500人学习,适合作为动力学参数辨识、机器人控制算法研究的参考文献,也可为相关课题的实验设计与MATLAB实现提供思路借鉴。
1. 从一台抖动的 SCARA 说起:为什么必须做动力学参数辨识
一台 SCARA 机器人在高速取放时末端出现肉眼可见的抖动,减速机没坏、编码器没脏、伺服增益也调过,问题却始终在。很多做机器人运动控制的朋友都遇到过这种玄学现象:运动学模型明明标定得很准,位置到了,姿态也对,可一旦速度提上去,轨迹跟踪误差就压不下来。根因往往不在控制环,而在动力学模型——连杆质量、质心位置、惯量张量、关节摩擦这些参数,出厂手册给的是标称值,装配公差、线束、末端工具一叠加,实际值和标称值能差出百分之几十。基于递推最小二乘法的 SCARA 机器人动力学参数辨识研究,讲的正是怎么用一套可复现的实验流程,把这些看不见摸不着的参数从实测数据里“反推”出来。它适合做工业机器人控制、轨迹规划、力控以及具身机器人底层开发的工程师,也适合正在做机器人学习入门、想把仿真和真机对齐的团队。读完你应该能自己搭一套辨识流程,知道激励轨迹怎么设计、递推最小二乘怎么落地、哪些坑会让辨识结果直接翻车。
2. 动力学参数辨识的数学底子:从牛顿-欧拉走到线性回归
2.1 SCARA 的动力学模型为什么能写成线性形式
SCARA 是四自由度里比较特殊的一类:前两个关节是旋转的,负责平面定位;第三个是移动关节,负责 Z 向升降;第四个是末端旋转,控制工具姿态。它的动力学方程用牛顿-欧拉递推或者拉格朗日法都能推出来,形式上是关节力矩等于惯性项、科氏力项、离心力项、重力项和摩擦项之和。关键在于,这些项里所有和连杆物理属性相关的量——质量、一阶矩、惯量张量分量——都可以被整理成一个不随时间变化的参数向量,而关节位置、速度、加速度则组成一个只和运动状态有关的观测矩阵。于是力矩就写成了观测矩阵乘以参数向量的形式,这就是所谓的“动力学参数线性化”。
这一步是整个辨识的地基。如果模型不能写成线性回归形式,最小二乘就无从谈起。SCARA 因为结构相对简单,重力只作用在移动关节上,旋转关节的重力项基本可以忽略,所以它的回归矩阵比六轴串联机器人干净得多,参数也少得多。常见做法是把每个连杆的十个惯性参数按一定规则合并,去掉那些对力矩没有独立贡献的项,最后 SCARA 通常只需要辨识十几个到二十几个参数,具体数量取决于是否把摩擦模型也纳入进来。
2.2 递推最小二乘和普通最小二乘差在哪
普通最小二乘是一次性把所有实验数据堆成一个大的观测矩阵和力矩向量,然后求伪逆。数据量小的时候没问题,但机器人辨识实验往往要跑几十秒甚至几分钟,采样率一千赫兹,数据点轻松上百万。一次性求解不仅内存吃紧,而且一旦发现某段数据质量差想剔除,就得整个重算。递推最小二乘的思路完全不同:它每来一组新数据,就在上一轮估计的基础上做一次修正,修正量由新数据带来的预测误差和增益矩阵决定。公式上就是参数估计值加上增益乘以预测残差,增益本身又通过协方差矩阵递推更新。
这个递推结构带来两个实际好处。第一,它天然适合在线辨识,控制器一边跑,参数一边更新,对资源受限机器人尤其友好。第二,通过引入遗忘因子,可以让算法慢慢“忘掉”旧数据,跟踪系统缓慢变化,比如温度漂移导致的摩擦变化。代价是递推最小二乘对初值和协方差矩阵的初始化比较敏感,初值给得太离谱,前期收敛会很难看,甚至发散。我一般会把初值设成出厂标称值,协方差矩阵设成一个较大的对角阵,比如对角线元素取十的六次方量级,让算法在前期有足够的修正空间。
2.3 激励轨迹:为什么正弦叠加是默认答案
辨识实验最怕的是数据里没有“信息”。如果机器人只是慢慢走一条直线,加速度几乎为零,惯性参数根本激励不出来,辨识结果就是一堆噪声。所以必须设计激励轨迹,让各个关节在安全范围内充分加减速,同时避免共振和超限。工业界和学术界最常用的做法是有限项傅里叶级数,也就是每个关节的位置指令写成若干正弦和余弦的叠加,基频选得低一些,通常零点一赫兹到零点五赫兹,谐波取五阶左右。这样轨迹连续可导,速度和加速度都有解析表达式,方便后续计算回归矩阵。
设计激励轨迹时有两个硬约束:一是关节位置不能超出软限位,二是速度和加速度不能超过伺服能力。常见做法是先随机生成一组傅里叶系数,然后做优化,目标函数是回归矩阵的条件数最小化,约束就是位置、速度、加速度的上下限。条件数越小,参数辨识对噪声越不敏感。这个优化可以用 MATLAB 的 fmincon 或者 Python 的 scipy.optimize 来做,不算复杂,但很关键。我见过不少团队跳过这一步,直接拿一段 Pick-and-Place 轨迹去辨识,结果参数方差大得没法用,这就是典型的血泪经验。
3. 从零搭一套递推最小二乘辨识流程:代码、参数与验证
3.1 数据采集:采样率、滤波和力矩获取
辨识的第一步是拿到干净的数据。SCARA 的关节位置通常直接从编码器读,速度要么用编码器差分,要么用伺服内部的速度观测值,加速度一般不建议直接差分,噪声太大,常见做法是用位置做二次差分后再低通滤波,或者用跟踪微分器。力矩获取分两种情况:如果关节驱动器支持力矩读数,直接读最方便;如果不支持,就得在关节处加装力矩传感器,或者用电流乘以转矩常数估算。后者精度差一些,但成本低,很多工业场景够用。
采样率建议至少一千赫兹,因为 SCARA 的关节动态响应频率通常在几十赫兹,一千赫兹能保证加速度信号不被混叠。滤波方面,位置和速度用截止频率一百赫兹左右的低通,加速度用五十赫兹左右,截止频率太高会把噪声放进来,太低会把真实的动态滤掉。下面是一段 Python 伪代码,展示从原始数据到回归矩阵的预处理流程。
import numpy as np from scipy.signal import butter, filtfilt def lowpass(data, fs, cutoff, order=4): # 巴特沃斯低通滤波,零相位 b, a = butter(order, cutoff / (fs / 2), btype='low') return filtfilt(b, a, data) def build_regressor(q, dq, ddq, params_config): # q, dq, ddq: 形状为 (N, 4) 的关节位置、速度、加速度 # params_config: 定义每个关节参与辨识的参数项 N = q.shape[0] # SCARA 回归矩阵通常按关节分块,这里示意前两旋转关节 Y = np.zeros((N, params_config['n_params'])) # 具体填充规则由动力学线性化推导决定 # 例如惯性项对应 ddq,科氏项对应 dq 的二次项 # 此处省略具体展开,实际实现需对照推导结果 return Y这段代码里,lowpass的截止频率和阶数需要根据实际噪声水平调,我一般先用一百赫兹四阶试,看残差频谱再微调。build_regressor是整个流程的核心,它的填充规则必须和你的动力学推导严格一致,错一项,后面辨识结果就全歪了。参数配置里要明确哪些参数被合并、哪些被忽略,比如 SCARA 的旋转关节重力项为零,对应的列就不该出现在回归矩阵里。
3.2 递推最小二乘的实现:遗忘因子和协方差更新
递推最小二乘的标准形式并不复杂,但工程实现里有几个细节决定成败。下面是一个可以直接套用的 Python 实现,带遗忘因子。
import numpy as np class RLS: def __init__(self, n_params, lambda_forget=0.995, delta=1e6): # lambda_forget: 遗忘因子,越接近1越“不遗忘” # delta: 协方差矩阵初始对角值,大一点让前期修正快 self.theta = np.zeros(n_params) # 参数估计 self.P = np.eye(n_params) * delta # 协方差矩阵 self.lam = lambda_forget def update(self, y, phi): # y: 当前时刻力矩标量 # phi: 当前时刻回归向量,形状 (n_params,) phi = phi.reshape(-1, 1) # 计算增益 P_phi = self.P @ phi denom = self.lam + phi.T @ P_phi K = P_phi / denom # 预测误差 y_hat = float(phi.T @ self.theta.reshape(-1, 1)) error = y - y_hat # 更新参数和协方差 self.theta = self.theta + (K.flatten() * error) self.P = (self.P - K @ phi.T @ self.P) / self.lam return self.theta.copy()lambda_forget取零点九九五到一之间比较常见,太小会让参数估计抖动,太大则跟踪能力弱。delta取十的六次方是经验值,如果初值很准,可以降到十的四次方。每次更新后可以记录参数向量的二范数变化,如果范数突然跳变,说明数据里有异常点或者回归矩阵某列量纲不对。我一般会在更新前对回归向量做归一化,避免数值条件数过大导致协方差矩阵失去正定性。
3.3 辨识结果怎么验证:残差、交叉验证和物理合理性
参数辨识出来不是终点,验证才是。最直接的方法是看力矩预测残差:把辨识出的参数代回模型,用同一段轨迹的关节位置、速度、加速度算预测力矩,和实测力矩比,残差均方根如果降到额定力矩的百分之五以内,基本可用。但要注意,同一段数据上的残差小不代表模型泛化好,必须做交叉验证:用轨迹 A 辨识,用轨迹 B 验证,如果残差仍然小,说明参数确实抓住了动态特性。
另一个验证维度是物理合理性。辨识出的质量必须为正,惯量矩阵必须正定,摩擦系数必须在合理范围内。如果出现负质量或者惯量矩阵特征值为负,说明数据激励不足或者回归矩阵有共线性,这时候要么重新设计激励轨迹,要么用带约束的最小二乘,比如把参数投影到物理可行域内。我见过有人辨识出负的连杆质量还硬着头皮用,结果力控一上线就振荡,这就是典型的翻车现场。
下面这张表列出了 SCARA 辨识中常见的参数分组和典型量级,供对照检查。
| 参数类别 | 包含项 | 典型量级 | 验证要点 |
|---|---|---|---|
| 连杆质量 | 大臂、小臂、丝杠 | 零点几到几千克 | 必须为正 |
| 一阶矩 | 质心乘以质量 | 零点零几到零点几 | 与几何尺寸一致 |
| 惯量张量 | 转动惯量分量 | 十的负三次方量级 | 惯量矩阵正定 |
| 库仑摩擦 | 各关节 | 零点几到几牛米 | 正负对称 |
| 粘滞摩擦 | 各关节 | 零点零几到零点几 | 与速度同向 |
4. 避坑与排查:辨识实验里最容易翻车的五个地方
4.1 激励轨迹条件数太大,参数方差爆炸
现象是辨识出的参数每次实验差别很大,残差看着还行,但参数本身没有重复性。原因通常是激励轨迹的回归矩阵条件数过高,某些参数方向几乎没有被激励。解决方法是重新优化傅里叶系数,把条件数压到一百以内,同时检查回归矩阵的奇异值谱,如果最小奇异值比最大奇异值小五个数量级以上,说明有参数不可辨识,需要合并或者固定。
4.2 加速度信号噪声大,导致参数估计有偏
现象是辨识出的惯量参数明显偏大,而且随滤波截止频率变化。原因是加速度通过二次差分得到,高频噪声被放大,和回归矩阵里的加速度项相乘后产生有偏估计。解决方法是改用跟踪微分器或者卡尔曼滤波估计加速度,或者把加速度项移到方程左边,用积分形式做辨识,避免直接使用加速度。
4.3 遗忘因子设得太小,参数在稳态附近抖动
现象是参数收敛后仍然在均值附近来回跳,力矩预测残差时大时小。原因是遗忘因子太小,算法不断“忘记”旧数据,对噪声过于敏感。解决方法是把遗忘因子调到零点九九以上,或者在参数收敛后切换到固定遗忘因子甚至停止更新。如果系统确实需要跟踪慢时变,可以改用可变遗忘因子,误差大时减小遗忘因子,误差小时增大。
4.4 摩擦模型选得太简单,低速段残差集中
现象是高速段力矩预测很准,低速段残差明显偏大,尤其是换向时刻。原因是只用了库仑加粘滞摩擦,没有考虑 Stribeck 效应或者预滑动。解决方法是把摩擦模型扩展为 Stribeck 模型,或者在低速段单独辨识摩擦参数。SCARA 的移动关节对摩擦尤其敏感,Z 轴低速爬行往往就是摩擦模型没建好。
4.5 数据段里混入碰撞或限位,协方差矩阵失去正定
现象是递推过程中协方差矩阵特征值出现负值,参数估计突然发散。原因是数据里混入了碰撞、限位或者急停导致的异常力矩。解决方法是在预处理阶段做异常检测,比如用马氏距离或者简单的力矩阈值把异常段剔除,同时在递推更新时监控协方差矩阵的最小特征值,一旦接近零就重置协方差或者暂停更新。
5. 进阶技巧:把辨识参数用到力控和轨迹前馈里
辨识出参数之后,最直接的用法是前馈补偿。在轨迹规划阶段,用辨识模型算出各关节所需的理论力矩,直接前馈给伺服,控制器只需要处理模型误差和扰动。我实测下来,在 SCARA 高速取放场景里,前馈补偿能把轨迹跟踪误差压到原来的三分之一左右,而且末端抖动明显减轻。实现上就是把回归矩阵和辨识参数相乘,得到前馈力矩,加到位置环的输出上。注意前馈力矩要限幅,避免模型误差大时反而引入振荡。
另一个进阶用法是在线辨识加自适应控制。把递推最小二乘嵌到控制周期里,每个控制周期更新一次参数,然后用更新后的参数算前馈。这样做的好处是能跟踪负载变化,比如末端换了夹具,参数会慢慢自适应。但要注意,在线辨识的激励来自控制指令本身,如果轨迹太平缓,参数会漂移。我一般会加一个激励监测,当回归矩阵条件数超过阈值时暂停更新,避免参数跑飞。
验证辨识参数是否真的有用,最硬的指标是看力控精度。如果你做的是力控装配或者打磨,可以把辨识模型算出的接触力估计和力传感器读数对比,残差在百分之十以内,说明参数可信。如果残差大,先别怀疑力控算法,回头查辨识数据质量和摩擦模型。
最后说个我自己的习惯:每次辨识完,我都会把参数存成一个带时间戳的 JSON 文件,同时记录当时的激励轨迹、滤波参数和残差指标。下次再辨识,先和上次的结果比,如果某个参数变化超过百分之二十,就停下来查原因,而不是直接拿去用。这个习惯帮我避免了好几次因为数据段混入异常而导致的参数漂移。希望帮到你。
本文还有配套的精品资源,点击获取