今回はMATLABで三軸PID制御を行う方法です。行っている処理それぞれコメントに書かれているとおりです。多分これを動かすと↓のようになるはずです。スクリーンショット 2020-10-16 232625


  1. %ワークスペース初期化
  2. close all
  3. clear
  4. clc
  5. clearvars

  6. FinishTime = 20;
  7. dt = 0.01;
  8. LogCount = 0;

  9. %物体の定義
  10. m = 1; %重量[kg]
  11. g = 9.8; %重力加速度[m/s^2]

  12. %位置,速度,加速度の定義
  13. Current_x = [0;0;0]; %初期位置[m]
  14. Current_v = [0;0;0]; %初期速度[m/s]
  15. Current_a = [0;0;0]; %初期加速度[m/s^2]

  16. %偏差の定義
  17. Error_x = [0;0;0]; %位置の偏差
  18. Past_Error = [0;0;0]; %過去の偏差
  19. I = [0;0;0]; %偏差の累積

  20. %PIDゲインの設定
  21. Kp = 1; %Pゲイン
  22. Ki = 0.2; %Iゲイン
  23. Kd = 1; %Dゲイン

  24. %目標位置の設定
  25. Target_x = [30;60;90]; %目標座標[m]

  26. %シミュレーションのループ
  27. for time = 0 : dt : FinishTime %FinishTimeまでdtで増加
  28. %PID制御
  29. Error_x = Target_x - Current_x; %偏差の算出
  30. I = I + Error_x * dt; %偏差の累積
  31. F = Error_x * Kp + (((Error_x - Past_Error) / dt) * Kd + I * Ki); %PID制御
  32. F = F + [0;0;m*g]; %重力加速度の補正
  33. Past_Error = Error_x; %過去の偏差を更新
  34. %位置,速度,加速度の計算
  35. Current_a = (F + [0;0;-m*g]) / m; %現在の加速度を算出[m/s^2] F+(重力) = m*a
  36. Current_v = Current_v + Current_a * dt; %現在の速度を算出[m/s] v = v0+a*t
  37. Current_x = Current_x + Current_v * dt + 0.5 * Current_a * (dt)^2; %現在の位置を算出[m] x = x0+v0*t+0.5*a*t^2
  38. %位置,時間,の記録
  39. LogCount = LogCount + 1; %カウントを加算
  40. Log.X(LogCount) = Current_x(1); %現在位置の記録
  41. Log.Y(LogCount) = Current_x(2);
  42. Log.Z(LogCount) = Current_x(3);
  43. Log.nX(LogCount) = Target_x(1); %目標位置の記録
  44. Log.nY(LogCount) = Target_x(2);
  45. Log.nZ(LogCount) = Target_x(3);
  46. Log.Time(LogCount) = LogCount *dt - dt; %微小時間から秒に変換
  47. end

  48. %%シミュレーションの結果処理(グラフ出力)
  49. figure(1)
  50. hold on
  51. plot(Log.Time, Log.X)
  52. plot(Log.Time, Log.nX)
  53. plot(Log.Time, Log.Y)
  54. plot(Log.Time, Log.nY)
  55. plot(Log.Time, Log.Z)
  56. plot(Log.Time, Log.nZ)
  57. xlabel('Time t[s]')
  58. ylabel('X Position[m]')
  59. hold off