一、unitree SDK2的下载与安装
地址:https://github.com/unitreerobotics/unitree_sdk2
文件结构:
unitree_sdk2
---example:应用示例
---lib:静态库文件(.a)
---thirdparty:第三方头文件及库文件
---include:
---unitree:
---common:通用函数的头文件
---idl:底层服务接口的头文件
---robot:上层应用相关的头文件
二、电机控制接口与状态接口
1、电机控制接口
文件位置:unitree_sdk2/include/unitree/idl/go2/MotorCmd_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class MotorCmd_
{
private:
uint8_t mode_ = 0; //电机控制模式(Foc模式(工作模式)-> 0x01 ,stop模式(待机模式)-> 0x00。)
float q_ = 0.0f; //关节目标位置
float dq_ = 0.0f; //关节目标速度
float tau_ = 0.0f; //关节目标力矩
float kp_ = 0.0f; //关节刚度系数
float kd_ = 0.0f; //关节阻尼系数
std::array<uint32_t, 3> reserve_ = { }; //保留位
};
}
}
}
DDS话题通讯中信号类型:unitree_go::msg::dds_::MotorCmd_rt
rt表示realtime
2、电机状态接口
文件位置:unitree_sdk2/include/unitree/idl/go2/MotorState_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class MotorState_
{
private:
uint8_t mode_ = 0; //电机所处控制模式(Foc模式(工作模式)-> 0x01 ,
stop模式(待机模式)-> 0x00。)
float q_ = 0.0f; //关机反馈位置信息:默认为弧度值(可按照实际情况改为角度值),
可按照实际数值显示(弧度值范围:-7 - +7,显示3位小数)
float dq_ = 0.0f; //关节反馈速度
float ddq_ = 0.0f; //关节反馈加速度
float tau_est_ = 0.0f; //关节反馈力矩
float q_raw_ = 0.0f; //沿用的,但是目前不用
float dq_raw_ = 0.0f; //沿用的,但是目前不用
float ddq_raw_ = 0.0f; //沿用的,但是目前不用
uint8_t temperature_ = 0; //电机温度信息,可按照实际数值显示(范围:-100 - 150)
uint32_t lost_ = 0; //电机丢包信息:可按照实际数值显示(范围:0-9999999999)
std::array<uint32_t, 2> reserve_ = { }; //当前电机通信频率+电机错误标志位:
(数组:0-电机错误标志位(范围:0-255,可按照实际数值显 示), 1-当前电机通信频率(范围:0-800,可按照实际数值显示))
};
}
}
}
DDS话题通讯中信号类型:unitree_go::msg::dds_::MotorState_
三、电池控制接口与状态接口
1、电池控制接口
文件位置:unitree_sdk2/include/unitree/idl/go2/BmsCmd_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class BmsCmd_
{
private:
uint8_t off_ = 0; //关闭电池:(命令:0xA5)
std::array<uint8_t, 3> reserve_ = { }; //保留
};
}
}
}
DDS话题通讯中信号类型:unitree_go::msg::dds_::BmsCmd_
2、电池状态接口
文件位置:unitree_sdk2/include/unitree/idl/go2/BmsState_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class BmsState_
{
private:
uint8_t version_high_ = 0;
uint8_t version_low_ = 0; // version_high和version_low:组成电池版本信息。
uint8_t status_ = 0; // 显示未开启电池、唤醒事件、电池预充电中、电池正常充电中、电池正常放电中、 电池自放电中、电池存在警告、等待按键复位警告中、复位中这些状态
uint8_t soc_ = 0; //电池电量信息(1%-100%)
int32_t current_ = 0; //充放电信息(正:代表充电,负:代表放电)
uint16_t cycle_ = 0; //充电循环次数
std::array<uint8_t, 2> bq_ntc_ = { }; //电池内部两个NTC的温度(0-BAT1,1-BAT2)
std::array<uint8_t, 2> mcu_ntc_ = { }; //电池NTC数组(0-RES,1-MOS)
std::array<uint16_t, 15> cell_vol_ = { }; //单节电压
};
}
}
}
DDS话题通讯中信号类型:unitree_go::msg::dds_::BmsState_
四、传感器状态接口
1、IMU状态接口
文件位置:unitree_sdk2/include/unitree/idl/go2/IMUState_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class WirelessController_
{
private:
float lx_ = 0.0f; //获取左摇杆x数据,范围[-1.0~1.0],左右方向,+:往右,-:往左
float ly_ = 0.0f; //获取左摇杆y数据,范围[-1.0~1.0],前后方向,+:往前,-:往后
float rx_ = 0.0f; //获取右摇杆x数据,范围[-1.0~1.0], 左右方向,+:顺时针旋转,-:逆时针
float ry_ = 0.0f; //获取右摇杆y数据,范围[-1.0~1.0], 前后方向,+:低头,-:抬头
uint16_t keys_ = 0; //获取遥控器键值
};
}
}
}
DDS话题通讯中话题·名为:“rt/wirelesscontroller”,信号类型:unitree_go::msg::dds_::WirelessController_
遥控器键值和按钮之间的对应关系由以下联合体定义。将获取到的键值赋给联合体中的value变量,
再通过判断components中的成员变量是否为1,可判断对应的按键是否被按下
typedef union
{
struct
{
uint8_t R1 : 1;
uint8_t L1 : 1;
uint8_t start : 1;
uint8_t select : 1;
uint8_t R2 : 1;
uint8_t L2 : 1;
uint8_t F1 : 1;
uint8_t F2 : 1;
uint8_t A : 1;
uint8_t B : 1;
uint8_t X : 1;
uint8_t Y : 1;
uint8_t up : 1;
uint8_t right : 1;
uint8_t down : 1;
uint8_t left : 1;
} components;
uint16_t value;
} xKeySwitchUnion;
五、底层控制指令接口与状态接口
1、底层控制指令接口
文件位置:unitree_sdk2/include/unitree/idl/go2/LowCmd_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class LowCmd_
{
private:
std::array<uint8_t, 2> head_ = { }; //帧头,数据校验用(0xFE,0xEF)
//保留,目前不用。
uint8_t level_flag_ = 0;
uint8_t frame_reserve_ = 0;
std::array<uint32_t, 2> sn_ = { };
std::array<uint32_t, 2> version_ = { };
uint16_t bandwidth_ = 0;
// FR_0(髋) -> 0 , FR_1(大腿)-> 1 , FR_2(小腿)-> 2 电机控制顺序,目前只用12电机,后面保留。
// FL_0 -> 3 , FL_1 -> 4 , FL_2 -> 5
// RR_0 -> 6 , RR_1 -> 7 , RR_2 -> 8
// RL_0 -> 9 , RL_1 -> 10 , RL_2 -> 11
std::array<::unitree_go::msg::dds_::MotorCmd_, 20> motor_cmd_ = { }; //电机控制命令数据
::unitree_go::msg::dds_::BmsCmd_ bms_cmd_; //电池控制命令数据
std::array<uint8_t, 40> wireless_remote_ = { }; //保留,目前不用
std::array<uint8_t, 12> led_ = { }; //已经改为内部控制,目前不用
std::array<uint8_t, 2> fan_ = { }; //已经改为内部控制,目前不用
// &0xFE 自动充电打开 , |0x01 自动充电关闭
// &0xFD 12个电机的电源开关打开 , |0x02 12个电机的电源开关关闭
uint8_t gpio_ = 0;
uint32_t reserve_ = 0; //保留位
uint32_t crc_ = 0; //数据CRC校验用,为32crc校验用
};
}
}
}
DDS话题通讯中话题名为:“rt/lowcmd”,信号类型:unitree_go::msg::dds_::LowCmd_
2、底层状态接口
文件位置:unitree_sdk2/include/unitree/idl/go2/LowState_.hpp
namespace unitree_go
{
namespace msg
{
namespace dds_
{
class LowState_
{
private:
std::array<uint8_t, 2> head_ = { }; //帧头,数据校验用(0xFE,0xEF)。
//沿用的,但是目前不用。
uint8_t level_flag_ = 0;
uint8_t frame_reserve_ = 0;
std::array<uint32_t, 2> sn_ = { };
std::array<uint32_t, 2> version_ = { };
uint16_t bandwidth_ = 0;
::unitree_go::msg::dds_::IMUState_ imu_state_; //IMU数据信息。
// FR_0 -> 0 , FR_1 -> 1 , FR_2 -> 2 电机顺序,目前只用12电机,后面保留。
// FL_0 -> 3 , FL_1 -> 4 , FL_2 -> 5
// RR_0 -> 6 , RR_1 -> 7 , RR_2 -> 8
// RL_0 -> 9 , RL_1 -> 10 , RL_2 -> 11
std::array<::unitree_go::msg::dds_::MotorState_, 20> motor_state_ = { }; //电机总数据
::unitree_go::msg::dds_::BmsState_ bms_state_; //电池总数据
std::array<int16_t, 4> foot_force_ = { }; //足端力(范围0-4095),可按照实际数值显示。
(数组:0-FR,1-FL,2-RR, 3-RL)
std::array<int16_t, 4> foot_force_est_ = { }; //沿用的,但是目前不用。
uint32_t tick_ = 0; //1ms计时用,按照1ms递增
std::array<uint8_t, 40> wireless_remote_ = { }; //遥控器原始数据
//&0x80 - 电机 超时标志 1-超时 0-正常
//&0x40 - 小Mcu 超时标志 1-超时 0-正常
//&0x20 - 遥控器 超时标志 1-超时 0-正常
//&0x10 - 电池 超时标志 1-超时 0-正常
//&0x04 - 自动充电 自动充电状态标志 1-不充电 0-充电
//&0x02 - 板载电流错误标志 错误标志 1-板载电流异常 0-正常
//&0x01 - 运控命令超时 超时标志 1-超时 0-正常
uint8_t bit_flag_ = 0; //各个组件状态显示
float adc_reel_ = 0.0f; //卷线器电流(范围:0 - 3A)
uint8_t temperature_ntc1_ = 0; //主板中心温度值(范围:-20 - 100℃)
uint8_t temperature_ntc2_ = 0; //自动充电温度(范围:-20 - 100℃)
float power_v_ = 0.0f; //此电压值为主板电压 -> 电池电压
float power_a_ = 0.0f; //此电流值为主板电流值 -> 电机电流
std::array<uint16_t, 4> fan_frequency_ = { };//风扇转速(目前可按照实际数值显示0-10000)。
(0-左后转速 , 1-右后转速,2-前转速,单位转/分钟)
(堵转检测:3-&0x01:左后堵转 , &0x02:右后堵转,&0x04:前堵转)
uint32_t reserve_ = 0; //保留位
uint32_t crc_ = 0; //数据CRC校验用
};
}
}
}
DDS话题通讯中话题名为:“rt/loestate”,信号类型:unitree_go::msg::dds_::LowState_