无模型自适应预测控制CFDL Simulink模型可进行轨迹跟踪控制

最近在折腾无模型自适应控制(CFDL-MFAPC),发现这玩意儿用来做轨迹跟踪简直像开挂。传统控制算法动不动就要精确模型,遇到电机温漂、机械磨损这些玄学问题就吃瘪。CFDL的核心思路很骚——不用建模,直接拿系统输入输出数据在线调参,今天拿Simulink撸了个轨迹跟踪的demo,效果比想象中还顶。

先看整体模型结构(贴个Simulink截图)。核心是MFAC控制器模块和被控对象模块,中间用总线信号传递伪偏导数这类中间变量。被控对象我直接拿二阶非线性系统开刀,方程写成这样:

function [y, phi] = nonlinear_system(u, prev_y)
    % 被控对象状态更新
    delta = 0.1*randn();  % 模拟随机扰动
    y = (prev_y/(1+prev_y^2)) + u^3 + delta;
    phi = (1/(1+prev_y^2)) + 3*u^2;  % 理论伪偏导数
end

这段代码的鸡贼之处在于:实际控制时根本不会用到phi这个理论值,全靠数据驱动估计。咱们控制器里有个伪偏导数估计器,核心代码长这样:

function phi_hat = estimate_phi(phi_hat_old, y, y_old, u, u_old)
    mu = 0.5;  % 可调滤波因子
    eta = 0.01;  % 防零除数
    delta_u = u - u_old;
    if abs(delta_u) > eta
        phi_hat = mu*phi_hat_old + (1-mu)*(y - y_old)/delta_u;
    else
        phi_hat = phi_hat_old;  % 输入变化小时保持估计值
    end
end

这个估计算法有两个骚操作:1. 用mu做低通滤波防止突变;2. 加入delta_u阈值避免分母过小。实际跑起来比理论推导的鲁棒性强得多,就算被控对象突然抽风(比如把u^3改成u^5),控制器也能自适应跟上。

控制律的实现更简单粗暴:

function u = control_law(rho, lambda, phi_hat, e, u_old)
    if abs(phi_hat) > 1e-3  % 防止初始值异常
        u = u_old + (rho*phi_hat/(lambda + phi_hat^2)) * e;
    else
        u = u_old;  % 伪偏导数异常时维持原输入
    end
end

这里的rho和lambda是调参重点。实测lambda>0.1时系统更稳但响应变慢,建议从lambda=0.01开始调。有个坑要注意:当phi_hat估计错误时,控制量可能爆炸,所以代码里加了绝对值判断做保护。

跑了个正弦轨迹跟踪测试(贴输出曲线图),跟踪误差能压在±0.05以内。有意思的是对比PID控制,在3秒时故意给被控对象加了个阶跃扰动,PID花了0.8秒恢复,而CFDL-MFAPC只用了0.3秒就自适应补偿了。

手痒想调参数的话,改这几个地方立竿见影:

  1. 伪偏导数估计器的mu参数:调小能更快响应但更容易抖
  2. 控制律中的rho:相当于比例系数,但别超过1
  3. 数据窗长度:Simulink里用Delay模块实现,建议从N=3开始试

这玩意儿最大的优势就是移植方便,昨天刚把算法移植到树莓派上控制舵机,代码几乎不用改。下次准备试试四旋翼的轨迹跟踪,到时候再和大家唠实测效果。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