GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
pid.h
浏览该文件的文档.
1
7#pragma once
8#include <cmath>
9#include <algorithm>
10
11#include "device/motor/base.hpp"
12#include "controller.hpp"
13#include "utils/controller.hpp"
14
15namespace roboctrl::utils{
21template<typename T, auto error_measurer>
22struct pid_base {
23 T kp = 0;
24 T ki = 0;
25 T kd = 0;
26
27 T max_out{};
28 T max_iout{};
29
30 using input_type = T;
31 using state_type = T;
32
37 T kp = 0;
38 T ki = 0;
39 T kd = 0;
40
41 T max_out{};
42 T max_iout{};
43 };
44
45 pid_base() = default;
46
47 pid_base(const params_type& params)
48 : kp(params.kp), ki(params.ki), kd(params.kd),
49 max_out(params.max_out), max_iout(params.max_iout) {}
50
54 void set_target(T target) { target_ = target; }
55
56 inline T target() const { return target_; }
57
67 void update(T current, T dt) {
68 T error_prev = last_error_;
69 T error_curr = error_measurer(current, target_);
70 last_error_ = error_curr;
71
72 T pout = kp * error_curr;
73
74 if (dt > T{0}) {
75 integral_ += ki * error_curr * dt;
76 }
77 integral_ = std::clamp(integral_, -max_iout, max_iout);
78
79 const T derivative = dt > T{0}
80 ? kd * (error_curr - error_prev) / dt
81 : T{0};
82
83 T out = pout + integral_ + derivative;
84 out = std::clamp(out, -max_out, max_out);
85
86 output_ = out;
87 }
88
90 void update(T current) { update(current, T{1}); }
91
98 void update(T target, T current, T dt) {
99 set_target(target);
100 update(current, dt);
101 }
102
106 void clean() {
107 integral_ = 0;
108 last_error_ = 0;
109 output_ = 0;
110 target_ = 0;
111 }
112
116 T state() const { return output_; }
117
118private:
119 T target_ = 0;
120 T integral_ = 0;
121 T last_error_ = 0;
122 T output_ = 0;
123};
124
125namespace details{
126
128constexpr auto linear_error = [](fp32 cur, fp32 target) {
129 return target - cur;
130};
131
133constexpr auto rad_error = [](fp32 cur, fp32 target) {
134 fp32 diff = target - cur;
135 diff = fmod(diff + M_PI, 2*M_PI);
136 if (diff < 0) diff += 2*M_PI;
137 diff -= M_PI;
138 return diff;
139};
140
141}
142
147
148static_assert(utils::controller<linear_pid>);
149static_assert(utils::controller<rad_pid>);
150
152template<device::motor motor_type>
154
156template<device::motor motor_type>
158
159}
控制器概念,约束 update/state/构造能力。
控制器概念与串联控制链。
电机基础组件。
用于存放工具函数的命名空间。
Definition ballistics.hpp:6
constexpr auto rad_error
角度误差计算方式,自动处理 2π 周期。
Definition pid.h:133
constexpr auto linear_error
线性误差计算方式。
Definition pid.h:128
被控制算法(例如PID)控制的电机
Definition base.hpp:133
统一的参数封装,方便序列化。
Definition pid.h:36
PID 控制器基础模板。
Definition pid.h:22
void update(T target, T current, T dt)
同时设置目标并根据当前值更新输出。
Definition pid.h:98
void clean()
清空积分项、误差缓存与输出。
Definition pid.h:106
T state() const
获取最新的控制输出。
Definition pid.h:116
void set_target(T target)
设置期望目标。
Definition pid.h:54
void update(T current, T dt)
根据当前值和采样周期更新 PID 输出。
Definition pid.h:67
void update(T current)
Definition pid.h:90
float fp32
单精度浮点别名。
Definition utils.hpp:22