GKD.RoboCtrl
载入中...
搜索中...
未找到
m9025.cpp
1#include "device/motor/m9025.h"
2#include "core/async.hpp"
4#include "io/base.hpp"
5#include "io/can.h"
6#include "utils/utils.hpp"
7#include <cstddef>
8#include <cstdint>
9
10using namespace roboctrl;
11using namespace roboctrl::device;
12
13constexpr fp32 _rpm_to_rad_s = 2.f * Pi_f / 60.f;
14constexpr fp32 _ecd_8192_to_rad = 2.f * Pi_f / 8192.f;
15
16M9025::M9025(const info_type& info):
17 motor_base{1ms, info.radius},
18 info_{info},
19 pid_{info.pid_params}
20{
21 roboctrl::get<io::can>(info.can_name).on_data(0x140 + info.id,[&](const details::motor_upload_pkg& pkg) -> awaitable<void>{
22 this->angle_ = _ecd_8192_to_rad * static_cast<float>(utils::make_u16(pkg.angle_h, pkg.angle_l));
23 this->angle_speed_ = _rpm_to_rad_s * static_cast<float>(utils::make_i16(pkg.speed_h, pkg.speed_l));
24 this->torque_ = utils::make_i16(pkg.current_h, pkg.speed_l);
25
26 this->pid_.update(this->angle_speed_);
27
28 std::array<std::byte,8> data;
29
30 //TODO
31
32 co_await roboctrl::get<io::can>(info_.can_name).send(0x200 + info_.id,data);
33
34 this->log_debug("angle:{}, speed:{}, torque:{}",this->angle_,this->angle_speed_,this->torque_);
35 this->tick();
36 });
37
38 roboctrl::spawn(task());
39}
40
42{
43 pid_.set_target(speed);
44 pid_.update(this->angle_speed_);
45
46 co_return;
47}
异步任务上下文组件。
基于 Linux SocketCAN 的 CAN 总线封装。
电机基础组件。
IO的基础组件。
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:151
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
设备模块
Definition base.hpp:25
void set_target(T target)
设置期望目标。
Definition pid.h:53
void update(T current)
根据当前值更新 PID 输出。
Definition pid.h:66
常用数值与字节工具集合。
constexpr auto Pi_f
单精度浮点类型的 Pi 常量。
Definition utils.hpp:34
float fp32
单精度浮点别名。
Definition utils.hpp:22