29 float angle_speed_ {};
42 throw std::logic_error(
"motor does not support direct current control");
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_; }
81 inline fp32 rpm()
const {
return angle_speed_ * 60.f / (2.f *
Pi_f); }
107 std::derived_from<T, motor_base> and
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>>;
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;
136 controller_type controller;
141 typename controller_type::params_type controller_params;
146 controlled_motor(
const motor_key_type& name,
const typename controller_type::params_type& controller_params):
147 name{name},controller{controller_params}{}
155 controller.update(state);
156 co_await roboctrl::get<motor_type>(name).set(controller.state());
164 inline motor_type&
motor()
const {
return roboctrl::get<motor_type>(name); }
207template<motor motor_type>
209 co_await roboctrl::get<motor_type>(key).set(value);
215enum class dir :
int {
asio::awaitable< T > awaitable
协程任务类型。
awaitable< void > set_motor(const typename motor_type::info_type::key_type &key, fp32 value)
设置电机目标状态
fp32 angle_speed() const
获取电机角速度(单位为rad/s)
fp32 linear_speed() const
获取电机线速度(单位为m/s)
fp32 torque() const
获取电机扭矩(单位为A)
fp32 angle() const
获取电机角度(单位为rad)
motor_type & motor() const
获取电机对象
awaitable< void > set(float state)
设置电机目标状态
virtual awaitable< void > enable()=0
virtual bool faulted() const
virtual awaitable< void > set_angle_speed(fp32 target)
virtual awaitable< void > set_current(fp32)
motor_base(const std::chrono::nanoseconds offline_timeout, fp32 radius)
virtual void set_enabled(bool enabled)
fp32 linear_speed() const
获取电机线速度(单位为m/s)
virtual awaitable< void > set(fp32 target)=0
fp32 angle_speed() const
获取电机角速度(单位为rad/s)
fp32 torque() const
获取驱动定义的反馈:DJI/M9025 原始电流计数,J6006 为 Nm。
fp32 angle() const
获取电机角度(单位为rad)
fp32 rpm() const
获取电机转速(单位为rpm)
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。