Skip to content

Commit 31e8d81

Browse files
committed
Squashed commit of the following:
commit 7a3a536 Author: miyahara046 <taka.rocket.nba.1104@gmail.com> Date: Sat May 17 15:14:16 2025 +0900 add:Pid.cppのテストをするファイルの追加 commit 84558db Author: miyahara046 <taka.rocket.nba.1104@gmail.com> Date: Sat May 17 15:12:15 2025 +0900 add:Pidを計算するファイルの追加
1 parent cbde8c8 commit 31e8d81

File tree

3 files changed

+420
-0
lines changed

3 files changed

+420
-0
lines changed

modules/Pid.cpp

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/**
2+
* @file Pid.cpp
3+
* @brief PIDを計算するクラス
4+
* @author miyahara046
5+
*/
6+
7+
#include "Pid.h"
8+
PidGain::PidGain(double _kp, double _ki, double _kd)
9+
// pidゲインが負の値にならないようにする
10+
: kp(_kp < 0 ? 0 : _kp), ki(_ki < 0 ? 0 : _ki), kd(_kd < 0 ? 0 : _kd)
11+
{
12+
}
13+
14+
Pid::Pid(double _kp, double _ki, double _kd, double _targetValue, double _maxIntegral,
15+
double _minIntegral)
16+
: pidGain(_kp, _ki, _kd),
17+
prevDeviation(0.0),
18+
integral(0.0),
19+
targetValue(_targetValue),
20+
maxIntegral(_maxIntegral),
21+
minIntegral(_minIntegral)
22+
{
23+
}
24+
25+
void Pid::setPidGain(double _kp, double _ki, double _kd)
26+
{
27+
// pidゲインが負の値にならないようにする
28+
pidGain.kp = _kp < 0 ? 0 : _kp;
29+
pidGain.ki = _ki < 0 ? 0 : _ki;
30+
pidGain.kd = _kd < 0 ? 0 : _kd;
31+
}
32+
33+
double Pid::calculatePid(double currentValue, double delta)
34+
{
35+
// 0除算を避けるために0の場合はデフォルト周期0.01とする
36+
if(delta == 0) delta = 0.01;
37+
38+
// 現在の目標値との偏差を求める
39+
double currentDeviation = targetValue - currentValue;
40+
// 積分の処理を行う
41+
integral += (currentDeviation + prevDeviation) * delta / 2;
42+
// 累積する積分値の大きさ制限
43+
if(integral > maxIntegral)
44+
integral = maxIntegral;
45+
else if(integral < minIntegral)
46+
integral = minIntegral;
47+
// 微分の処理を行う
48+
double currentDerivative = (currentDeviation - prevDeviation) / delta;
49+
/**
50+
* 微分項にローパスフィルタを適用
51+
* 偏差が大きい際に過大な変化量を一気に与えず
52+
* 滑らかな変化にし、機体の暴走を防ぐため
53+
*/
54+
filteredDerivative = 0.8 * currentDerivative + (0.2) * filteredDerivative;
55+
56+
// 前回の偏差を更新する
57+
prevDeviation = currentDeviation;
58+
59+
// P制御の計算を行う
60+
double p = pidGain.kp * currentDeviation;
61+
// I制御の計算を行う
62+
double i = pidGain.ki * integral;
63+
// D制御の計算を行う
64+
double d = pidGain.kd * filteredDerivative;
65+
66+
// 操作量 = P制御 + I制御 + D制御
67+
return (p + i + d);
68+
}

modules/Pid.h

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
/**
2+
* @file Pid.h
3+
* @brief PIDを計算するクラス
4+
* @author miyahara046
5+
*/
6+
7+
#ifndef PID_H
8+
#define PID_H
9+
10+
// PIDゲインを保持する構造体
11+
struct PidGain {
12+
public:
13+
double kp; // Pゲイン
14+
double ki; // Iゲイン
15+
double kd; // Dゲイン
16+
17+
/** コンストラクタ
18+
* @param _kp Pゲイン
19+
* @param _ki Iゲイン
20+
* @param _kd Dゲイン
21+
*/
22+
PidGain(double _kp, double _ki, double _kd);
23+
};
24+
25+
class Pid {
26+
public:
27+
/** コンストラクタ
28+
* @param _kp Pゲイン
29+
* @param _ki Iゲイン
30+
* @param _kd Dゲイン
31+
* @param _targetValue 目標値
32+
* @param _maxIntegral 累積積分値の最大値
33+
* @param _minIntegral 累積積分値の最小値
34+
*/
35+
Pid(double _kp, double _ki, double _kd, double _targetValue, double _maxIntegral,
36+
double _minIntegral);
37+
38+
/**
39+
* @brief PIDゲインを設定する
40+
* @param _kp Pゲイン
41+
* @param _ki Iゲイン
42+
* @param _kd Dゲイン
43+
*/
44+
void setPidGain(double _kp, double _ki, double _kd);
45+
46+
/**
47+
* @brief PIDを計算する
48+
* @param currentValue 現在値
49+
* @param delta 周期[ms](デフォルト値0.01[10ms]、省略可)
50+
* @return PIDの計算結果(操作量)
51+
*/
52+
double calculatePid(double currentValue, double delta = 0.01);
53+
54+
private:
55+
PidGain pidGain;
56+
double prevDeviation; // 前回の偏差
57+
double integral; // 偏差の累積
58+
double filteredDerivative = 0; // フィルタされた微分項を保持する変数
59+
double targetValue; // 目標値
60+
double maxIntegral = 100; // 累積積分値の最大値
61+
double minIntegral = -100; // 累積積分値の最小値
62+
};
63+
64+
#endif

0 commit comments

Comments
 (0)