GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
dji.h
浏览该文件的文档.
1
6#pragma once
7
8#include <chrono>
9#include <cstdint>
10#include <string>
11
12#include "base.hpp"
13#include "core/logger.h"
14#include "core/async.hpp"
15#include "utils/pid.h"
16#include "protocol.hpp"
17
18namespace roboctrl::device{
19
20class dji_motor_group;
21
25class dji_motor : public motor_base,public logable<dji_motor>{
26public:
27 enum type{
28 M2006 = 2006,
29 M3508 = 3508,
30 M6020 = 6020
31 };
32
34 static constexpr int max_device_id(type motor_type) noexcept {
35 switch (motor_type) {
36 case M2006:
37 case M3508:
38 return 8;
39 case M6020:
40 return 7;
41 }
42 return 0;
43 }
44
46 static constexpr fp32 command_current_limit(type motor_type) noexcept {
47 switch (motor_type) {
48 case M2006:
49 return 10000.0f;
50 case M3508:
51 return 16384.0f;
52 case M6020:
53 return 30000.0f;
54 }
55 return 0.0f;
56 }
57
61 struct info_type{
62 using key_type = std::string;
63 using owner_type = dji_motor;
64
65 type type_ {};
66 int id {};
67 std::string name;
68 std::string can_name;
69 fp32 radius {};
71 std::chrono::steady_clock::duration control_time {};
72 inline const std::string& key()const{return name;}
73 };
74
78 inline std::string desc() const{
79 return std::format("Dji motor {}",info_.name);
80 }
81
82 dji_motor(info_type info);
83
84 void connect();
85 void start();
86
90 awaitable<void> set(fp32 speed) override;
91 awaitable<void> set_angle_speed(fp32 speed) override;
92 awaitable<void> set_current(fp32 command) override;
93 bool supports_current_control() const override { return true; }
94 fp32 requested_current() const override { return enabled_ && target_fresh_since_enable_ && !offline() ? current_ : 0.f; }
95 fp32 max_current() const override { return std::min(info_.pid_params.max_out, command_current_limit(info_.type_)); }
96 fp32 target_angle_speed() const override { return mode_ == control_mode::linear ? pid_.target() / radius_ : pid_.target(); }
97 void set_output_scale(fp32 scale) override { output_scale_ = scale; }
98 void set_current_limit(fp32 limit) override { current_limit_ = limit; }
99 awaitable<void> task();
100 awaitable<void> enable() override { set_enabled(true); co_return; }
101 void disable() override;
102 void set_enabled(bool enabled) override;
103
104 inline int16_t current() const {
105 return motor_protocol::gated_current(current_, output_scale_, std::min(current_limit_, max_current()), enabled_ && target_fresh_since_enable_, !offline());
106 }
107private:
108 std::pair<uint16_t,uint16_t> can_pkg_id() const;
109private:
110 friend dji_motor_group;
111 info_type info_;
112 enum class control_mode { linear, angular, current };
113 control_mode mode_ {control_mode::linear};
114 fp32 current_ {0.f};
115 fp32 output_scale_ {1.f};
116 fp32 current_limit_ {std::numeric_limits<fp32>::infinity()};
117 fp32 reduction_ratio_ {1.0f};
119 bool connected_ {false};
120 bool started_ {false};
121 bool enabled_ {false};
122 bool target_fresh_since_enable_ {false};
123 std::chrono::steady_clock::time_point last_control_at_ {};
124};
125
126static_assert(multiton_info<dji_motor::info_type>);
127static_assert(motor<dji_motor>);
128
132class dji_motor_group : public logable<dji_motor_group>{
133public:
137 struct info_type{
138 using key_type = std::string;
140
141 std::string can_name;
142
143 inline const std::string& key()const{return can_name;}
144
145 static inline info_type make(std::string can_name){
146 return{.can_name = can_name};
147 }
148 };
149
154
155 void start();
156
162
167
172 inline std::string desc()const{return std::format("Dji motor group on can({})",info_.can_name);}
173
174private:
175 awaitable<void> send_command(uint16_t can_id_);
176private:
177
178 struct motor_info{
180 int id {};
181 dji_motor::type type;
182 };
183
184 std::vector<dji_motor*> motors_;
185 info_type info_;
186 bool started_ {false};
187};
188
189static_assert(multiton_info<dji_motor_group::info_type>);
190static_assert(owner<dji_motor_group>);
191
192}
异步任务上下文组件。
将同一 CAN 总线上的电机编组,一次性发送报文。
Definition dji.h:132
awaitable< void > task()
与调度器协同的任务,负责读取反馈等。
Definition dji.cpp:147
awaitable< void > flush_commands_once()
立即按当前安全门状态刷新一轮全部命令帧。
Definition dji.cpp:155
void register_motor(dji_motor *motor)
注册单个电机到分组内。
Definition dji.cpp:85
DJI 系列电机。
Definition dji.h:25
void set_enabled(bool enabled) override
Definition dji.cpp:286
awaitable< void > enable() override
Definition dji.h:100
static constexpr int max_device_id(type motor_type) noexcept
协议允许的最大设备 ID。未知型号返回 0。
Definition dji.h:34
awaitable< void > set(fp32 speed) override
设置线速度目标,单位 m/s;角速度与原始电流使用显式接口。
Definition dji.cpp:304
void disable() override
Definition dji.cpp:278
static constexpr fp32 command_current_limit(type motor_type) noexcept
DJI 电调命令字段的型号级绝对值上限。未知型号返回 0。
Definition dji.h:46
awaitable< void > set_angle_speed(fp32 speed) override
Definition dji.cpp:316
awaitable< void > set_current(fp32 command) override
Definition dji.cpp:325
std::string desc() const
描述信息,用于日志输出。
Definition dji.h:78
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
IO的基础组件。
用于日志输出的组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46
pid_base< fp32, details::linear_error > linear_pid
线性 PID 控制器。
Definition pid.h:144
通用 PID 控制器实现。
bool offline() const
判断设备是否离线
Definition base.hpp:56
电机初始化参数。
Definition dji.h:61
统一的参数封装,方便序列化。
Definition pid.h:36
float fp32
单精度浮点别名。
Definition utils.hpp:22