RobotHardware-UESTC/Hardware/银星机器人底盘/PiRobot-YH_Firmware v1.0/STM32/User/robot.h

121 lines
2.7 KiB
C
Raw Normal View History

2024-01-20 13:19:09 +08:00
#ifndef PIBOT_ROBOT_H_
#define PIBOT_ROBOT_H_
2024-01-23 15:06:39 +08:00
#include "stdint.h"
2024-01-20 13:19:09 +08:00
#include "dataframe.h"
#if ROBOT_MODEL == MODEL_TYPE_2WD_DIFF
#include "differential.h"
#endif
#if ROBOT_MODEL == MODEL_TYPE_3WD_OMNI
#include "omni3.h"
#endif
class MotorController;
class Encoder;
class PID;
class Transport;
class Dataframe;
class Model;
class IMU;
class Joystick;
// Robot 类继承Notify接口 实现一个对接收的消息id处理update接口中)
class Robot:public Notify
{
public:
static Robot* get() {
static Robot robot;
return &robot;
}
// 初始化
2024-01-23 15:06:39 +08:00
void Init();
2024-01-20 13:19:09 +08:00
// 检测串口数据命令
2024-01-23 15:06:39 +08:00
void CheckCommand();
2024-01-20 13:19:09 +08:00
// 运动解算
2024-01-23 15:06:39 +08:00
void DoKinmatics();
2024-01-20 13:19:09 +08:00
// 计算里程计
2024-01-23 15:06:39 +08:00
void CalcOdom();
2024-01-20 13:19:09 +08:00
//获取imu数据
2024-01-23 15:06:39 +08:00
void GetImuData();
2024-01-20 13:19:09 +08:00
// 检测joystick的按键
2024-01-23 15:06:39 +08:00
void CheckJoystick();
2024-01-20 13:19:09 +08:00
// 实现Notify接口处理 绑定的消息
virtual void update(const MESSAGE_ID id, void* data);
private:
Robot();
//初始化
void init_imu();
2024-01-23 15:06:39 +08:00
void InitJoystick();
void InitMotor();
void InitTrans();
2024-01-20 13:19:09 +08:00
private:
// 清除里程计
void clear_odom();
// 更新当前机器人的速度
2024-01-23 15:06:39 +08:00
void updateVelocity();
2024-01-20 13:19:09 +08:00
// 更新编码器值
void update_encoder_count();
// 更新设置pwm标志
void update_pwm_value();
private:
//电机控制器接口
MotorController* motor[MOTOR_COUNT];
//电机编码器接口
Encoder* encoder[MOTOR_COUNT];
// PID接口 用于电机调速
PID* pid[MOTOR_COUNT];
// 每个轮子编码器在pid时间间隔内期望变化值(根据输入速度计算得到)
float input[MOTOR_COUNT];
// 每个轮子编码器在pid时间间隔内实际变化值(根据编码器的反馈计算得到)
float feedback[MOTOR_COUNT];
// 用于通讯的接口 (uart/usb)
Transport* trans;
// 用于通讯的通讯协议接口(自定义协议)
Dataframe* frame;
// 机器人模型接口, 用于运动解算和反解算
Model* model;
// 是否进行运动计算的标志 (接收到新的速度时候更新)
bool do_kinmatics_flag;
// 是否进行设置pwm的标志 (接收到新的电机控制命令时候更新)
bool do_set_pwm_flag;
// 保存里程计信息
Odom odom;
// 上一次收到命令的时间戳 用于超时计算, 在一段时间超时后仍没收到命令后会停止电机
unsigned long last_velocity_command_time;
#if IMU_ENABLE
// imu接口
IMU* imu;
#endif
#if JOYSTICK_ENABLE
// 遥控器接口
Joystick* joystick;
#endif
};
#endif