# 框架
## 总体介绍
### 机器人参数
机器人的主要选项在 [robot_typedef](../application/robot_typedef.h) 中定义。

在[robot_param](../application/robot_param.h)中导入个性化定义的每个机器人具体的物理参数，包括但不限于控制中要用到的物理参数、PID参数等等。

通过这种做法达到机器人代码通用化的目的，只需替换不同机器人的 `robot_param.h` 文件即可实现不同车型的适配。

### 模块划分
本框架主要划分为以下几个模块。
- assist 辅助模块
- chassis 底盘模块
- gimbal 云台模块
- IMU 陀螺仪模块
- referee 裁判系统模块
- robot_cmd 机器人控制模块
- shoot 射击模块
- other 其他乱七八糟的东西

### 模块控制
不同的模块由其对应的控制任务进行控制，如底盘为chassis_task，云台为gimbal_task，射击为shoot_task ... 

#### * 层级结构
每个模块都做成了三层的上中下结构，上层可以调用下层的数据和函数。防止了上下层之间循环调用造成的混乱局面。
- **上层**：task任务层\
    该层中提供freertos的任务函数接口，用来创建本模块的控制任务。同时创建各个任务执行函数的弱定义空函数，当无需用到此模块时使用。
- **中层**：任务执行层\
    该层为任务函数的实体部分，根据不同的硬件条件有不同的执行方式。需对每种硬件条件编写不同的执行代码以实现适配，并通过预编译的方式选择编译对应硬件的控制代码。
- **下层**：任务根基层\
    该层为整个模块的根基部分，定义了在不同硬件条件下都需要用到的类型、函数、变量等等。



#### * 步骤划分
每个控制任务都可以分成以下几个步骤：
1. **发布数据 (xxxPublish)**：发布本模块的数据以供其他模块使用。
2. **初始化 (xxxInit)**：在进入任务循环前先行对该任务所需要的各种参数进行初始化。
3. **获取反馈 (xxxObserver)**：获取各种传感器的反馈数据，以便接下来进行控制处理。
4. **异常处理 (xxxHandleException)**：在任务循环中遇到异常情况时如果有处理方法则进行异常处理（通常为电机失能等等），若无法处理且会造成危险的话则尝试进行报警。
5. **模式设置 (xxxSetMode)** ：设置对应模块的模式，在不同模式下模块会有不同的动作。
6. **更新目标 (xxxReference)**：更新各个目标值，作为控制的目标结果。
7. **计算控制量 (xxxConsole)**：计算出各个执行机构的控制量使得模块效果达到目标。
8. **发送控制量 (xxxSendCmd)**：将控制量发送给执行机构来执行。

> 后续内容待完善