添加了can的发送超时控制,添加了所有application层的文档和注释

This commit is contained in:
NeoZng
2023-01-03 22:53:49 +08:00
parent f37d813bcd
commit 48370d4411
16 changed files with 160 additions and 40 deletions

View File

@@ -2,6 +2,49 @@
<p align='right'>neozng1@hnu.edu.cn</p>
## 通信机制
**应用之间不应该有任何包含关系,它们必须是平行工作的。**而这通过pub-sub的机制实现。module层提供了`message_center`模块,支持发布订阅者的消息订阅机制。以传统的框架为例,负责整车控制的应用和其他应用(或任务)是从属的树状结构,或不同的任务和应用之间通过全局变量传递消息(**请不要使用全局变量!**),而此框架下的不同应用是并行的关系。
如果一个应用希望获取另一个应用的数据,那么他应该**订阅**由此此应用发布的话题(事件)。一个应用要把自己希望共享的数据,注册到消息中心,即**发布**。为了区别不同的消息来源(你希望订阅谁的消息?哪一个消息?),可以通过**话题名**进行订阅。也就是说,消息中心作为第三方,管理所有的消息发布者和订阅者,它像报刊亭一样对消息进行中转,使得不同的应用之间不需要包含彼此,更不用全局变量也能共享消息。
> 更多关于发布-订阅的实现,请参考`modules/message_center`下的文档。
## robot_cmd
机器人命令模块是对整个机器人的抽象,对于单板控制整车的情况,
机器人命令模块是对整个机器人的抽象,对于单板控制整车的情况,该应用应该包含接收控制指令的模块,例如遥控器、视觉通信模块。该模块会处理接收到的控制数据,并将其转化为**具体的、定量的**控制信息,发送给其他模块。
如从遥控器获知当前右侧摇杆拨向上方则将遥控器发来的数值转化为底盘前进的速度值然后发送给其他应用。同时robot_cmd还要从其他应用获取反馈信息做出其他决策。可以将其视为整个机器人的**大脑**。
## gimbal
以步兵为例云台应用应当包含两个电机分别用于驱动yaw和pitch轴还有一个imu开发板一般放在云台上。gimbal模块会接收robot_cmd发来的控制信息云台的角度、转速等并通过电机提供的接口完成电机的参考值设定。gimbal还要把imu的数据反馈给cmd用于和视觉的通信以及云台状态的判断。
## shoot
还是以步兵为例发射应用应当包括摩擦轮电机、拨盘电机和弹舱盖。根据cmd应用发来的控制信息决定当前的发射模式单发、双发、连发弹舱盖的开合以及射速151830等。
## chassis
以步兵为例底盘应该包括4个电机。根据cmd应用发来的控制信息进行麦克纳姆轮的运动学解算从而获知四个电机需要的设定值然后调用电机提供的接口进行设定。chassis还要根据电机的反馈数据以及imu信息如果有imu的话即双板的情况云台一个底盘一个计算底盘的实际运动状态反馈给robot_cmd应用。
## lift
以工程机器人为例抬升机构应该包含用于抬升的执行单元可能是气缸、电磁阀、电机、点推杆等根据cmd发来的数据控制执行单元运行到特定的高度并进行必要的反馈。
## 双板兼容
此框架对单开发板/双开发板/多开发板的情况都提供了支持(多板一般只在工程机器人上出现,需要自己编写),目前通过条件编译实现了对单双板的切换。使用双板时,主控板在云台上,连接遥控器和上位机;副板在底盘上,负责底盘的运动控制和与裁判系统的通信。

View File

@@ -0,0 +1,19 @@
# chassis
## 工作流程
首先进行初始化,`ChasissInit()`会被`RobotInit()`调用进行裁判系统、底盘电机的初始化。如果为双板模式则还会初始化IMU并且将消息订阅者和发布者的初始化改为`CANComm`的初始化。
操作系统启动后,工作顺序为:
1. 从cmd模块获取数据如果双板则从CANComm获取
2. 判断当前控制数据的模式,如果为停止则停止所有电机
3. 根据控制数据,计算底盘的旋转速度
4. 根据控制数据中yaw电机的编码器值`angle_offset`,将控制数据映射到底盘坐标系下
5. 进行麦克纳姆轮的运动学解算,得到每个电机的设定值
6. 获取裁判系统的数据,并根据底盘功率限制对输出进行限幅
7. 由电机的反馈数据和IMU如果有计算底盘当前的真实运动速度
8. 设置底盘反馈数据,包括运动速度和裁判系统数据
9. 将反馈数据推送到消息中心如果双板则通过CANComm发送

