1

私は MATLAB の非線形 MPC ツールボックスを使用しており、簡単なコントローラーを実装しようとしています。ただし、初期制御信号が与えられると、uknlmpcmove によって生成された制御信号はすべてuk(ゼロ時刻の値でsaveStates埋められます) と同じになります。uk

コードの関連部分。

%% Create MPC object
numStates = 12;
numOutputs = 12;
numControl = 2;

nlobj = nlmpc(numStates,numOutputs,numControl);
nlobj.Ts = constants.Ts;
Tswing = 0.1;
nlobj.PredictionHorizon = 5;
nlobj.ControlHorizon = 4;

nlobj.Model.StateFcn = @legStateFcn;
nlobj.Model.IsContinuousTime = false;

% Output function is exact state
nlobj.Model.OutputFcn = @(x,u) x;
nlobj.Jacobian.OutputFcn = @(x,u) eye(numStates);

% Weights
nlobj.Optimization.CustomCostFcn = @costFcn;
nlobj.Optimization.ReplaceStandardCost = true;

nlobj.Optimization.CustomIneqConFcn = @ineqFcn;

% Kalman filter
EKF = extendedKalmanFilter(@legStateFcn,@legMeasurementFcn);
EKF.State = x0;

%% Run MPC
u0 = zeros(numControl,1);
uk = u0;

yinit = x0;
yfinal = x0 + 1;
yref = [yinit yfinal]';

validateFcns(nlobj,yinit,u0) % THIS SAYS IT IS ALL OK

saveState = zeros(length(yinit),length(t));
saveControl = zeros(length(uk),length(t));
y = yinit;
for i = 1:length(t)
    disp(i/length(t)*100)
    
    xk = correct(EKF,y);
    saveState(:,i) = xk;
    
    uk = nlmpcmove(nlobj,xk,uk,yref(2,:));
    saveControl(:,i) = uk;

    % Predict state for next iteration
    predict(EKF,uk);
    % Implement optimal control move
    x = legStateFcn(xk,uk);
    y = x;    
end

すべてOKを返すのでvalidateFcns(nlobj,yinit,u0)、すべての関数ハンドルを表示する理由はわかりませんが、適切な測定のためです。

LegStateFcn.m; function xk1 = legStateFcn(xk,uk)

costFcn.m; function J = costFcn(X,U,e,data)

ineqFcn.m; function ineq = ineqFcn(X,U,e,data)

legMeasurementFcn.m; function yk = legMeasurementFcn(xk)

MATLAB は、私がここで行っていることについて文句を言うことはありませんが、u0の前に与えられたものがあるfor-loop場合、 からの結果の制御信号nlmpcmoveは同じu0です。ukbefore と afterの名前を変更しnlmpcmove、 を削除してデバッグしnlobj.Jacobian.OutputFcn、結果の状態 (不等式の制約に準拠していない) をシミュレートし、期待どおりにシステムのダイナミクスに実際に従っていることを確認しました。

私は自分が何を間違っているのか理解できず、そもそもそれを行うべきではなかったような明らかな小さな間違いの場合であることを恐れています.

4

0 に答える 0