GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
base.hpp
浏览该文件的文档.
1
6#pragma once
7
8#include <any>
9#include <array>
10#include <chrono>
11#include <concepts>
12#include <functional>
13#include <string>
14#include <string_view>
15
16#include "utils/utils.hpp"
17
18namespace roboctrl::device {
19struct motor_base;
20using namespace std::chrono_literals;
21
24public:
26 struct info_type {
28 std::string left_front_motor {"left_front_motor"};
29 std::string right_front_motor {"right_front_motor"};
30 std::string left_rear_motor {"left_rear_motor"};
31 std::string right_rear_motor {"right_rear_motor"};
32 std::chrono::steady_clock::duration control_time {1ms};
33 fp32 max_rotate_speed {1.0f};
34 // LF, RF, LR, RR; deployment profiles explicitly carry mounting signs.
35 std::array<int, 4> wheel_directions {1, -1, 1, -1};
36 };
37
38 virtual ~chassis_base() = default;
40 virtual void set_planar_velocity(vectorf) = 0;
42 virtual void set_planar_x(fp32 value) = 0;
44 virtual void set_planar_y(fp32 value) = 0;
48 virtual void set_velocity(fp32 x, fp32 y, fp32 z) {
49 set_planar_velocity({x, y});
51 }
53 virtual vectorf velocity() const = 0;
55 virtual void set_rotate_speed(fp32) = 0;
57 virtual fp32 rotate_speed() const = 0;
59 virtual void set_enabled(bool) = 0;
61 virtual std::array<motor_base*, 4> wheel_motors() const { return {}; }
62};
63
65template<typename T>
66concept chassis = std::derived_from<T, chassis_base>;
67
70public:
71 using factory = std::function<chassis_base*(const std::any&)>;
73 static bool register_type(std::string type, factory creator);
75 static chassis_base* create(std::string_view type, const std::any& info);
77 static chassis_base* current();
79 static bool init(std::string_view type, const std::any& info);
80};
81
82#ifndef ROBOCTRL_DETAIL_CAT
83#define ROBOCTRL_DETAIL_CAT_IMPL(a, b) a##b
84#define ROBOCTRL_DETAIL_CAT(a, b) ROBOCTRL_DETAIL_CAT_IMPL(a, b)
85#endif
86
87#define ROBOCTRL_REGISTER_CHASSIS(TYPE_NAME, CLASS_NAME) \
88 namespace { [[maybe_unused]] const bool ROBOCTRL_DETAIL_CAT(roboctrl_chassis_registered_, __LINE__) = [] { \
89 return ::roboctrl::device::chassis_registry::register_type( \
90 (TYPE_NAME), [](const std::any& value) -> ::roboctrl::device::chassis_base* { \
91 const auto& info = std::any_cast<const CLASS_NAME::info_type&>(value); \
92 if (!::roboctrl::get<CLASS_NAME>().init(info)) return nullptr; \
93 return &::roboctrl::get<CLASS_NAME>(); \
94 }); \
95 }(); }
96
97} // namespace roboctrl::device
底盘的统一控制接口。
Definition base.hpp:23
virtual void set_velocity(vectorf velocity)
设置平面速度,兼容旧调用点。
Definition base.hpp:46
virtual void set_velocity(fp32 x, fp32 y, fp32 z)
同时设置平移和旋转速度。
Definition base.hpp:48
virtual void set_planar_y(fp32 value)=0
单独设置平面 y 方向速度。
virtual void set_rotate_speed(fp32)=0
设置绕 z 轴的旋转速度。
virtual void set_enabled(bool)=0
启用或禁用底盘输出。
virtual void set_planar_x(fp32 value)=0
单独设置平面 x 方向速度。
virtual fp32 rotate_speed() const =0
获取当前绕 z 轴的旋转速度目标。
virtual void set_planar_velocity(vectorf)=0
设置平面速度 (x, y),单位由具体底盘约定为 m/s。
virtual vectorf velocity() const =0
获取当前平面速度目标。
virtual std::array< motor_base *, 4 > wheel_motors() const
Definition base.hpp:61
具体底盘实现的运行时工厂注册表。
Definition base.hpp:69
static bool register_type(std::string type, factory creator)
注册一个类型名及其工厂;重复类型名返回 false。
Definition base.cpp:27
static chassis_base * current()
获取当前已初始化的底盘。
Definition base.cpp:32
static chassis_base * create(std::string_view type, const std::any &info)
按类型名创建并初始化底盘。
Definition base.cpp:36
static bool init(std::string_view type, const std::any &info)
按类型名初始化当前底盘。
Definition base.cpp:47
判断类型是否实现底盘抽象。
Definition base.hpp:66
底盘初始化参数。
Definition base.hpp:26
常用数值与字节工具集合。
float fp32
单精度浮点别名。
Definition utils.hpp:22