1. add thirdparty
2. add State_JointTraj protect when qState != qCmd
This commit is contained in:
Agnel Wang 2022-11-15 16:02:57 +08:00
parent 5f38f0f3de
commit 0fd1ae9b7b
10 changed files with 3 additions and 219 deletions

View File

@ -8,4 +8,5 @@
<limitT>10.0</limitT> <!-- N*M -->
<load>0.0</load><!-- kg-->
</collision>
<!-- <plot set=1/> -->
</configurartion>

View File

@ -1,214 +0,0 @@
#ifndef _UNITREE_ARM_ARM_MOTOR_COMMON_H_
#define _UNITREE_ARM_ARM_MOTOR_COMMON_H_
#include <stdint.h>
typedef int16_t q15_t;
#pragma pack(1)
// 发送用单个数据数据结构
typedef union{
int32_t L;
uint8_t u8[4];
uint16_t u16[2];
uint32_t u32;
float F;
}COMData32;
typedef struct {
// 定义 数据包头
unsigned char start[2]; // 包头
unsigned char motorID; // 电机ID 0,1,2,3 ... 0xBB 表示向所有电机广播(此时无返回)
unsigned char reserved;
}COMHead;
#pragma pack()
#pragma pack(1)
typedef struct {
uint8_t fan_d; // 关节上的散热风扇转速
uint8_t Fmusic; // 电机发声频率 /64*1000 15.625f 频率分度
uint8_t Hmusic; // 电机发声强度 推荐值4 声音强度 0.1 分度
uint8_t reserved4;
uint8_t FRGB[4]; // 足端LED
}LowHzMotorCmd;
typedef struct { // 以 4个字节一组排列 ,不然编译器会凑整
// 定义 数据
uint8_t mode; // 关节模式选择
uint8_t ModifyBit; // 电机控制参数修改位
uint8_t ReadBit; // 电机控制参数发送位
uint8_t reserved;
COMData32 Modify; // 电机参数修改 的数据
//实际给FOC的指令力矩为
//K_P*delta_Pos + K_W*delta_W + T
q15_t T; // 期望关节的输出力矩电机本身的力矩x256, 7 + 8 描述
q15_t W; // 期望关节速度 (电机本身的速度) x128, 8 + 7描述
int32_t Pos; // 期望关节位置 x 16384/6.2832, 14位编码器主控0点修正电机关节还是以编码器0点为准
q15_t K_P; // 关节刚度系数 x2048 4+11 描述
q15_t K_W; // 关节速度系数 x1024 5+10 描述
uint8_t LowHzMotorCmdIndex; // 电机低频率控制命令的索引, 0-7, 分别代表LowHzMotorCmd中的8个字节
uint8_t LowHzMotorCmdByte; // 电机低频率控制命令的字节
COMData32 Res[1]; // 通讯 保留字节 用于实现别的一些通讯内容
}MasterComdV3; // 加上数据包的包头 和CRC 34字节
typedef struct {
// 定义 电机控制命令数据包
COMHead head;
MasterComdV3 Mdata;
COMData32 CRCdata;
}MasterComdDataV3;//返回数据
// typedef struct {
// // 定义 总得485 数据包
// MasterComdData M1;
// MasterComdData M2;
// MasterComdData M3;
// }DMA485TxDataV3;
#pragma pack()
#pragma pack(1)
typedef struct { // 以 4个字节一组排列 ,不然编译器会凑整
// 定义 数据
uint8_t mode; // 当前关节模式
uint8_t ReadBit; // 电机控制参数修改 是否成功位
int8_t Temp; // 电机当前平均温度
uint8_t MError; // 电机错误 标识
COMData32 Read; // 读取的当前 电机 的控制数据
int16_t T; // 当前实际电机输出力矩 7 + 8 描述
int16_t W; // 当前实际电机速度(高速) 8 + 7 描述
float LW; // 当前实际电机速度(低速)
int16_t W2; // 当前实际关节速度(高速) 8 + 7 描述
float LW2; // 当前实际关节速度(低速)
int16_t Acc; // 电机转子加速度 15+0 描述 惯量较小
int16_t OutAcc; // 输出轴加速度 12+3 描述 惯量较大
int32_t Pos; // 当前电机位置主控0点修正电机关节还是以编码器0点为准
int32_t Pos2; // 关节编码器位置(输出编码器)
int16_t gyro[3]; // 电机驱动板6轴传感器数据
int16_t acc[3];
// 力传感器的数据
int16_t Fgyro[3]; //
int16_t Facc[3];
int16_t Fmag[3];
uint8_t Ftemp; // 8位表示的温度 7位-28~100度 1位0.5度分辨率
int16_t Force16; // 力传感器高16位数据
int8_t Force8; // 力传感器低8位数据
uint8_t FError; // 足端传感器错误标识
int8_t Res[1]; // 通讯 保留字节
}ServoComdV3; // 加上数据包的包头 和CRC 78字节4+70+4
typedef struct {
// 定义 电机控制命令数据包
COMHead head;
ServoComdV3 Mdata;
COMData32 CRCdata;
}ServoComdDataV3; //发送数据
// typedef struct {
// // 定义 总的485 接受数据包
// ServoComdDataV3 M[3];
// // uint8_t nullbyte1;
// }DMA485RxDataV3;
#pragma pack()
// 00 00 00 00 00
// 00 00 00 00 00
// 00 00 00 00 00
// 00 00 00
// 数据包默认初始化
// 主机发送的数据包
/*
Tx485Data[_FR][i].head.start[0] = 0xFE ; Tx485Data[_FR][i].head.start[1] = 0xEE; // 数据包头
Tx485Data[_FR][i].Mdata.ModifyBit = 0xFF; Tx485Data[_FR][i].Mdata.mode = 0; // 默认不修改数据 和 电机的默认工作模式
Tx485Data[_FR][i].head.motorID = i; 0 // 目标电机标号
Tx485Data[_FR][i].Mdata.T = 0.0f; // 默认目标关节输出力矩 motor1.Extra_Torque = motorRxData[1].Mdata.T*0.390625f; // N.M 转化为 N.CM IQ8描述
Tx485Data[_FR][i].Mdata.Pos = 0x7FE95C80; // 默认目标关节位置 不启用位置环 14位分辨率
Tx485Data[_FR][i].Mdata.W = 16000.0f; // 默认目标关节速度 不启用速度环 1+8+7描述 motor1.Target_Speed = motorRxData[1].Mdata.W*0.0078125f; // 单位 rad/s IQ7描述
Tx485Data[_FR][i].Mdata.K_P = (q15_t)(0.6f*(1<<11)); // 默认关节刚度系数 4+11 描述 motor1.K_Pos = ((float)motorRxData[1].Mdata.K_P)/(1<<11); // 描述刚度的通讯数据格式 4+11
Tx485Data[_FR][i].Mdata.K_W = (q15_t)(1.0f*(1<<10)); // 默认关节速度系数 5+10 描述 motor1.K_Speed = ((float)motorRxData[1].Mdata.K_W)/(1<<10); // 描述阻尼的通讯数据格式 5+10
*/
enum class MotorType{
A1Go1, // 4.8M baudrate, K_W x1024
B1 // 6.0M baudrate, K_W x512
};
struct MOTOR_send{
// 定义 发送格式化数据
MasterComdDataV3 motor_send_data; //电机控制数据结构体
MotorType motorType = MotorType::A1Go1;
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; //电机接收数据结构体
MotorType motorType = MotorType::A1Go1;
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];
int8_t Res;
};
extern void modify_data(MOTOR_send* motor_s);
extern bool extract_data(MOTOR_recv* motor_r);
#endif

