一、概述
Chassis即底盘,ChassisTask完成了对底盘相关工作的处理。
本文档将会对Chassis的参数和函数进行详解。
二、Chassis 类
2.1 概述
该类拥有多个成员变量以及成员函数,实现了对底盘的初始化,控制,功率限制等功能。接下来将会对各变量和函数进行讲解。
Chassis是机器人运作的基础,了解该类的运作是非常有必要的。
2.2 成员变量
1、static Chassis chassis
之所以采用static(静态)关键字,是为了节省空间资源。类似于“单例模式”。用户在使用的时候,只需
(以Reset函数为例)Chassis::chassis.Reset(…)
2、ChassisMotor CMFL, CMFR, CMBL, CMBR
| 变量 | 含义 | | :—-: | :—-: | | CMFL | 前左方麦轮 | | CMFR | 前右方麦轮 | | CMBL | 后左方麦轮 | | CMBR | 后右方麦轮 |
(F->Front B->Back L->Left R->Right CM->ChassisMotor)
3、uint8_t twistState
转动状态,用于实现扭腰。
4、uint8_t lock
是否锁住底盘。若为1,则锁住底盘:底盘四个电机targetAngle恒为0。若为0则底盘电机正常运作。
5、float forwardBackVelocity
底盘前后移动的速度。
6、float leftRightVelocity
底盘左右移动的速度。
7、float rotateVelocity
底盘旋转速度。
8、PowerLimitation_t powerLimPara
功率限制相关参数的结构体。
9、PID rotate
旋转PID。
10、int8_t twistGapAngle
底盘Yaw轴和IMU(陀螺仪)Yaw轴的夹角,是底盘扭腰和陀螺的关键变量。
11、int16_t followCenter
底盘跟随的中心角度。
12、const int16_t *headDirection
底盘的朝向。
13、float angleToCenter
距离跟随中心的角度。
2.3 成员函数
1、 Reset
void Reset(const int16_t *_headDirection, CanType_e FLcan, uint16_t _FLRxID, CanType_e FRcan, uint16_t _FRRxID,
CanType_e BLcan, uint16_t _BLRxID,
CanType_e BRcan, uint16_t _BRRxID, double _reductionRate, double _kp, double _ki, double _kd,
double _pMax, double _iMax, double _dMax, double _max, double _Followkp, double _Followki, double _Followkd,
double _FollowpMax, double _FollowiMax, double _FollowdMax, double _Followmax);
Reset函数,用于初始化各参数。 分别是CAN类型,RxID,底盘电机PID参数,旋转PID参数。 inline void Reset(const int16_t *_headDirection) { headDirection = _headDirection; } 修改底盘朝向。 2、 void SetVelocity(int16_t _forwardBackVelocity, int16_t _leftRightVelocity, int16_t _rotateVelocity = 0): 设置三个方向的速度。 3、void AddVelocity(int16_t accFB, int16_t accLR):增加两个方向上的速度。参数是△v,具体请看函数实现,较简单,不赘述。 4、void ControlRotate():控制底盘旋转。 5、void ChassisDataDecoding():根据三个方向上的速度解算麦轮的角速度,详情请看麦轮的运动学方程。 6、void TwistSpin():扭腰。
void Chassis::TwistSpin() {
angleToCenter = fabs(
YAW_DIR * (followCenter - *headDirection) * 360 / 8192.0f - (float) twistGapAngle);
//这一步将计算距离底盘跟随中心的角度。
if (angleToCenter > 360) angleToCenter -= 360;//映射到0-360度。
//下面即为扭腰的实现,twistState代表不同的扭腰模式。
switch (twistState) {
case 1: {
rotateVelocity = 50;
break;
}
case 2: {
rotateVelocity = -50;
break;
}
case 3: {
switch (twistGapAngle) {
case 0: {
twistGapAngle = -CHASSIS_TWIST_ANGLE_LIMIT;
break;
}
case CHASSIS_TWIST_ANGLE_LIMIT: {
if (angleToCenter < 10)
twistGapAngle = -CHASSIS_TWIST_ANGLE_LIMIT;
break;
}
case -CHASSIS_TWIST_ANGLE_LIMIT: {
if (angleToCenter < 10)
twistGapAngle = CHASSIS_TWIST_ANGLE_LIMIT;
break;
}
}
rotateVelocity = (float) (*headDirection - followCenter) * 360 / 8192.0f - (float) twistGapAngle;
break;
}
default: {
twistGapAngle = 0;
rotateVelocity =(float) (*headDirection - followCenter) * 360 / 8192.0f - (float) twistGapAngle;
break;
}
}
}
7、void PowerLimitation():底盘功率限制。 8、void Handle():底盘的主控制函数。
void Chassis::Handle() {
ChassisDataDecoding();//麦轮转速解算;
PowerLimitation();//功率限制;
CMFL.Handle();
CMFR.Handle();
CMBL.Handle();
CMBR.Handle();//调用四个麦轮的主控制函数。
}
2.4 宏定义(查看宏定义的定义位置可以按住Ctrl+鼠标左键(Clion) 或 鼠标右键+Go to definition of …(Keil))
关于底盘跟随有这么几个宏定义,虽然不多,但是都非常重要。
1、USE_CHASSIS_FOLLOW:底盘跟随功能使能宏定义。
位于ChassisTask.h文件。
若不#define,则不会开启底盘跟随,反之则会开启。
底盘跟随即底盘滞后于云台的运动,在云台转动的时候底盘随之转动一个角度,最终使云台和底盘相对位置保持不变。
主要使用的是IMU返回的YAW轴数值,利用PID实现控制。
步兵、英雄这类兵种都会使用到云台,因而需要底盘跟随。2020赛季的工程车也装了发射云台,所以也使用了底盘跟随。
对于只有底盘的机器人,比如一般校内赛的车辆,都请将#define USE_CHASSIS_FOLLOW给注释掉,将该功能Disable。
2、#define GM_PITCH_ZERO 7020
#define GM_YAW_ZERO 2050
位于GimbalTask.h
这是云台YAW和PITCH轴的零点。其数值等同于云台正向前方时,解码器返回的angle值。(详见MotorTask说明文档)
3、#define YAW_DIR 1
#define PITCH_DIR -1
YAW与PITCH方向,鉴于YAW轴云台安装方式,其值可能会有符号变化。 三、ChassisMotor类
3.1 概述:
ChassisMotor为以底盘电机为代表的电机,其满足以下特性:
(1) 给定一个目标速度targetAngle,将会以该速度恒定地转动。使用:
ChassisMotor motor;
motor.targetAngle = constant;//constant为一个常数。
相关的实现位于MotorTask.h文件中,Handle函数主要利用PID获取电机控制量,原理较为简单,此处不再赘述。