简介:串联弹性执行器(SEA)通过在电机与负载间引入弹簧元件,为机器人关节带来天然的柔顺性与冲击吸收能力,但同时也使系统从二阶升至四阶,传统PID加前馈控制难以兼顾轨迹跟踪与接触力调节。动态面控制(DSC)通过一阶低通滤波器避免了反步法中的微分爆炸问题,结合自适应参数在线估计,可有效应对负载变化与摩擦漂移等不确定性。在此基础上,引入一阶变阻抗策略,使刚度与阻尼在自由运动和接触阶段平滑过渡,避免接触力尖峰冲击。这类柔顺控制技术广泛应用于力控机械臂、装配打磨与人机协作场景。本文围绕两连杆SEA机械臂的完整建模、控制器设计、Simulink仿真与参数整定过程,重点剖析从稳定性推导中提取关键参数的方法,以及多环节耦合时的工程调试经验,为从事柔顺控制与阻抗控制的工程师提供一套可复用的实践框架。 做这个项目之前,我其实已经在刚性关节机械臂上折腾了大半年,感觉自适应、反步法这类东西也就那样。直到有一天我把一台老实验台上的谐波减速器换成串联弹性执行器(SEA),整个控制架构彻底乱套了:原来PID加前馈就能跑得好好的轨迹跟踪,加了弹簧之后直接开始抖,末端接触硬物时冲击大得吓人。后来我把动态面控制(DSC)、自适应参数估计和一阶变阻抗揉到一起,才算真正把这套两连杆SEA机械臂驯服。如果你也在做SEA关节、柔顺控制或者阻抗控制相关的内容,这篇就是把我的真实调试过程完整摊开来讲,哪些参数是拍脑袋定的、哪些必须从稳定性推导里抠出来,全都说清楚。
1. 项目背景与控制方案选型
1.1 为什么非要选择SEA作为执行方案
串联弹性执行器的核心就是在电机输出轴和负载之间串联一个弹簧元件。好处听着很美好:力可以通过弹簧变形量间接测得、关节具备天然的冲击吸收能力、力控制的带宽比刚性关节高。但代价同样明显:系统阶数变高,原来的二阶机械系统直接变成四阶系统,控制器的设计和参数整定难度不是一个量级的。
我手头的两连杆SEA机械臂,第一关节和第二关节都装有一套SEA,弹簧刚度分别是500 N·m/rad和380 N·m/rad。刚开始我天真地想,把SEA当成一个刚性关节加上力传感器来用,反正内部有电流环,做一个扭矩PI就行。结果实测下来,做轨迹跟踪的时候末端稳态误差能到3厘米以上,做恒力跟踪时力波动超过了20%。
后来我才彻底明白,SEA的弹簧刚度相对较低时,负载端和外环之间本身就是带柔性的耦合系统,控制律必须把弹簧的弹性力当作一个独立状态来对待,不能简单忽略。这就是整个设计从零开始重构的根本原因。
1.2 动态面控制与传统反步法的对比
两连杆机械臂的动力学是一个标准的二阶非线性系统,传统反步法的思路很直接:定义跟踪误差、设计虚拟控制律、逐步回推,最后得到实际控制律。但有一个让人很崩溃的麻烦——“微分爆炸”。具体来说,反步法第三步要用到虚拟控制律的二阶甚至三阶导数,原本一个简单的参考轨迹经过两三次求导之后,表达式变成一长串符号杂乱的项,在Simulink里实现的时候又慢又容易出错,而且对噪声极其敏感。
动态面控制(Dynamic Surface Control, DSC)就是专门来解决这个问题的。它的做法是在每一步虚拟控制律输出之后,插进一个一阶低通滤波器:
[ \tau_f \dot{v}_i + v_i = \alpha_i ]
其中 (\alpha_i) 是原始的虚拟控制量,(v_i) 是滤波后的输出,(\tau_f) 是滤波器时间常数。这样一来,后面步骤只需要对滤波后的信号 (v_i) 求导,而 (v_i) 的导数在滤波器方程里直接就是 ((\alpha_i - v_i)/\tau_f),完全避开了解析求导。
我用一个很直观的类比来理解这件事:反步法像是要求你百米冲刺的时候每一步都算清楚脚踝的角度、速度和力矩的导数,而动态面控制是给每一步加了一个缓冲垫,你只需要知道上一个缓冲垫的目标值,剩下的交给垫子的动力学去平滑。代价就是跟踪精度会损失一点点,但这和微分爆炸导致的实现复杂度相比,完全不值一提。
1.3 引入自适应控制和一阶变阻抗的考量点
两连杆SEA系统里,不确定性来源太多了。连杆质量和质心位置在不同负载条件下会变化,关节摩擦力矩的老化和温漂更是让人抓狂。如果用固定参数控制器,要么在标称工况下性能爆炸,要么只能把控制器参数调得非常保守。自适应控制的好处是它利用系统的线性参数化特性,在线更新参数估计,让控制器跟着实际负载走。
变阻抗为什么也要加?因为单纯的自适应动态面控制只能保证轨迹跟踪,但我们的目标是柔顺接触任务:机械臂从自由空间运动到接触面,这个过程中阻抗参数必须变化。自由运动时希望刚度大一点,跟踪性能好;接触时希望刚度降低、阻尼增大,避免接触力过大。如果直接在某个时刻把目标刚度从大跳变小,力信号会出现明显的尖峰冲击。所以我选择给阻抗参数本身也加一阶动态,让刚度和阻尼按指数平滑过渡到新目标值,这个“一阶变阻抗”就变成了整套系统的外环。
2. 两连杆SEA系统建模与参数化
2.1 负载端两连杆动力学方程推导
建模是整个工作的地基,模型错了,后面控制器的稳定性结论全是自欺欺人。我这里采用拉格朗日方法推导负载端的两连杆动力学,标准形式如下:
[ M(q)\ddot{q} + C(q,\dot{q})\dot{q} + G(q) = \tau_s + \tau_{ext} ]
其中 (q \in \mathbb{R}^2) 是负载端关节角度向量(也就是连杆端的角度,不是电机侧角度),(M(q)) 是2x2惯性矩阵,(C(q,\dot{q})) 是科氏力和离心力矩阵,(G(q)) 是重力项,(\tau_s) 是弹簧传递给负载端的力矩,(\tau_{ext}) 是环境接触外力矩。
具体展开惯性矩阵,以第一关节和第二关节质量 (m_1=3.5,\text{kg})、(m_2=2.2,\text{kg}),连杆长度 (l_1=0.4,\text{m})、(l_2=0.35,\text{m}) 为例:
[ M_{11} = m_1 l_{c1}^2 + m_2 (l_1^2 + l_{c2}^2 + 2 l_1 l_{c2}\cos q_2) + I_1 + I_2 ]
[ M_{12} = M_{21} = m_2 (l_{c2}^2 + l_1 l_{c2}\cos q_2) + I_2 ]
[ M_{22} = m_2 l_{c2}^2 + I_2 ]
其中 (l_{c1}, l_{c2}) 分别是连杆质心到关节轴的距离,(I_1, I_2) 是连杆绕质心的转动惯量。看到科氏矩阵里的余弦项了吗?这就是非线性耦合的真正来源。建模时有个非常实用的经验:先用Matlab的符号工具箱把整个拉格朗日推导自动化,得到 (M) 和 (C) 的封闭表达式,再手写进控制代码。千万不要手动展开,符号错一个余弦项,后面仿真结果会烂到完全看不出方向。
2.2 电机侧与SEA弹簧的建模
SEA的电机侧动力学比普通电机模型多了一项弹簧反力矩:
[ J_m \ddot{\theta}_m + b_m \dot{\theta}_m + \tau_s = \tau_m ]
其中 (\theta_m) 是电机轴角度,(J_m) 是电机转子惯量,(b_m) 是电机侧黏性摩擦系数,(\tau_m) 是电机输出力矩,(\tau_s) 是弹簧力矩。
弹簧力矩由电机轴和负载轴的转角差决定:
[ \tau_s = k_s (\theta_m - q) ]
这里 (k_s) 就是弹簧刚度。请注意,因为弹簧是线性元件,整个系统实际上包含两个耦合的二阶子系统:电机侧和负载侧。负载侧的状态受到 (\tau_s) 的影响,而 (\tau_s) 又由两侧角度的差决定,所以系统是标准的四阶动力学系统。
在仿真实现时,我用一个状态向量包含四个变量:(q_1, q_2, \dot{q}1, \dot{q}2, \theta{m1}, \theta{m2}, \dot{\theta}{m1}, \dot{\theta}{m2}),共8个状态。写动力学函数时注意,负载侧用 (M(q)) 的逆矩阵求 (\ddot{q}),电机侧直接用 (J_m) 求 (\ddot{\theta}_m),这是最朴素也最不容易出错的方式。
2.3 线性参数化形式与回归矩阵
自适应控制要求系统能写成“已知量矩阵 × 未知参数向量”的形式。也就是把所有含有未知参数的项从方程中剥离:
[ Y(q, \dot{q}, v, \dot{v}) \Theta = M(q)\dot{v} + C(q,\dot{q})v + G(q) ]
其中 (\Theta) 是未知参数向量,在我的模型里包括 (m_1, m_2, I_1, I_2, m_1 l_{c1}, m_2 l_{c2}) 等;(v) 是给定的参考速度信号。
这里的核心操作就是把式子里所有与参数相乘的量单独拆出来。比如 (M(q)\dot{v}) 展开后,会得到 (\dot{v}1 M{11} + \dot{v}2 M{12}) 这样的项,每一项目里 (m_1)、(m_2) 等参数前面的系数就是回归矩阵的对应元素。我用符号工具箱配合一个简单函数完成了这个分解,把符号表达式丢进去,自动提取参数向量和回归矩阵。这样做的最大好处是,后续控制器代码里只需要用现成的 (Y) 矩阵乘上估计参数 (\hat{\Theta}),不用每次改动模型都重写一大坨。
3. 自适应一阶变阻抗动态面控制器设计
3.1 外环阻抗目标与一阶变阻抗参数更新
控制架构分两层:外层是阻抗环,内层是动态面自适应环。外环的任务是生成参考加速度和期望弹簧力矩,它的核心是一组期望阻抗方程:
[ M_d \ddot{e} + B_d \dot{e} + K_d e = \tau_{ext} ]
其中 (e = q - q_d) 是关节位置误差,(M_d) 是期望惯量矩阵(通常取常数对角阵),(B_d) 是期望阻尼矩阵,(K_d) 是期望刚度矩阵,(\tau_{ext}) 是环境外力矩。
传统固定阻抗控制的问题在接触前后不好权衡。我的做法是让 (K_d) 和 (B_d) 本身也随时间动态变化,而且变化过程用一阶动力学来平滑:
[ \dot{K}d = -\lambda_K (K_d - K{ref}) ]
[ \dot{B}d = -\lambda_B (B_d - B{ref}) ]
(K_{ref}) 和 (B_{ref}) 是当前任务阶段对应的目标阻抗参数。比如接触检测前 (K_{ref}=800),接触发生后切换为 (K_{ref}=200),(B_{ref}) 从10提升到60。(\lambda_K, \lambda_B) 控制过渡速度。为什么要这一层平滑?我踩过的坑是:直接把刚度从800跳变到200,接触力波形会出现一个尖锐的脉冲,幅度甚至能达到期望力的50%以上,这在打磨、装配类任务里完全不可接受。
3.2 内环动态面控制的设计步骤
外环阻抗方程求解得到的是参考加速度 (\ddot{q}_{des}),再加上期望阻抗中的阻尼和刚度项,我定义了一个修正后的期望速度 (v_f) 作为动态面控制的目标。整个内环设计分三步走:
第一步:定义位置跟踪误差 (z_1 = q - q_d),设计虚拟控制律:
[ \alpha_1 = \dot{q}_d - c_1 z_1 ]
按DSC的套路,(\alpha_1) 不直接进入下一步,而是先过一个一阶滤波器:
[ \tau_f \dot{v}_f + v_f = \alpha_1 ]
第二步:定义速度误差 (z_2 = \dot{q} - v_f)。这里利用外环阻抗给出的目标加速度和动力学模型,设计期望的弹簧力矩 (\tau_d):
[ \tau_d = Y(q, \dot{q}, v_f, \dot{v}_f)\hat{\Theta} - K_2 z_2 ]
注意,这里为了保证系统稳定,还需要在 (\tau_d) 中加入前馈补偿。阻抗目标里的 (K_d e + B_d e') 自然包含在 (z_2) 的定义和虚拟控制 (\alpha_1) 中,所以不需要额外处理。
第三步:定义弹簧力矩误差 (z_3 = \tau_d - \tau_s)。利用SEA模型,电机端控制律是:
[ \tau_{m} = J_m \dot{v}_m + b_m \dot{\theta}_m + \tau_s + K_3 z_3 ]
其中 (\dot{v}_m) 包含对 (\tau_d) 的滤波处理。这里的动态面滤波同样应用在 (\tau_d) 的导数上,避免对 (\tau_d) 直接求导产生的高阶导项。
3.3 自适应律设计与稳定性分析框架
自适应律选取标准的形式:
[ \dot{\hat{\Theta}} = -\Gamma Y^T z_2 - \sigma \hat{\Theta} ]
(\Gamma) 是自适应增益矩阵,(\sigma) 项是σ修正,防止参数漂移。我在实验中刚开始不加σ修正,自适应参数在没有持续激励的情况下会慢慢漂到不合理区间,甚至出现负质量参数这种荒唐值,仿真曲线看过去系统还稳定,实际机器人一旦遇到扰动就刹不住。加上σ修正后参数被拉向一个界内区域,鲁棒性提高一个档次。
稳定性分析用的是经典Lyapunov方法。构造候选函数:
[ V = \frac{1}{2} z_1^T z_1 + \frac{1}{2} z_2^T M z_2 + \frac{1}{2} z_3^T J_m z_3 + \frac{1}{2} \tilde{\Theta}^T \Gamma^{-1} \tilde{\Theta} ]
其中 (\tilde{\Theta} = \Theta - \hat{\Theta}) 是参数估计误差。对V求导代入控制器和自适应律,利用科氏矩阵的反对称性质 ( \dot{M} - 2C ) 是反对称矩阵,以及滤波误差项小于一个与(\tau_f)相关的界,可以得到闭环系统半全局一致最终有界(SGUUB)的结论。这个结论的实际含义是:只要滤波器时间常数选得足够小、控制增益足够大,系统的跟踪误差和参数估计误差会收敛到一个可以调节的小界内。
3.4 内环外环耦合的一个易错点
很多人在设计这种两层结构时容易忽略内外环的耦合问题。外环输出的是期望加速度,内环控制的是弹簧力矩,二者通过期望弹簧力矩 (\tau_d) 连接起来。如果内环偏差 (z_3) 很大,外环的阻抗目标没有实际驱动力支撑,整个系统就会出现“外环算得美滋滋、内环追不上”的脱节现象。所以我在设计时特意在 (\tau_d) 里保留了速度误差反馈项 (K_2 z_2),保证当内环还没跟上时,外环也有一个阻尼性恢复力,不至于发散。
4. Simulink仿真实现与参数配置
4.1 仿真工程结构与模块化拆解
整个仿真工程我命名为fullyfma.slx,这个名字其实就是“全状态反馈 + 自适应 + 力/位置调节”的缩写,没什么特殊含义,纯粹是我习惯性的文件命名风格。工程结构上我分了四个彼此独立的子系统模块,方便单独调试。
第一是参考信号生成模块。内部实现是先规划好两连杆的关节角轨迹,比如让第二连杆执行一个正弦摆动,第一关节保持一个设定角度,同时切换接触任务信号。轨迹都用五次多项式平滑过渡,初始速度和加速度为0。
第二是控制器模块。内部拆成三个子模块:变阻抗参数生成器、动态面外环、自适应内环。变阻抗模块用两个积分器加一个比例环节实现一阶动态更新;动态面外环包含两个一阶低通滤波器;自适应内环负责实时计算回归矩阵 (Y) 和参数更新律。
第三是SEA两连杆动力学模块。我用一个Level-2 MATLAB S-function实现,因为涉及矩阵求逆和状态解耦,用内置Simulink模块搭反而容易搞错。
第四是环境接触模块。用简化的弹簧阻尼接触模型,检测末端位置触及表面后,施加接触力 (F = k_{env} x_{pen} + b_{env} \dot{x}{pen}),其中 (x{pen}) 是穿透深度。
4.2 关键参数设置与整定思路
我把完整参数列个表,方便参考:
| 参数 | 符号 | 数值 | 说明 |
|---|---|---|---|
| 连杆1质量 | (m_1) | 3.5 kg | 实际系统含减速器等 |
| 连杆2质量 | (m_2) | 2.2 kg | 实际末端负载 |
| 连杆1长度 | (l_1) | 0.4 m | 关节1到关节2 |
| 连杆2长度 | (l_2) | 0.35 m | 关节2到末端 |
| SEA弹簧刚度 | (k_s) | 500 / 380 N·m/rad | 关节1/2不同刚度 |
| 电机转子惯量 | (J_m) | 0.01 kg·m² | 含减速器折算值 |
| 电机黏性摩擦 | (b_m) | 0.1 N·m·s/rad | 实测拟合 |
| DSC位置增益 | (c_1) | 20 | 越大跟踪越紧 |
| 速度误差增益 | (K_2) | 15 | 阻尼调节作用 |
| 弹簧力矩误差增益 | (K_3) | 300 | 内环快速收敛 |
| 滤波器时间常数 | (\tau_f) | 0.005 s | 需要权衡,见第5章 |
| 自适应增益 | (\Gamma) | 30 | 对角矩阵 |
| σ修正系数 | (\sigma) | 0.001 | 默认很小 |
| 阻抗目标刚度(自由) | (K_{ref}) | 800 N·m/rad | 跟踪优先 |
| 阻抗目标刚度(接触) | (K_{ref}) | 200 N·m/rad | 柔顺优先 |
| 阻抗目标阻尼(接触) | (B_{ref}) | 60 N·m·s/rad | 限冲击 |
| 变阻抗平滑系数 | (\lambda_K, \lambda_B) | 4 | ~0.25s过渡时间 |
| 期望惯量 | (M_d) | 0.5 单位阵 | 可调 |
初版参数怎么定?我的习惯是先把自适应增益设成0,也就是说先让控制器退化为固定参数DSC,调通基础跟踪性能,再逐步打开自适应和变阻抗。这是分阶段调试的核心策略,避免一堆参数交叠在一起,出了问题根本分不清是哪一环引起的。
4.3 仿真结果的核心观察点
三组对比实验值得重点看。
第一组是固定阻抗与一阶变阻抗的接触力对比。末端接近一个刚性平面,接触后目标接触力设为30 N,固定阻抗模式下接触力峰值冲到47 N,而一阶变阻抗模式下峰值只有34 N,而且收敛到30 N的时间更短,大概0.6秒。这就是平滑过渡的价值体现。
第二组是自适应参数估计的效果。设置负载端在3秒时增加一块0.5 kg的配重,固定参数控制器在配重加入瞬间跟踪误差从0.01 rad飙到0.08 rad,自适应控制器在经历0.4秒左右的重新收敛后误差回到0.015 rad附近。这里能直观看到自适应环节的意义。
第三组是滤波器时间常数的影响。(\tau_f) 从0.5秒调到0.005秒,跟踪误差明显减小,但控制力矩信号的高频抖动加剧。这个权衡只有通过多次仿真才能真正感受到,也是后面调试过程中最花时间的参数之一。
5. 调试过程中的常见问题与实战心得
5.1 动态面滤波器时间常数的选择依据
滤波器时间常数 (\tau_f) 是整个DSC算法里最敏感的参数,没有之一。太大,虚拟控制量被过度平滑,跟踪误差变大,阻抗特性失真;太小,DSC就失去了“避免微分爆炸”的意义,控制律接近原始反步法,高频噪声会直接串进力矩信号。
我的经验公式是:设定目标闭环带宽 (f_{BW})(比如10 Hz),那么 (\tau_f) 取 (1/(2\pi f_{BW})) 的1/5到1/10比较稳妥。实测下来,我这里的系统目标带宽约10-15 Hz,(\tau_f) 取0.005秒效果最好。如果控制通道存在明显的执行器延迟,(\tau_f) 还要适当调小一点,因为滤波器延迟会叠加在执行器延迟上,整体相位裕度会下降。
另外,两个关节如果物理参数差异大,可以分别设置不同的 (\tau_f),不要盲目统一。我第二关节弹簧刚度比第一关节小,动态响应慢,所以它的滤波器时间常数取了0.008秒,整体效果比统一0.005更好。
5.2 自适应增益与参数漂移的对抗
自适应增益 (\Gamma) 是一个典型的双刃剑。 (\Gamma) 大,参数收敛速度快,但噪声敏感度和参数漂移风险也暴涨。我在调试时遇到过非常有代表性的现象:(\Gamma=100) 时,参数估计从初值迅速逼近真实值,接触力跟踪也表现良好,但仿真进行到40秒以后,估计出的质量参数开始缓慢单调上升,明显偏离真实物理范围。这是典型的不满足持续激励条件的参数漂移。
解决办法有两层。第一层是加σ修正,让参数估计项在目标函数里带一个小的阻尼惩罚,这基本是标配。第二层是手动限制参数搜索范围,在自适应律更新代码里加饱和逻辑,比如 (m_1) 的估计值限制在2-5 kg范围内。两层同时用上,长期仿真稳定性才算真正解决。
实操提示:如果你发现自适应参数在刚启动时有明显突变,检查初始估计值。设置初始估计为标称值的60-80%通常比设置为0更平滑,因为自适应律刚开始会先追逐一个离谱的大误差项,导致控制力矩初段有尖峰。
5.3 一阶变阻抗切换频率与冲击的关系
变阻抗的平滑系数 (\lambda) 直接决定系统在任务切换时的瞬态行为。我一开始把 (\lambda) 设成20,想着反正是一阶平滑,快一点也无所谓,结果接触力峰值依然超过目标力40%。后来分析发现,虽然阻抗参数本身被平滑了,但阻抗参数变化引起的期望力矩变化率依然很大,还来不及被 (\tau_d) 里的反馈项抑制。
把 (\lambda_K, \lambda_B) 降到4之后,过渡时间大约0.25秒,在这个时间段里阻尼也在同步增大(从10到60),有效吸收了接触冲击。这给我的经验是:变阻抗平滑系数的量级要跟任务切换持续时间和期望阻尼的增速匹配,而不是单纯追求越平滑越好。如果任务要求更快的响应,可以把过渡时间压缩到0.1秒,但前提是增大接触阻尼的增长速度,否则必然会重新出现力尖峰。
5.4 数值求解器与仿真步长的选择技巧
带SEA的机械臂模型存在明显的柔性模态,尤其是弹簧刚度较大时,系统呈刚性特征。仿真时如果无脑用默认的ode45,可能出现两类问题:一是仿真步长自动缩减导致卡顿,二是结果异常发散,看起来像是控制器不稳定,实际是数值积分精度不足。
我的经验是分场景选择。参数调试阶段用ode15s,它适合刚性系统,仿真速度快,但精度略差。最终验收阶段换用固定步长ode4,步长设1e-4秒,这样能保证高频状态(弹簧力和电机速度)的解析精度。实测下来,de45在柔性模态频率超过100 Hz后,结果可信度确实不够高,后处理曲线会出现毛刺,容易误导参数判断。
5.5 常见问题速查表
| 故障现象 | 可能原因 | 解决手段 |
|---|---|---|
| 仿真发散,误差快速增大 | 控制增益过大或滤波器时间常数过小 | 先减小 (K_3),再加大 (\tau_f) 重调 |
| 接触力超调严重 | 阻抗过渡太快或阻尼不足 | 降低 (\lambda_K),同步提高 (B_{ref}) |
| 自适应参数持续漂移 | 无持续激励或σ过小 | 加大σ,添加参数饱和限幅 |
| 轨迹跟踪稳态误差大 | 虚拟控制增益 (c_1) 不足或滤波器过平滑 | 增大 (c_1),减小 (\tau_f) |
| 电机力矩高频抖动 | 自适应增益过大或微分噪声 | 减小 (\Gamma),检查信号滤波 |
| 弹簧实测力与控制目标偏差大 | SEA参数标定不准 | 做离线静态标定,校准 (k_s) |
| 内环能跟上但整体响应慢 | 外环阻抗 (M_d) 过大 | 减小 (M_d),加快外环动态 |
5.6 一个容易被忽略的实践细节:状态初始化
最后分享一个我多次踩过的坑:仿真初始化时,如果SEA电机端角度和负载端角度初始值设置不一致,弹簧在控制启动瞬间就会有一个巨大的预紧力,导致初始力矩饱和,控制器还没开始工作就已经触发饱和。解决办法是,在初始化阶段把电机角度设置为使弹簧力矩为0的值,也就是 (\theta_m(0) = q(0))。如果是通过期望力启动,让 (\theta_m(0) = q(0) + \tau_{des}/k_s)。这个细节在大多数论文里不会写,但实际工程中不处理的话,前0.1秒的控制输出就是乱飞的。
另外再提一点,做自适应控制时,如果把初始参数估计值恰好设置为标称值,仿真结果往往好得没有说服力。务必在验证阶段把初始参数故意调偏20%-30%,看看自适应律能否在线把参数拉到正确区间,这才是检验鲁棒性的正确姿势。
这套方案跑通之后,我又试着把同样的控制架构移植到一个六维力控平台上,外环从关节空间换到笛卡尔空间,整体的方法学基本可以直接复用。动态面控制加自适应处理SEA柔性和参数不确定性,一阶变阻抗提供任务级的柔顺过渡,这套组合对大部分力控机器人项目都是值得尝试的框架。
本文还有配套的精品资源,点击获取