Chassis v2.1.1
Chassisはロボコンでの足回り制御を行うためのC++ライブラリである。
Loading...
Searching...
No Matches
Pid.h
Go to the documentation of this file.
1#ifndef CHASSIS_PID_H_
2#define CHASSIS_PID_H_
7#include <chrono>
8#include <type_traits>
9
10namespace rct {
11
15
19
21struct PidGain {
22 float kp;
23 float ki;
24 float kd;
25};
26
29template<class T>
31 template<class U, class = U>
32 struct is_pidable_helper : std::false_type {};
33 template<class U>
34 struct is_pidable_helper<U, decltype(std::declval<U&>() = std::declval<U>() + std::declval<U>(),
35 std::declval<U&>() = std::declval<U>() - std::declval<U>(),
36 std::declval<U&>() = std::declval<U>() * std::declval<float>(),
37 std::declval<U&>() = std::declval<U>() / std::declval<float>(), U{})>
38 : std::true_type {};
39 public:
41 static constexpr bool value = is_pidable_helper<T>::value;
42};
43
47template<class T>
49
52template<class T>
53struct Pid {
54 static_assert(is_pidable_v<T>, "template parameter T must be PID-able type");
55
59 Pid(const PidGain& pid_gain, const T& init = T{}) noexcept(noexcept(T{})) : pid_gain_{pid_gain}, pre_{init} {}
60
66 T calc(const T& dst, const T& now, const std::chrono::microseconds& delta_time) {
67 const float sec = std::chrono::duration<float>{delta_time}.count();
68 const T proportional = dst - now;
69 integral_ += proportional * sec;
70 const T differential = (proportional - pre_) / sec;
71 pre_ = proportional;
72 return proportional * pid_gain_.kp + integral_ * pid_gain_.ki + differential * pid_gain_.kd;
73 }
74
76 void refresh(const T& init = T{}) noexcept(noexcept(T{})) {
77 integral_ = T{};
78 pre_ = init;
79 }
80
83 void set_pid_gain(const PidGain& pid_gain) noexcept(noexcept(refresh())) {
84 pid_gain_ = pid_gain;
85 refresh();
86 }
87
88 private:
89 PidGain pid_gain_;
90 T integral_{};
91 T pre_;
92};
93
95
97
98} // namespace rct
99
100#endif // CHASSIS_PID_H_
T型がPID制御可能な型であるかを判定する。
Definition Pid.h:30
static constexpr bool value
T型同士の加減算とfloat型との乗除が定義されていて、デフォルト初期化が可能であればtrue, そうでなければfalse。
Definition Pid.h:41
constexpr bool is_pidable_v
T型がPID制御可能な型であるかを判定する。 T型同士の加減算とfloat型との乗除が定義されていればtrue, そうでなければfalse。
Definition Pid.h:48
robot control library
Definition Chassis.h:16
N輪オムニの制御を行うクラス。
Definition Omni.h:25
PID制御のゲイン
Definition Pid.h:21
float kp
比例ゲイン
Definition Pid.h:22
float ki
積分ゲイン
Definition Pid.h:23
float kd
微分ゲイン
Definition Pid.h:24
T型のPID制御を行うクラス。
Definition Pid.h:53
void refresh(const T &init=T{}) noexcept(noexcept(T{}))
I値をリセットする。
Definition Pid.h:76
T calc(const T &dst, const T &now, const std::chrono::microseconds &delta_time)
目標値、現在値、経過時間からPID制御の計算を行う。
Definition Pid.h:66
Pid(const PidGain &pid_gain, const T &init=T{}) noexcept(noexcept(T{}))
コンストラクタ。ゲインをセットする。
Definition Pid.h:59
void set_pid_gain(const PidGain &pid_gain) noexcept(noexcept(refresh()))
ゲインをセットし、refreshを呼び出す。
Definition Pid.h:83