31 template<
class U,
class = U>
32 struct is_pidable_helper : std::false_type {};
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{})>
41 static constexpr bool value = is_pidable_helper<T>::value;
54 static_assert(
is_pidable_v<T>,
"template parameter T must be PID-able type");
67 const float sec = std::chrono::duration<float>{
delta_time}.count();
static constexpr bool value
T型同士の加減算とfloat型との乗除が定義されていて、デフォルト初期化が可能であればtrue, そうでなければfalse。
constexpr bool is_pidable_v
T型がPID制御可能な型であるかを判定する。 T型同士の加減算とfloat型との乗除が定義されていればtrue, そうでなければfalse。
void refresh(const T &init=T{}) noexcept(noexcept(T{}))
I値をリセットする。
T calc(const T &dst, const T &now, const std::chrono::microseconds &delta_time)
目標値、現在値、経過時間からPID制御の計算を行う。
Pid(const PidGain &pid_gain, const T &init=T{}) noexcept(noexcept(T{}))
コンストラクタ。ゲインをセットする。
void set_pid_gain(const PidGain &pid_gain) noexcept(noexcept(refresh()))
ゲインをセットし、refreshを呼び出す。