2022-11-26 19:22:07 +08:00

116 lines
5.4 KiB
C++
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#ifndef UNITREEMOTOR_H
#define UNITREEMOTOR_H
#include "unitreeMotor/include/motor_msg.h" // 电机通信协议
#include "CRC/crc32.h" // CRC32校验算法
#include <stdint.h>
#include <iostream>
enum class MotorType{
A1, // 4.8M baudrate, K_W x1024
B1 // 6.0M baudrate, K_W x512
};
struct MOTOR_send{
// 定义 发送格式化数据
MasterComdDataV3 motor_send_data; //电机控制数据结构体详见motor_msg.h
MotorType motorType = MotorType::A1;
int hex_len = 34; //发送的16进制命令数组长度, 34
// long long send_time; //发送该命令的时间, 微秒(us)
// 待发送的各项数据
unsigned short id; //电机ID0xBB代表全部电机
unsigned short mode; //0:空闲, 5:开环转动, 10:闭环FOC控制
//实际给FOC的指令力矩为
//K_P*delta_Pos + K_W*delta_W + T
float T; //期望关节的输出力矩电机本身的力矩Nm
float W; //期望关节速度(电机本身的速度)(rad/s)
float Pos; //期望关节位置rad
float K_P; //关节刚度系数
float K_W; //关节速度系数
COMData32 Res; // 通讯 保留字节 用于实现别的一些通讯内容
};
struct MOTOR_recv{
// 定义 接收数据
ServoComdDataV3 motor_recv_data; //电机接收数据结构体详见motor_msg.h
MotorType motorType = MotorType::A1;
int hex_len = 78; //接收的16进制命令数组长度, 78
// long long resv_time; //接收该命令的时间, 微秒(us)
bool correct = false; //接收数据是否完整true完整false不完整
//解读得出的电机数据
unsigned char motor_id; //电机ID
unsigned char mode; //0:空闲, 5:开环转动, 10:闭环FOC控制
int Temp; //温度
unsigned char MError; //错误码
float T; // 当前实际电机输出力矩
float W; // 当前实际电机速度(高速)
float LW; // 当前实际电机速度(低速)
int Acc; // 电机转子加速度
float Pos; // 当前电机位置主控0点修正电机关节还是以编码器0点为准
float gyro[3]; // 电机驱动板6轴传感器数据
float acc[3];
};
inline void modify_data(MOTOR_send* motor_s){
motor_s->hex_len = 34;
motor_s->motor_send_data.head.start[0] = 0xFE;
motor_s->motor_send_data.head.start[1] = 0xEE;
motor_s->motor_send_data.head.motorID = motor_s->id;
motor_s->motor_send_data.head.reserved = 0x0;
motor_s->motor_send_data.Mdata.mode = motor_s->mode;
motor_s->motor_send_data.Mdata.ModifyBit = 0xFF;
motor_s->motor_send_data.Mdata.ReadBit = 0x0;
motor_s->motor_send_data.Mdata.reserved = 0x0;
motor_s->motor_send_data.Mdata.Modify.L = 0;
motor_s->motor_send_data.Mdata.T = motor_s->T*256;
motor_s->motor_send_data.Mdata.W = motor_s->W*128;
motor_s->motor_send_data.Mdata.Pos = (int)((motor_s->Pos/6.2832)*16384.0);
motor_s->motor_send_data.Mdata.K_P = motor_s->K_P*2048;
if(motor_s->motorType == MotorType::A1){
motor_s->motor_send_data.Mdata.K_W = motor_s->K_W*1024;
}
else if(motor_s->motorType == MotorType::B1){
motor_s->motor_send_data.Mdata.K_W = motor_s->K_W*512;
}
motor_s->motor_send_data.Mdata.LowHzMotorCmdIndex = 0;
motor_s->motor_send_data.Mdata.LowHzMotorCmdByte = 0;
motor_s->motor_send_data.Mdata.Res[0] = motor_s->Res;
motor_s->motor_send_data.CRCdata.u32 = crc32_core((uint32_t*)(&(motor_s->motor_send_data)), 7);
}
inline bool extract_data(MOTOR_recv* motor_r){
if(motor_r->motor_recv_data.CRCdata.u32 !=
crc32_core((uint32_t*)(&(motor_r->motor_recv_data)), 18)){
std::cout << "[WARNING] Receive data CRC error" << std::endl;
motor_r->correct = false;
return motor_r->correct;
}else{
motor_r->motor_id = motor_r->motor_recv_data.head.motorID;
motor_r->mode = motor_r->motor_recv_data.Mdata.mode;
motor_r->Temp = motor_r->motor_recv_data.Mdata.Temp;
motor_r->MError = motor_r->motor_recv_data.Mdata.MError;
motor_r->T = ((float)motor_r->motor_recv_data.Mdata.T) / 256;
motor_r->W = ((float)motor_r->motor_recv_data.Mdata.W) / 128;
motor_r->LW = motor_r->motor_recv_data.Mdata.LW;
motor_r->Acc = (int)motor_r->motor_recv_data.Mdata.Acc;
motor_r->Pos = 6.2832*((float)motor_r->motor_recv_data.Mdata.Pos) / 16384;
motor_r->gyro[0] = ((float)motor_r->motor_recv_data.Mdata.gyro[0]) * 0.00107993176;
motor_r->gyro[1] = ((float)motor_r->motor_recv_data.Mdata.gyro[1]) * 0.00107993176;
motor_r->gyro[2] = ((float)motor_r->motor_recv_data.Mdata.gyro[2]) * 0.00107993176;
motor_r->acc[0] = ((float)motor_r->motor_recv_data.Mdata.acc[0]) * 0.0023911132;
motor_r->acc[1] = ((float)motor_r->motor_recv_data.Mdata.acc[1]) * 0.0023911132;
motor_r->acc[2] = ((float)motor_r->motor_recv_data.Mdata.acc[2]) * 0.0023911132;
motor_r->correct = true;
return motor_r->correct;
}
}
#endif // UNITREEMOTOR_H