写在前面
Robogame是USTC内部举办的一个很有意思的比赛,参赛队伍由学生自由组成,竞技组每年会有一个主题,围绕这一主题,参赛队伍需要在规定时间内设计出能够完赛的机器人,通过三次审核和预选赛之后便有机会参加最终的决赛。
我也有幸作为其中一支队伍的队长参加了这次比赛,虽然留下了诸多遗憾,但我希望能分享我们的参赛历程,总结我们这次参赛的亮点和不足。
机械设计思路
参赛规则
2020年的设计主题是 共抗疫情 其实就是要设计一个机器人能够识别物体然后正确转移,相对往年需要考虑动力可靠性等问题,今年的设计对动力几乎没有太高的要求,主要是需要抓取的物块大得离谱,因此抓取方式需要很好的设计。
简单来说,规则要求车子一次只能爪两个人,两个黄色小人放到放舱医院,并能正确跳过占位小黄人;红色小人抓取后放到方舱医院并盖上面罩就完赛。
听起来很简单对吧,其实真正的设计过程真的有太多太多的问题了。
主体设计
上一张设计的概念图:
想法是很美好的,用两个爪子分别抓取后收回,使用RFID识别小人身上的RFID标记,然后尽量使用云台的转移代替车体姿态的调整来减少完赛时间。
选择了很激进的放弃黑线红外循迹,单纯依靠PID对行进进行控制(最后证明虽然可以实现,但预算有限的情况下无法保证加工精度,可靠性并不理想)。
是的,也许你注意到了我们甚至还设计了减震,但最后是被取消了,同样是预算有限实在无法定制一些精细的零件,反而起到了反作用。
轮子使用的是麦克纳姆轮,事实证明在这种比赛中全向轮更为合理,因为低速状态下,小直径麦轮颠簸异常严重,没有避震情况下对电机的结构损伤很严重。
控制设计思路
识别
识别当然是最重要的了,我们同时进行了RFID和视觉识别的验证,最后是选择了视觉识别,但事实证明视觉识别受灯光影响实在是太大了,单纯的色块查找可靠性不高,特别是在舞台那种复杂的灯光条件下。如果想用视觉识别,当然一般是使用树莓派,而树莓派在对其他元件的控制,特别是PWM控制方面并不擅长,而且视觉识别占用的计算资源实在太夸张了,因此通过串口通信和一块STM32f103zet6连接,STM32负责其他模块的调用和逻辑控制,树莓派通过串口返回识别颜色就完事了。
控制
贴一段main函数代码:
#include "stm32f10x.h"
#include "PWM_set.h"
#include "delay.h"
#include "Engine_Init.h"
#include "Engine_Control.h"
#include "pushrod.h"
#include "pca9685.h"
#include "communicate.h"
> int main(void){
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
uart_init(115200);
Drive_PID_Init();
Irsensor_Init();
RFID_Init();
Encoder_Init(299, 7199);
Engine_Init(4999,71, 0);
Sterengine_Init();
ObjectSearchNode->mirror_direction = 1; //决定场地选边
Grab_Init();
Pushrod_Init();
Control_WaitStart();
Pushrod_Stop();
//等待开始
//初始化任务结构
Drive_Control(Go, 4, HighSpeed);
Control_MirrorMove(INSIDE, 3);
Drive_SetSpeed(100);
Drive_Control(Go, 25, HighSpeed);
ObjectSearchNode->IRsensor_en = 1;
//到达预抓取位置
ObjectSearchNode->line_index = 0;
//清空黑线计数器
ObjectSearchNode->vedio_en = 1;
FindYellow();
PlaceYellow();
FindRed();
如果可以的话有时间我会详细介绍一下有关函数功能和设计思路(真的遇到了超多问题QAQ)