GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
m9025.h
1#pragma once
2
3#include <chrono>
5#include "device/motor/protocol.hpp"
6#include "utils/pid.h"
7
8namespace roboctrl::device {
9
10class m9025 : public motor_base, public logable<m9025> {
11public:
12 struct info_type {
13 using key_type = std::string;
14 using owner_type = m9025;
15 std::string name;
16 std::string can_name;
17 uint16_t id {};
19 fp32 radius {};
20 std::chrono::steady_clock::duration control_time {std::chrono::milliseconds{1}};
21 std::chrono::steady_clock::duration offline_timeout {std::chrono::milliseconds{100}};
22 // Legacy configuration uses 2*pi/65535. Override for installed firmware.
23 fp32 encoder_counts_per_turn {65535.f};
24 // Explicit: legacy field name is RPM, but actual firmware units are unverified.
25 fp32 speed_rad_per_count {0.f};
26 int direction {1};
27 const std::string& key() const { return name; }
28 };
29
30 static bool valid_configuration(const info_type& info) {
31 const auto& pid = info.pid_params;
32 return !info.name.empty() && !info.can_name.empty() && info.id >= 1 && info.id <= 32
33 && std::isfinite(info.radius) && info.radius > 0.f
34 && std::isfinite(info.encoder_counts_per_turn) && info.encoder_counts_per_turn >= 1.f
35 && info.encoder_counts_per_turn <= 65536.f
36 && std::isfinite(info.speed_rad_per_count) && info.speed_rad_per_count > 0.f
37 && info.speed_rad_per_count <= std::numeric_limits<fp32>::max() / 32768.f
38 && (info.direction == 1 || info.direction == -1)
39 && info.control_time > std::chrono::steady_clock::duration::zero()
40 && info.offline_timeout >= info.control_time
41 && std::isfinite(pid.kp) && std::isfinite(pid.ki) && std::isfinite(pid.kd)
42 && std::isfinite(pid.max_out) && pid.max_out > 0.f && pid.max_out <= 32767.f
43 && std::isfinite(pid.max_iout) && pid.max_iout >= 0.f && pid.max_iout <= pid.max_out;
44 }
45 explicit m9025(const info_type& info);
46 void connect();
47 void start();
48 std::string desc() const { return std::format("M9025 motor {} on {}", info_.name, info_.can_name); }
49 awaitable<void> set(fp32 speed) override;
50 awaitable<void> set_angle_speed(fp32 speed) override;
51 awaitable<void> set_current(fp32 command) override;
52 awaitable<void> enable() override { set_enabled(true); co_return; }
53 void disable() override;
54 void set_enabled(bool enabled) override;
55 awaitable<void> task();
56 awaitable<void> stop_output();
57 bool supports_current_control() const override { return true; }
58 fp32 requested_current() const override { return enabled_ && !offline() ? current_ : 0.f; }
59 fp32 max_current() const override { return std::min(info_.pid_params.max_out, 32767.f); }
60 fp32 target_angle_speed() const override { return pid_.target(); }
61 void set_output_scale(fp32 scale) override { output_scale_ = scale; }
62 void set_current_limit(fp32 limit) override { current_limit_ = limit; }
63 int16_t current() const {
64 return motor_protocol::gated_current(current_, output_scale_, current_limit_, enabled_, !offline());
65 }
66
67private:
68 info_type info_;
70 fp32 current_ {0.f};
71 fp32 output_scale_ {1.f};
72 fp32 current_limit_ {std::numeric_limits<fp32>::infinity()};
73 bool direct_current_ {false};
74 bool connected_ {false};
75 bool started_ {false};
76 bool enabled_ {false};
77};
78
79using M9025 = m9025; // Compatibility spelling, not a parallel driver.
80static_assert(motor<m9025>);
81
82} // namespace roboctrl::device
awaitable< void > set_angle_speed(fp32 speed) override
Definition m9025.cpp:34
awaitable< void > set(fp32 speed) override
Definition m9025.cpp:32
void disable() override
Definition m9025.cpp:49
awaitable< void > enable() override
Definition m9025.h:52
void set_enabled(bool enabled) override
Definition m9025.cpp:55
awaitable< void > set_current(fp32 command) override
Definition m9025.cpp:41
用于提供日志功能的辅助基类 通过CRTP模式实现,要求派生类实现desc()方法以提供描述信息,在继承时传入派生类自身类型作为模板参数。 继承这个类后,派生类可以方便地使用log_debug、log_i...
Definition logger.h:178
电机基础组件。
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 pid.h:36
float fp32
单精度浮点别名。
Definition utils.hpp:22