20using namespace std::chrono_literals;
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};
35 std::array<int, 4> wheel_directions {1, -1, 1, -1};
61 virtual std::array<motor_base*, 4>
wheel_motors()
const {
return {}; }
66concept chassis = std::derived_from<T, chassis_base>;
71 using factory = std::function<
chassis_base*(
const std::any&)>;
79 static bool init(std::string_view type,
const std::any& info);
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)
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>(); \
virtual void set_velocity(vectorf velocity)
设置平面速度,兼容旧调用点。
virtual void set_velocity(fp32 x, fp32 y, fp32 z)
同时设置平移和旋转速度。
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
static bool register_type(std::string type, factory creator)
注册一个类型名及其工厂;重复类型名返回 false。
static chassis_base * current()
获取当前已初始化的底盘。
static chassis_base * create(std::string_view type, const std::any &info)
按类型名创建并初始化底盘。
static bool init(std::string_view type, const std::any &info)
按类型名初始化当前底盘。