ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

机械臂动力学参数辨识全流程:从仿真到实测的工程指南

机械臂动力学参数辨识全流程:从仿真到实测的工程指南 做机械臂控制这些年有一个问题几乎绕不开仿真里跑得挺好的控制器一上真机就变了个样。尤其是力矩前馈、阻抗控制这类依赖模型的算法模型不准一切白搭。而模型从哪来要么拿三维模型硬算要么拿经验公式凑这两种方式在真实工况下误差都不小。真正靠谱的做法就是做动力学参数辨识——通过设计合适的激励轨迹、采集关节力矩和运动数据把质量、质心、惯量这些参数“算”出来。这篇文章就从仿真层面把整条链路捋一遍内容包括参数模型怎么建、激励轨迹怎么设计、仿真环境怎么搭、辨识算法怎么做、结果怎么验证以及在实测中你可能遇到的坑。适合正在上手动力学控制、想做前馈补偿或者自适应控制的工程师。1. 为什么必须做参数辨识控制精度的最后一公里先说一个常被忽略的事实机械臂动力学模型里最不确定的部分从来不是运动学而是惯性参数和摩擦参数。运动学参数可以靠DH表标定到很高的精度但动力学参数——每个连杆的质量、质心位置、惯量张量、关节摩擦系数——这些数值即使从CAD模型里导出来也往往和实际情况差着一大截。原因很简单CAD模型没算线缆、接头、传感器、末端工具的质量分布更没算减速器、电机转子的等效惯量和非线性摩擦。1.1 模型不准带来的连锁反应动力学模型精度不足最直接的影响体现在三处前馈力矩不准确计算力矩控制要求前馈项精确抵消重力、惯性力、科氏力和摩擦力模型误差会直接变成跟踪误差尤其在高加速段和高负载段尤其明显。阻抗/导纳控制力感变差这类控制要把机械臂对外表现出期望的质量-阻尼-刚度特性底层模型不准表现出来的“手感”就会发飘外力撤掉以后回中性不好。自适应和在线估计不稳定很多自适应算法一开始就依赖一个基本准确的名义模型。名义模型偏差过大的话参数更新律会在大幅波动中震荡甚至发散。1.2 参数辨识的本质把问题变成线性回归之所以参数辨识能行得通靠的是机械臂动力学方程的一个漂亮性质动力学方程中的惯性参数是线性出现的。也就是说整个模型可以写成τ Y(q, q̇, q̈) · π其中τ是关节力矩向量q、q̇、q̈是关节位置、速度、加速度Y是一个只与运动状态有关的矩阵叫回归矩阵或观测矩阵π是所有待辨识参数组成的向量。这个形式最大的好处在于只要采集到足够多组(q, q̇, q̈)以及对应的τ数据就把参数辨识转化成了一个线性最小二乘问题。不需要迭代求解非线性优化不需要复杂的数值计算一个简单的矩阵运算就能得到参数估计值。这也是为什么动力学参数辨识在工程中这么普及——它原理清晰、实现简单、效果直接。1.3 完整辨识流程概览整个流程环环相扣少了任何一步都可能导致结果不可用建立机械臂动力学模型推导出最小参数集设计激励轨迹让机械臂充分激励所有动力学参数在仿真或真机中采集中记录关节位置、速度、加速度和力矩对采集数据进行滤波和重采样保证时间对齐构造回归矩阵和力矩向量执行最小二乘估计对结果做验证评估预测精度这篇文章的侧重点是前五步在仿真环境中的实现方法和工程细节。2. 辨识对象的拆解参数模型和最小参数集拿到一台机械臂先别急着写代码。第一步应该是把动力学参数的定义捋清楚。否则你连要辨识什么都不知道后面全是白忙。2.1 完整惯性参数和摩擦参数每个运动连杆在理论上需要辨识的参数包括参数类型含义数量质量 m连杆总质量1一阶质量矩 mx, my, mz质量与质心坐标的乘积3惯量张量 Ixx, Iyy, Izz, Ixy, Ixz, Iyz相对连杆坐标系的转动惯量6库仑摩擦 fc与速度方向相关的恒定摩擦力矩仅旋转关节1粘滞摩擦 fv与速度成正比的摩擦力矩仅旋转关节1这里注意一个细节质心位置本身不需要单独辨识辨识的是“质量×质心位置”这个合成量。因为在动力学方程中重力项和惯性项里出现的形式就是m·cx、m·cy、m·cz。强行去辨识单独的m和c反而会造成参数耦合降低辨识精度。这也是为什么很多教材和开源代码里参数向量里从来不出现单独的cx、cy、cz。2.2 最小参数集避免参数不可辨识理论上每个连杆有10个惯性参数但实际辨识中你会发现并不是每个参数都能被独立辨识出来。原因有两个运动学冗余某些参数在运动方程中总是以固定的线性组合出现单独估计会退化为奇异问题。关节不可达有些关节的运动范围受限或者某些方向的加速度激励不足导致对应参数在数据中没有信息量。解决办法是推导最小参数集。最经典的方法是先写出完整的回归矩阵然后通过QR分解或符号消元找出线性相关的列合并这些列对应的参数。这一步做完以后6轴机械臂的参数数量通常从60个降到30个左右具体取决于关节类型和轴数配置剩下这组参数才是真正可辨识的。我在仿真里做这件事的时候最常用的做法是用符号工具比如MATLAB的Symbolic Toolbox或者SymPy先把动力学方程展开得到所有项的符号表达式再用数值方法做一次“符号验证”——具体做法是在几个随机运动状态点上计算回归矩阵检查各列之间的线性相关性逐步合并。这个过程听起来复杂实际操作起来只要把流程写成脚本复用性很强。2.3 摩擦模型的选择摩擦是最容易被低估的一项。很多辨识文章只提库仑粘滞模型即τ_friction fc·sign(q̇) fv·q̇。这个模型简单好用但不完善。实测数据里你会发现在速度过零附近摩擦力矩的变化并不是阶跃跳变而是有一定的过渡过程有些关节在低速时摩擦力矩还呈现出类似“Stribeck效应”的负斜率。如果辨识目标是低速高精度控制建议至少考虑两项改进使用对称或非对称的库仑摩擦参数正反转分开辨识增加一项与加速度或位置相关的纹波转矩cogging torque补偿不过在仿真阶段的辨识中如果目标只是验证算法流程库仑粘滞模型通常已经够用。原因是仿真里设置的摩擦模型往往是理想化的加入复杂摩擦模型反而可能让对比实验失去意义。2.4 仿真验证模型一致性的方法在建好参数模型和动力学方程之后有一步别省先做一次“正动力学 vs 逆动力学”的交叉验证。意思是在仿真中给定一条轨迹用逆动力学算出期望力矩把它喂给正动力学模块看能不能还原出同样的轨迹。这能帮你确认模型推导没有bug也顺带验证了参数向量的组织方式没有错误。这一步在实际项目中救了我很多次。有些时候你以为是辨识算法出了问题折腾半天发现是动力学模型里某个符号写反了或者惯性张量坐标变换的矩阵转置漏掉了。3. 激励轨迹设计数据信息量的决定性因素很多人在参数辨识上栽跟头都不是栽在最小二乘上而是栽在激励轨迹上。采集了一大堆数据算法跑得飞快结果出来的参数要么数值大得离谱要么方差大到没法用。归根结底都是因为轨迹没有“激励”起足够的动力学信息。3.1 为什么轨迹设计如此关键回到τ Y(q, q̇, q̈)π这个问题。最小二乘解的数值质量取决于回归矩阵Y的条件数。如果条件数很大说明Y的某些列之间近似线性相关参数估计值就会对噪声极其敏感这个问题在数学上叫“病态问题”。打个比方你想称一个人体重但每次站上秤的时候他手里都拿着一个不确定重量的包裹那你得到的测量值就会受包裹影响很大。激励轨迹设计的本质就是让每个参数都有充分的“出场机会”降低这种相互干扰。3.2 最常用的激励轨迹有限傅里叶级数实践中使用最普遍、效果也最稳定的激励轨迹是有限傅里叶级数Fourier Series轨迹。每个关节的位置指令定义为q_i(t) q_i0 Σ[a_ik·sin(k·ω·t) b_ik·cos(k·ω·t)]其中ω是基频对应轨迹周期T2π/ωk是谐波次数a_ik、b_ik是待优化的傅里叶系数。这种轨迹的好处很多速度和加速度可以解析求导不需要数值微分周期重复方便做多次周期的数据叠加平均带宽可控激励频率集中在需要的范围内有利于避开机械结构共振点轨迹平滑没有冲击3.3 设计参数如何定以常见的6轴机械臂仿真为例我一般这样设置基频取0.1~0.2 Hz对应轨迹周期5~10秒谐波次数取5~10阶位置偏移量q_i0根据关节中位设置确保轨迹不超出关节限位幅值取关节限位的30%~70%兼顾安全性和激励强度速度和加速度约束根据电机额定参数和减速比折算3.4 系数优化让条件数说话傅里叶系数的选取不能拍脑袋常见做法是以优化条件数为目标函数做迭代搜索。约束条件包括关节位置限位、速度限位、加速度限位。优化方法用随机搜索或者遗传算法都能收敛因为条件数这个目标函数虽然非凸但变量维度不高每个关节十几到几十个系数全局搜索完全可行。我在仿真里通常的做法是先用随机初始化一组系数然后计算整条轨迹上的观测矩阵Y求它的条件数。如果条件数大于100~1000就重新随机或者用简单的启发式调整。优化结束后还要检查一下轨迹是否真的满足各项运动学约束。3.5 一个反直觉的发现做仿真辨识时你会发现一个问题轨迹越“漂亮”、越平滑、看着越舒服有时候辨识出来的参数反而不准。原因在于光滑的轨迹往往意味着加速度变化不大频率成分单一很多依赖加速度和科氏力的参数没有被充分激励。反而是那些看着“乱糟糟”的轨迹辨识效果更好。所以做参数辨识时不要太在意轨迹好不好看。真正该关注的是回归矩阵的条件数、参数的方差估计、预测误差这些数字指标。4. 仿真平台怎么选从纯数值仿真到多体联合仿真仿真在参数辨识流程里的作用有两个一个是纯算法验证确认辨识流程本身没有bug另一个是更接近真实的虚拟实验评估辨识算法对噪声和模型误差的敏感性。不同的目的对应不同的平台选择。4.1 方案一纯数值仿真最简方案最直接的方式是在MATLAB/Octave或Python中实现逆动力学模型自己生成激励轨迹计算关节力矩然后直接做辨识。整个过程不涉及Simulink甚至不涉及任何商用软件。这种方案的优点完全可控每一步都能检查速度快几百行代码就能跑通完整流程没有任何平台依赖方便回溯缺点也很明显模型太干净——没有传感器噪声、没有执行器延迟、没有测量误差。如果你的目标是验证“在接近真实工况下辨识算法的鲁棒性”纯数值仿真是不够的。4.2 方案二Simulink逆动力学模块在Simulink里搭逆动力学模块通过信号线配置输入位置、速度和加速度输出力矩。这个方案的优点是可视化程度高可以用Scope看信号也可以方便地加入噪声源、量化模块等到回路中。具体做法是把辨识得到的参数向量打包成一个MATLAB Function块内部调用逆动力学函数激励轨迹用Signal Builder或者From Workspace输入力矩输出端加上高斯白噪声来模拟传感器噪声。数据记录用Scope或者To Workspace模块最后统一在工作空间里处理。4.3 方案三ADAMS/Simulink联合仿真如果非要追求“更像真机”可以借助ADAMS等动力学多体软件建立机械臂样机导出动力学参数然后与Simulink做联合仿真。ADAMS负责正动力学解算Simulink负责控制算法。这种方式能模拟出更加真实的关节耦合、约束和接触效应但建模成本高调试周期长适合硬件在环HIL前的最后验证。4.4 仿真中必须加入的数据噪声有一点要特别提醒无论你选哪个平台如果在仿真里不加任何噪声辨识出来的参数精度会好得离谱——好到让你误以为现场也会这么顺利。实测中力矩传感器、编码器都会有噪声特别是力矩信号信噪比往往比你想象的低得多。所以在仿真的数据采集环节建议刻意加入以下噪声信号类型噪声类型幅值建议关节位置高斯白噪声0.001°~0.01°关节力矩高斯白噪声额定力矩的1%~5%速度信号由位置差分后产生不做额外添加但要注意差分放大效应加入噪声以后你才能看到辨识结果方差的变化这才是真实工况下你会面临的情况。4.5 数据采集频率和时长设定采样的时间尺度和频率要匹配激励轨迹的带宽。我通常这样设定采样频率 500 Hz~1 kHz保证每个谐波周期内有足够多的采样点采集周期数 5~10 个周期用于平均和剔除瞬态同步采集所有关节的位置、速度和力矩如果你用的是仿真平台没有硬件延迟问题时间对齐很自然就满足。但如果将来切换到真机就需要注意采集板卡的I/O延迟和滤波器的相移问题最好的办法是做离线数据重对齐。5. 辨识算法的工程实现从数据到参数数据采集完毕接下来就是辨识核心——参数估计。这一节直接给出工程上可以照搬的实现思路和代码逻辑。5.1 最小二乘估计及其改进最基础的最小二乘公式是π_hat (YᵀY)⁻¹Yᵀτ但直接这么算在工程上并不推荐原因有二一是矩阵求逆数值稳定性差二是没有考虑噪声协方差。更稳妥的做法是使用QR分解或SVD求解MATLAB里直接用反斜杠运算符A\b内部就会选择合适的方法。5.2 加权和正则化的作用数据里各个关节的力矩幅值差异可能很大比如末端关节可能只有几牛米基座关节可能有几百牛米。如果不做加权大数值关节会在目标函数里占主导地位削弱小数值关节参数的辨识精度。解决办法是使用加权最小二乘Weighted LS权重通常取各关节力矩方差的倒数。另一个工程上十分有效的改进是正则化。岭回归Tikhonov正则化在参数辨识里非常常用π_hat (YᵀY λI)⁻¹Yᵀτλ的选取要平衡偏差和方差。λ太小病态问题依旧λ太大参数会有明显偏差。我常用的做法是画L-curveL曲线取拐角处的λ值。这个方法在仿真里实现非常简单但效果出奇的好。5.3 物理可行性约束最小二乘解出来的参数不一定物理意义正确。比如质量可能是负的惯量张量不满足正定条件。这在数据有噪声、激励不充分的时候经常发生。处理办法有几种思路纯参数投影辨识完成后检查物理约束如果不满足就把参数投影到最近的可行域里。实现简单但结果未必最优。线性约束最小二乘把质量为正、惯量矩阵正定这些约束直接加进优化问题用二次规划求解比如MATLAB的lsqlin。参数重组利用最小参数集的物理意义选择更稳定的参数化方式从源头上减少不合理的解。5.4 一个可直接套用的MATLAB辨识代码框架下面给出一段简化但完整的辨识核心代码思路适用于已经采集好位置q、速度qd、加速度qdd、力矩tau的数组场景function [pi_hat, Sigma_pi] identify_params(q, qd, qdd, tau, dt, regressor_fn) % q, qd, qdd, tau: N x n_joints 的矩阵N为采样点数 % regressor_fn: 函数句柄输入(q, qd, qdd)输出回归矩阵Y (n_joints x n_params) [N, nj] size(tau); n_params length(feval(regressor_fn, q(1,:), qd(1,:), qdd(1,:))); Y_all zeros(N * nj, n_params); tau_all zeros(N * nj, 1); for i 1:N Y_i feval(regressor_fn, q(i,:), qd(i,:), qdd(i,:)); Y_all((i-1)*nj1 : i*nj, :) Y_i; tau_all((i-1)*nj1 : i*nj, :) tau(i,:); end % 正则化最小二乘岭回归 lambda 1e-6 * max(eig(Y_all * Y_all)); % 简化取法实际用L曲线 pi_hat (Y_all * Y_all lambda * eye(n_params)) \ (Y_all * tau_all); % 参数协方差估计用于评估置信度 sigma2 norm(Y_all * pi_hat - tau_all)^2 / (N*nj - n_params); Sigma_pi sigma2 * inv(Y_all * Y_all lambda * eye(n_params)); end真实项目中regressor_fn这个函数需要根据你推导的动力学模型来编写。如果你的项目用不到完整代码单从这个框架也能看出辨识流程的核心操作把所有采样点的回归矩阵叠起来组成一个大的超定方程组然后一次求解。5.5 验证策略不能只比对拟合曲线辨识完参数很多人最后一个动作就是把预测力矩和实测力矩画在一张图上看一眼吻合度。这个做法有必要但远远不够。严谨的验证至少应该包含训练数据拟合度用训练数据计算预测力矩看均方根误差RMSE和最大误差测试数据泛化能力用一条完全独立的轨迹不同周期、不同幅值、不同速度分布做预测评估模型的泛化能力。这一步才是检验辨识结果是否过拟合的关键力矩分量分解把预测力矩分解成重力项、惯性项、科氏项和摩擦项看看哪一项误差最大帮助定位模型中哪个部分最不准确轨迹跟踪仿真验证把辨识参数代入正动力学模型在Simulink中做闭环轨迹跟踪观察跟踪误差有没有明显改善5.6 参数估计的不确定性检验最小二乘除了给出参数点估计值还能给出参数的方差-协方差矩阵。我建议每次辨识完都打印出每个参数的标准差。如果某个参数的估计值居然比标准差还小那基本说明这个参数没有被充分激励——即使总体预测误差很小也不能相信这个参数的数值。这个检验特别适合用来倒推激励轨迹设计的缺陷比如发现第5关节的参数方差特别大八成是这个关节的运动范围或加速度激励不足赶紧回去改轨迹。6. 仿真到实测必须提前知道的几个现实落差仿真里把流程跑通以后真正头疼的事才开始。这里聊几个我实测踩过很多次、几乎每个项目都会遇到的坑提前说出来能帮你省掉大量调试时间。6.1 速度和加速度的来源决定一切在仿真中速度和加速度可以直接给定或通过模型算出来干净得不行。但到了真机上编码器只能给你位置信号。速度靠差分得到加速度靠二次差分得到而差分会让高频噪声迅速放大。这个问题要在设计辨识策略时就提前考虑方案一是用激励轨迹的解析导数既然位置指令是傅里叶级数那速度和加速度本来就有解析表达式完全可以直接用指令值作为输入。但前提是机械臂真的完美跟踪了位置指令。现实中跟踪误差存在特别是动态跟踪误差在高加速段可能达到数度不能忽略。方案二是用离线平滑滤波先对位置信号做低通滤波再做中心差分。但这会引入相位延迟需要对数据做双向滤波filtfilt补偿。方案三是直接加装/利用已有的速度观测器或者状态估计器比如卡尔曼滤波。我做仿真辨识的时候习惯把速度、加速度的获取方式模拟成真机的差分滤波方案这样辨识算法在迁移到真机时就不用改动太多。6.2 力矩源可能是控制信号而不是传感器有些机械臂没有关节力矩传感器只能用驱动器输出的电流或控制指令估算力矩。这两种力矩数据的质量差异很大。力矩传感器数据如果有的话通常还要考虑重力造成的零漂以及温度变化引起的零点漂移。而电流估算法则要求先做驱动器标定把电流和实际输出力矩的关系校出来这里还牵涉到摩擦变化的干扰。所以在仿真阶段就要明确你模拟的是哪种数据来源如果用传感器方案就要加对应的零漂和温漂如果用电流估算方案就要加比例误差和偏置误差。提前模拟好真机上才能从容应对。6.3 参数辨识结果对控制系统稳定性的影响辨识出参数以后不要急着把新参数全量投入控制器。一个常见的风险是新参数在某几个关节上虽然预测力矩更准了但由于参数之间存在耦合替换后反而让控制器的某些增益设计失去了鲁棒性。我的习惯是辨识参数先在仿真环境里替换原来的名义模型做一轮完整的前馈控制仿真对比。如果性能有提升再做小范围真机验证如果没有明显提升甚至更差老老实实回去查激励轨迹和参数估计的置信度别硬上。6.4 摩擦变化的恼人问题辨识得到的摩擦参数包括库仑摩擦和粘滞摩擦在仿真里看起来非常稳定但在真机上会随着温度、润滑状态、线缆拉伸程度而缓慢变化。尤其是开机初期和长时间运行后摩擦参数可能相差20%~30%。所以做控制的时候摩擦项建议单独做在线补偿或者在参数辨识中只把摩擦作为停止参数块参数用一段快速激励来实时更新而不是指望一次性辨识一劳永逸。6.5 仿真和实测的差异仿真不能替代的验证项目最后必须强调一点仿真能帮你验证算法逻辑、评估噪声影响但它替代不了以下几个实测验证项目关节反向间隙和弹性变形的辨识这需要专门的位移激励实验减速器温度变化导致摩擦模型漂移的长期实验不同负载条件下参数的可重复性测试这些问题在仿真里完全不存在因为它们本来就是“非理想机械系统”的产物。但当你把辨识参数用到真机上遇到莫名其妙的误差时优先想想是不是这些“非理想因素”在作怪。整个过程走下来回归到实际体验仿真真正有价值的不是“把流程跑通”而是逼着你把每一步的原理、假设、坑都提前踩一遍——激励轨迹的条件数到底该怎么看、数据滤波参数对辨识结果有多敏感、加多大噪声参数会开始发散。这些手感不通过仿真反复试探是建立不起来的。等你真正到了调真机那天能依仗的往往不是书本上的优雅公式而是这些在仿真里积累出来的直觉。所以如果有条件尽量在仿真阶段多做几组对照实验把参数估计的方差、轨迹设计的影响、滤波方案的选择都摸透再上真机就有底气多了。
返回列表