GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
base.hpp
浏览该文件的文档.
1
12#pragma once
13#include <cstddef>
14#include <type_traits>
15#include <stdexcept>
16
17#include "core/async.hpp"
18#include "core/logger.h"
19#include "core/multiton.hpp"
20#include "device/base.hpp"
21#include "utils/controller.hpp"
22#include "utils/utils.hpp"
23
24namespace roboctrl::device{
25
26struct motor_base : public device_base {
27protected:
28 float angle_ {}; //rad
29 float angle_speed_ {}; //rad/s
30 float torque_ {}; // Driver-defined raw current counts or torque Nm; see motor-protocols.md.
31 float radius_ {}; // m
32
33public:
34 virtual ~motor_base() = default;
35
37 virtual awaitable<void> set(fp32 target) = 0;
39 virtual awaitable<void> set_angle_speed(fp32 target) { co_await set(target * radius_); }
42 throw std::logic_error("motor does not support direct current control");
43 co_return;
44 }
45 virtual bool supports_current_control() const { return false; }
47 virtual bool faulted() const { return false; }
48 virtual fp32 requested_current() const { return 0.f; }
49 virtual fp32 current_feedback_raw() const { return torque_; }
50 virtual fp32 max_current() const { return 0.f; }
51 virtual fp32 target_angle_speed() const { return 0.f; }
52 virtual void set_output_scale(fp32) {}
53 virtual void set_current_limit(fp32) {}
54 fp32 radius() const { return radius_; }
56 virtual awaitable<void> enable() = 0;
58 virtual void disable() {}
60 virtual void set_enabled(bool enabled) { if (!enabled) disable(); }
61
67 inline fp32 angle() const { return angle_; }
68
74 inline fp32 angle_speed() const { return angle_speed_; }
75
81 inline fp32 rpm() const { return angle_speed_ * 60.f / (2.f * Pi_f); }
82
88 inline fp32 torque() const { return torque_; }
89
95 inline fp32 linear_speed() const { return angle_speed_ * radius_; }
96
101 inline explicit motor_base(const std::chrono::nanoseconds offline_timeout,fp32 radius) : device_base{offline_timeout},radius_{radius}{}
102};
103
104template <typename T>
105concept motor =
106 owner<T> and
107 std::derived_from<T, motor_base> and
108 requires(T t) {
109 { t.set(std::declval<float>()) } -> std::same_as<awaitable<void>>;
110 { t.enable() } -> std::same_as<awaitable<void>>;
111 { t.task() } -> std::same_as<awaitable<void>>;
112 };
113
114
130template<motor motor_type,utils::controller controller_type>
131requires (std::is_convertible_v<float, typename controller_type::input_type> &&
132 std::is_convertible_v<typename controller_type::state_type, float >)
134 using motor_key_type = typename motor_type::info_type::key_type;
135
136 controller_type controller;
137 motor_key_type name;
138
140 motor_key_type key;
141 typename controller_type::params_type controller_params;
142 };
143
144 controlled_motor() = default;
145
146 controlled_motor(const motor_key_type& name,const typename controller_type::params_type& controller_params):
147 name{name},controller{controller_params}{}
148
154 awaitable<void> set(float state){
155 controller.update(state);
156 co_await roboctrl::get<motor_type>(name).set(controller.state());
157 }
158
164 inline motor_type& motor() const {return roboctrl::get<motor_type>(name); }
165
171 inline fp32 angle() const { return motor().angle(); }
172
178 inline fp32 angle_speed() const { return motor().angle_speed(); }
179
185 inline fp32 torque() const { return motor().torque(); }
186
192 inline fp32 linear_speed() const { return motor().linear_speed(); }
193};
194
207template<motor motor_type>
208awaitable<void> set_motor(const typename motor_type::info_type::key_type& key ,fp32 value){
209 co_await roboctrl::get<motor_type>(key).set(value);
210}
211
212} // namespace dev
213
214namespace motor {
215enum class dir : int {
216 forward = 1,
217 reverse = -1,
218};
219
220}
异步任务上下文组件。
控制器概念与串联控制链。
设备抽象基类与通用概念。
用于日志输出的组件。
用于实现多例模式的通用组件。
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46
awaitable< void > set_motor(const typename motor_type::info_type::key_type &key, fp32 value)
设置电机目标状态
Definition base.hpp:208
被控制算法(例如PID)控制的电机
Definition base.hpp:133
fp32 angle_speed() const
获取电机角速度(单位为rad/s)
Definition base.hpp:178
fp32 linear_speed() const
获取电机线速度(单位为m/s)
Definition base.hpp:192
fp32 torque() const
获取电机扭矩(单位为A)
Definition base.hpp:185
fp32 angle() const
获取电机角度(单位为rad)
Definition base.hpp:171
motor_type & motor() const
获取电机对象
Definition base.hpp:164
awaitable< void > set(float state)
设置电机目标状态
Definition base.hpp:154
设备基础类,提供判断设备离线的基础功能
Definition base.hpp:38
virtual awaitable< void > enable()=0
virtual bool faulted() const
Definition base.hpp:47
virtual awaitable< void > set_angle_speed(fp32 target)
Definition base.hpp:39
virtual awaitable< void > set_current(fp32)
Definition base.hpp:41
motor_base(const std::chrono::nanoseconds offline_timeout, fp32 radius)
Definition base.hpp:101
virtual void set_enabled(bool enabled)
Definition base.hpp:60
fp32 linear_speed() const
获取电机线速度(单位为m/s)
Definition base.hpp:95
virtual awaitable< void > set(fp32 target)=0
virtual void disable()
Definition base.hpp:58
fp32 angle_speed() const
获取电机角速度(单位为rad/s)
Definition base.hpp:74
fp32 torque() const
获取驱动定义的反馈:DJI/M9025 原始电流计数,J6006 为 Nm。
Definition base.hpp:88
fp32 angle() const
获取电机角度(单位为rad)
Definition base.hpp:67
fp32 rpm() const
获取电机转速(单位为rpm)
Definition base.hpp:81
常用数值与字节工具集合。
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。
Definition utils.hpp:34
float fp32
单精度浮点别名。
Definition utils.hpp:22