View File

@@ -4,21 +4,43 @@
## 运行流程
运行流程可以很直观的从`RobotCMDTask()`中看出。首先通过消息订阅机制,获取其他应用的反馈信息,然后使用`CalcOffsetAngle()`计算底盘和云台的offset angle使得底盘始终获知当前的正方向接着根据当前是通过键鼠or遥控器控制调用对应的函数将控制指令量化为具体的控制信息得到控制信息之后先不急着发布而是检测重要的模块和应用是否掉线或出现异常以及遥控器是否进入紧急停止模式如果以上情况发生那么将所有的控制信息都置零即让电机和其他执行单元保持静止。最后还是通过pubsub机制把具体的控制信息发布到对应话题让其他应用获取。
运行流程可以很直观的从`RobotCMDTask()`中看出。
1. 首先通过消息订阅机制,获取其他应用的反馈信息
2. 使用`CalcOffsetAngle()`计算底盘和云台的offset angle使得底盘始终获知当前的正方向
3. 接着根据当前是通过键鼠or遥控器控制调用对应的函数将控制指令量化为具体的控制信息
4. 得到控制信息之后,先不急着发布,而是检测重要的模块和应用是否掉线或出现异常,以及遥控器是否进入紧急停止模式,如果以上情况发生,那么将所有的控制信息都置零,即让电机和其他执行单元保持静止。
5. 最后通过pubsub机制把具体的控制信息发布到对应话题让其他应用获取。若为双板则将原本要推送给底盘的信息通过CANComm进行发送。
## 外部接口
## 私有函数和变量
### 遥控器控制模式:
拨轮向下打到底进入紧急停止模式(后续改为关闭遥控器停止,利用daemon);拨轮向上打开启摩擦轮,超过一半开始发射(速度环,连发)
左侧开关:
- 上:键鼠控制
- 中:视觉控制(没有识别到目标的时候仍然可以使用遥控器控制云台)
- 下:遥控器控制
右侧开关:
- 上:弹舱开
- 中:底盘云台分离(底盘不旋转,全向移动)
- 下:底盘跟随云台
### 键鼠控制模式:
遥控器左侧开关拨到最上方,进入键鼠控制模式,此时不会响应遥控器遥感和拨轮的输入.
前后左右:WSAD
开关弹舱盖:R
小陀螺:Q
发射:鼠标左键
自瞄:鼠标右键

View File

@@ -0,0 +1,13 @@
# gimbal
## 工作流程
初始化pitch和yaw电机以及一个imu。订阅gimbal_cmd消息来自robot_cmd并发布gimbal_feed话题。
1. 从消息中心获取gimbal_cmd话题的消息
2. 根据消息中的控制模式进行模式切换,如果急停则关闭所有电机
3. 由设定的模式,进行电机反馈数据来源的切换,修改反馈数据指针,设置前馈控制数据指针等。
4. 设置反馈数据包括yaw电机的绝对角度和imu数据
5. 推送反馈数据到gimbal_feed话题下

View File

@@ -0,0 +1,15 @@
# shoot
## 工作流程
初始化3个电机和一个舵机包括发射的2个m3508拨盘的m2006和弹仓盖上的舵机双开门舵机可能要换成2个。m2006初始化时设置为速度闭环防止上电乱转。订阅shoot_cmd话题robot_cmd发布的并发布shoot_feed话题robot_cmd会订阅
1. 从shoot_cmd获取消息
2. 根据工作模式确定是否急停
3. 如果之前是单发模式或3发模式并且冷却时间没到直接结束本次任务等待下一次进入
4. 如果已经冷却完成根据发来的拨盘模式设定m2006的闭环类型和参考值
5. 根据发来的弹速数据,设定摩擦轮的参考值
6. 根据发来的弹舱数据进行开合
7. 设定反馈数据推送到shoot_feed话题