今回はMATLABで三軸PID制御を行う方法です。行っている処理それぞれコメントに書かれているとおりです。多分これを動かすと↓のようになるはずです。

- %ワークスペース初期化
- close all
- clear
- clc
- clearvars
- FinishTime = 20;
- dt = 0.01;
- LogCount = 0;
- %物体の定義
- m = 1; %重量[kg]
- g = 9.8; %重力加速度[m/s^2]
- %位置,速度,加速度の定義
- Current_x = [0;0;0]; %初期位置[m]
- Current_v = [0;0;0]; %初期速度[m/s]
- Current_a = [0;0;0]; %初期加速度[m/s^2]
- %偏差の定義
- Error_x = [0;0;0]; %位置の偏差
- Past_Error = [0;0;0]; %過去の偏差
- I = [0;0;0]; %偏差の累積
- %PIDゲインの設定
- Kp = 1; %Pゲイン
- Ki = 0.2; %Iゲイン
- Kd = 1; %Dゲイン
- %目標位置の設定
- Target_x = [30;60;90]; %目標座標[m]
- %シミュレーションのループ
- for time = 0 : dt : FinishTime %FinishTimeまでdtで増加
- %PID制御
- Error_x = Target_x - Current_x; %偏差の算出
- I = I + Error_x * dt; %偏差の累積
- F = Error_x * Kp + (((Error_x - Past_Error) / dt) * Kd + I * Ki); %PID制御
- F = F + [0;0;m*g]; %重力加速度の補正
- Past_Error = Error_x; %過去の偏差を更新
- %位置,速度,加速度の計算
- Current_a = (F + [0;0;-m*g]) / m; %現在の加速度を算出[m/s^2] F+(重力) = m*a
- Current_v = Current_v + Current_a * dt; %現在の速度を算出[m/s] v = v0+a*t
- Current_x = Current_x + Current_v * dt + 0.5 * Current_a * (dt)^2; %現在の位置を算出[m] x = x0+v0*t+0.5*a*t^2
- %位置,時間,の記録
- LogCount = LogCount + 1; %カウントを加算
- Log.X(LogCount) = Current_x(1); %現在位置の記録
- Log.Y(LogCount) = Current_x(2);
- Log.Z(LogCount) = Current_x(3);
- Log.nX(LogCount) = Target_x(1); %目標位置の記録
- Log.nY(LogCount) = Target_x(2);
- Log.nZ(LogCount) = Target_x(3);
- Log.Time(LogCount) = LogCount *dt - dt; %微小時間から秒に変換
- end
- %%シミュレーションの結果処理(グラフ出力)
- figure(1)
- hold on
- plot(Log.Time, Log.X)
- plot(Log.Time, Log.nX)
- plot(Log.Time, Log.Y)
- plot(Log.Time, Log.nY)
- plot(Log.Time, Log.Z)
- plot(Log.Time, Log.nZ)
- xlabel('Time t[s]')
- ylabel('X Position[m]')
- hold off