GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
motion_logic.hpp
1#pragma once
2
3#include <cmath>
4#include "utils/pid.h"
5#include "utils/utils.hpp"
6
7namespace roboctrl::ctrl {
8
10inline vectorf gimbal_to_chassis(vectorf velocity, fp32 relative_yaw) {
11 const fp32 c = std::cos(relative_yaw), s = std::sin(relative_yaw);
12 return {.x = c * velocity.x + s * velocity.y,
13 .y = -s * velocity.x + c * velocity.y};
14}
15
18public:
19 void configure(const utils::rad_pid::params_type& params, fp32 direction,
20 fp32 settle_speed, fp32 tolerance) {
21 pid_ = utils::rad_pid{params};
22 direction_ = direction;
23 settle_speed_ = settle_speed;
24 tolerance_ = tolerance;
25 }
26 fp32 update(fp32 request, fp32 relative_yaw, fp32 dt) {
27 const fp32 error = utils::rad_format(relative_yaw);
28 if (request != 0.0f) {
29 spin_direction_ = std::copysign(1.0f, request);
30 returning_ = true;
31 last_error_ = error;
32 pid_.clean();
33 return request;
34 }
35 if (returning_) {
36 // Ignore the +/-pi wrap; accept a real zero crossing between samples.
37 const bool crossed = error * last_error_ <= 0.0f &&
38 std::abs(error - last_error_) < Pi_f;
39 last_error_ = error;
40 if (std::abs(error) > tolerance_ && !crossed)
41 return spin_direction_ * settle_speed_;
42 returning_ = false;
43 pid_.clean();
44 }
45 pid_.update(0.0f, error, dt);
46 return direction_ * pid_.state();
47 }
48 void reset() { returning_ = false; spin_direction_ = last_error_ = 0; pid_.clean(); }
49private:
50 utils::rad_pid pid_;
51 fp32 direction_{1}, settle_speed_{1}, tolerance_{.005f};
52 fp32 spin_direction_{}, last_error_{};
53 bool returning_{false};
54};
55
56} // namespace roboctrl::ctrl
constexpr fp32 rad_format(fp32 ang)
将角度限制到[-Pi,Pi]范围内
Definition utils.hpp:99
通用 PID 控制器实现。
统一的参数封装,方便序列化。
Definition pid.h:36
PID 控制器基础模板。
Definition pid.h:22
void clean()
清空积分项、误差缓存与输出。
Definition pid.h:106
T state() const
获取最新的控制输出。
Definition pid.h:116
void update(T current, T dt)
根据当前值和采样周期更新 PID 输出。
Definition pid.h:67
常用数值与字节工具集合。
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。
Definition utils.hpp:34
float fp32
单精度浮点别名。
Definition utils.hpp:22