GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
gkd_sentry_gimbal.hpp
1#pragma once
2
3#include <algorithm>
4#include <chrono>
5#include <string>
6
8#include "device/gimbal/feedback.hpp"
10#include "device/imu/base.hpp"
11#include "utils/pid.h"
12
13namespace roboctrl::device {
14
16class gkd_sentry_gimbal final : public gimbal_base, public logable<gkd_sentry_gimbal> {
17public:
18 gkd_sentry_gimbal() = default;
20 bool init(const info_type&);
25 void start() override;
26 std::string desc() const { return "GKD IMU gimbal " + info_.yaw_motor_key; }
27 awaitable<void> task();
28 fp32 yaw() const override { return measured_yaw_; }
29 fp32 pitch() const override { return measured_pitch_; }
30 fp32 yaw_rate() const override { return yaw_rate_; }
31 fp32 target_yaw() const override { return yaw_target_; }
32 fp32 target_pitch() const override { return pitch_target_; }
33 fp32 relative_yaw() const override { return relative_yaw_; }
34 bool relative_yaw_valid() const override { return online_ && info_.yaw_zero_calibrated; }
35 bool online() const override { return online_; }
36 bool initialized() const override { return initialized_ && online_; }
37 void set_target_yaw(fp32 v) override { if (std::isfinite(v)) yaw_target_ = utils::rad_format(v); }
38 void add_yaw(fp32 v) override { set_target_yaw(yaw_target_ + v); }
39 void set_target_pitch(fp32 v) override {
40 if (std::isfinite(v)) pitch_target_ = std::clamp(v, info_.pitch_min, info_.pitch_max);
41 }
42 void add_pitch(fp32 v) override { set_target_pitch(pitch_target_ + v); }
43 void set_enabled(bool v) override;
44 void set_recentering(bool v) override;
45 void hold() override;
46
47private:
48 void reset_controllers();
49 info_type info_;
50 fp32 yaw_target_{}, pitch_target_{}, measured_yaw_{}, measured_pitch_{};
51 fp32 relative_yaw_{}, yaw_rate_{};
52 bool targets_initialized_{false}, initialized_{false}, enabled_{false};
53 bool recentering_{false}, online_{false}, started_{false};
54 bool drive_fault_latched_{false};
55 gimbal_settle settle_;
56 utils::rad_pid yaw_angle_pid_{}, pitch_angle_pid_{}, yaw_relative_pid_{};
57 utils::linear_pid yaw_rate_pid_{}, pitch_rate_pid_{};
58 imu_base* imu_{nullptr};
59 motor_base* yaw_motor_{nullptr};
60 motor_base* pitch_motor_{nullptr};
61};
62
63static_assert(gimbal<gkd_sentry_gimbal>);
64
65} // namespace roboctrl::device
云台的统一姿态目标接口。
Definition base.hpp:22
void add_pitch(fp32 v) override
增加 pitch 目标量,单位 rad。
void set_enabled(bool v) override
启用或禁用云台输出。
void set_target_yaw(fp32 v) override
设置 yaw 绝对目标,单位 rad。
fp32 pitch() const override
获取当前 pitch 姿态,单位 rad。
void set_target_pitch(fp32 v) override
设置 pitch 绝对目标,单位 rad。
fp32 yaw() const override
获取当前 yaw 姿态,单位 rad。
void add_yaw(fp32 v) override
增加 yaw 目标量,单位 rad。
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
云台抽象接口与运行时注册表。
IMU 抽象基类。
电机基础组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46
auto init(const info_type &info) -> bool
初始化多例实例或单例实例
Definition multiton.hpp:252
constexpr fp32 rad_format(fp32 ang)
将角度限制到[-Pi,Pi]范围内
Definition utils.hpp:99
pid_base< fp32, details::linear_error > linear_pid
线性 PID 控制器。
Definition pid.h:144
pid_base< fp32, details::rad_error > rad_pid
角度 PID 控制器。
Definition pid.h:146
通用 PID 控制器实现。
云台初始化参数,包括 IMU、电机和角度限制。
Definition base.hpp:25
IMU 基类,封装常见数据通道。
Definition base.hpp:36
float fp32
单精度浮点别名。
Definition utils.hpp:22