View File

@ -7,7 +7,6 @@
#include <string.h>
#include <vector>
#include "common/utilities/timer.h"
#include "message/arm_motor_common.h"
enum class BlockYN{
YES,
@ -25,7 +24,6 @@ public:
virtual size_t send(uint8_t *sendMsg, size_t sendLength) = 0;
virtual size_t recv(uint8_t *recvMsg, size_t recvLength) = 0;
virtual size_t recv(uint8_t *recvMsg) = 0;
virtual bool sendRecv(std::vector<MOTOR_send> &sendVec, std::vector<MOTOR_recv> &recvVec) = 0;
void resetIO(BlockYN blockYN, size_t recvLength, size_t timeOutUs, bool showInfo = true);
bool isDisConnect = false;
protected:
@ -50,7 +48,6 @@ public:
size_t send(uint8_t *sendMsg, size_t sendMsgLength);
size_t recv(uint8_t *recvMsg, size_t recvLength);
size_t recv(uint8_t *recvMsg);
bool sendRecv(std::vector<MOTOR_send> &sendVec, std::vector<MOTOR_recv> &recvVec);
private:
size_t _recvBlock(uint8_t *recvMsg, size_t recvLength);
size_t _recvUnBlock(uint8_t *recvMsg, size_t recvLength);

View File

@ -3,7 +3,7 @@
#include <vector>
#include "common/math/robotics.h"
#include "common/math/quadProgpp/QuadProg++.hh"
#include "thirdparty/quadProgpp/QuadProg++.hh"
using namespace robo;

View File

@ -62,7 +62,7 @@ s.t.
#ifndef _QUADPROGPP
#define _QUADPROGPP
#include "common/math/quadProgpp/Array.hh"
#include "thirdparty/quadProgpp/Array.hh"
#include <eigen3/Eigen/Dense>
namespace quadprogpp {

Binary file not shown.

Binary file not shown.