Matlab官网例子:使用自适应模型预测控制的小车避障https://ww2.mathworks.cn/help/mpc/ug/obstacle-avoidance-using-adaptive-model-predictive-control.html
例子中的小车模型是连续非线性时不变的,状态变量x=[小车全局X坐标,小车全局Y坐标,小车航向角θ,小车车速v],控制变量u=[油门开度T,转角δ]。
这里的自适应是指在每个预测时间步,根据测量输出(这里就是状态x)和控制输入u,更新小车模型为(x,u)处的离散线性化模型,并且更新避障所需的约束条件。由于只有2个控制自由度,为了达到零稳态误差的完美跟踪,只能跟踪两个系统输出,这里的优化目标是使小车Y坐标和车速v跟踪参考信号(其中refSignal=[0 0 0 20]),因此mpc控制器里对测量输出的权重设置为
mpcobj.Weights.OutputVariables = [0 30 0 1]
查看matalb自带函数mpcmoveAdaptive,发现其甚至能求解时变的离散线性化小车模型,也即可以显式指定每一预测时间步的小车模型!
P.S. mpcmoveAdaptive.m 里有一段话:
% [u, Info] = mpcmoveAdaptive(MPCobj,x,Plant,Nominal,y,r,v,MoveOptions)
% NOTE: This command allows you to modify the controller's prediction
% model(s) without re-defining the controller object, which involves
% considerable overhead. If Plant and Nominal are constant, use MPCMOVE
% instead.
意味着为了达到自适应控制的目的,除了使用mpcmoveAdaptive命令,还有一种方法是在每一计算时间步根据新的对象模型重新定义常规的mpc controller object,但是自适应mpc命令的计算开销要更小。
但官网的这个例子有点bug:小车原本的非线性模型只有一个平衡点[0,0,0,0],而随后设计AdaptiveMPC控制器时在其他状态处进行线性化,我尝试过,发现这样得到的控制器只能控制住线性化的(连续时间/离散时间)小车模型,而对原本的非线性小车模型控制效果很差。