提示:本文内容基于“2022年中国机器人及人工智能大赛——全地形小车设计赛”的参赛经历而作,其他年份赛题和规则可能会有变动,所以该文章只做参考,具体操作得看实际情况。
本文只做参考,若有高解,请勿喷。
如果大家有什么问题欢迎在评论区评论
前言
提示:该文章的经验分享只做参考,具体制作视具体情况而定,希望这里的某些建议不会影响到朋友们更好的想法。
一、比赛规则及注意事项
(1)每支队伍的制作器材限定为机器时代(北京)科技有限公司的“探索者”创新套件。构成机器人的机械零件、电子部件的种类不得超出“探索者”创新套件配置范围,符合条件的零部件的使用数量不限。
(2)辅助材料方面允许使用以下参与制作:打印用纸、塑料布 、透明胶带、绝缘胶带、双面胶带、魔术贴、束线带、螺丝胶、止松垫、防滑螺母。
(3)小车的机械本体、主控板、检测元器件、电机和电池等必须在“探索者”平台指定范围内选择,不能出现平台以外的元器件。
(4)气球颜色为:深红、深绿、深蓝。气球大小(宽):22cm 和 26cm 之间,气球当然越大越好,视觉识别时候更加容易。
(5)扎气球装置末端可采用细小尖锐物体。
(6)书写报告时一定注意比赛文档的要求。
(7)在实际运行过程中尽量一次跑完,重跑会扣分。
此处规则只适用于2022年“探索者”比赛,具体规则可能会每年会有变化,具体依据当年的最新规则。
二、硬件选择
提示:以下文章全部基于此次比赛规则和硬件选择,如果规则相同硬件选择不同,或者有更好的硬件搭配的朋友,可以将部分作为参考。
1.电机:tt马达的减速电机6
2.视觉:openmv1
3.主控:arduino
4.主控拓展板:big fish拓展板
5.巡线传感器:灰度传感器*4
6.电源:4V锂电(官方提供的)
7.执行机构:舵机
8.车主体:官方套件中的铝板,铝片,螺丝和螺母等
9.其他:尼龙导轮等
三、硬件设计部分
1.轮胎部分
(1)联轴器
我们自己设计了联轴器,用于连接轮胎主体和电机的轴。
(2)轮胎
我们一共使用了6个轮胎,其中前两个轮胎使用了大轮,并且相互绑定在一起,采用大轮增加轮胎半径便于爬坡和爬台阶。最后方的两个轮子当做辅助轮,用于辅助上台阶和坡道,使其在爬坡时车体有支撑。最前面的轮胎上装有履带,用于增大摩擦力。
2.传感器
(1)巡线传感器
我们采用了两组传感器,一组主要用于巡线。另一组主要用于检测是否到达台阶,放在车的前方。
在实验中我们发现当到达台阶部分时,可能由于巡线功能而导致轮胎差速,从而导致无法全速爬上台阶。故我们增加了另一个红外传感器,用于检测台阶。当然也有可能是我们总体结构设计的不够好,才导致我们又另外增加传感器。
(2)视觉传感器
视觉使用了openmv,安装在侧面,安装高度应保证可以成功识别到色卡与气球。
3.执行结构
执行机构为刺破气球的装置,一般选择用舵机来驱动机械臂,机械臂末端加上针或者刀片。
4.其他
为了使其过管道更加顺滑,我们增加了尼龙导轮。
四、代码设计部分
代码部分虽然会附带有部分代码片段,但主要为思路讲解,毕竟是一场比赛,得自己动手才有意义。
(1)Arduino部分
#include <Servo.h> //引入舵机库
#include <SoftwareSerial.h> //引入软件串口库
Servo myservo; //创建一个舵机控制对象 , 使用Servo类最多可以控制8个舵机
SoftwareSerial mySerial(12, 13); // 参数(RX, TX)//定义管脚12/13分别为RX,TX.
控制舵机转向
void servo_turn()
{
myservo.write(0); // 指定舵机转向的角度
delay(2000); // 等待2s让舵机到达指定位置
myservo.write(160); // 指定舵机转向的角度160
delay(2000); // 等待2s让舵机到达指定位置
}
用于模拟量的采集以及阈值的设置和判断
int read_da[4] = {0, 0, 0, 0};
int read_data[4] = { 0, 0, 0, 0};
void track_read()
{
read_da[0] = analogRead(gray_sensorPin[0]);
read_da[1] = analogRead(gray_sensorPin[1]);
read_da[2] = analogRead(gray_sensorPin[2]);
read_da[3] = analogRead(gray_sensorPin[3]);
for (int i = 0; i < 4; i++)
{
if (read_da[i] <= xunxian[i] && read_da[i] > xunxian1[i])//300-600
{
read_data[i] = 1;
}
else if (read_da[i] > xunxian[i] )//大于600
{
read_data[i] = 0;
}
else if (read_da[i] < xunxian1[i] )//小于300
{
read_data[i] = 2;
}
}
//Serial.println(read_data[0]);
}
之后就是一些电机使能,控制正反转以及输出pwm波等的造车基操了。
我们开始的问题就卡在巡线的传感器并不是那种带电位器的灰度传感器,而是那种模拟量输出的传感器。这种传感器的具体阈值得根据安装高度以及位置来进行实验得出。
如果使用了官方给的拓展板,上面将会有两路电机驱动的输出,可以直接驱动电机。
(2)视觉部分
主要用了颜色识别和测距。最好增加距离的检测或者是像素点面积大小的判断。避免在第一段赛道时被摄像头错误识别到。
采用串口与单片机通信,从而控制车去刺破气球。
五、代码调试部分
(1)Arduino部分代码调试
一般为灰度巡线传感器的阈值设置,需要和实际情况结合。
如果使用的是官方提供的灰度传感器的话,它有四个引脚。需要注意的是,其中有一个为模拟量的输出引脚,一般需要实验才可得。
而对于黑线的判断,也得经过实验才可得,需要注意的是需要对单片机进行上电的同时进行测量,否则由于电压的不同测出的结果将没有意义。
(2)视觉部分代码调试
一般为摄像头的阈值设置以及算法的优化来提高系统鲁棒性,具体需要和实际情况结合。
同种颜色的气球需要保证较小的色彩差别,避免由于气球颜色本身的色彩差异而导致的识别失败。同时保证要有一个较为恒定的环境光照。
六、总结
总之,这次比赛的难点在于如何用固定的配件来搭建一辆具有特定功能的车上,并且使用的部分配件未曾使用过。赛前首先得会使用openmv以及Arduino 以及配套传感器的使用。有的代码官方会给例程,就算不自己动手写,但也应该看得懂才行。在硬件的搭建方面,必须得考虑合理性以及稳定性,不要跑着跑着出现掉螺丝或者散架的情况。同时也应该考虑到跨越每一个障碍物时可能出现的情况,以将部分问题扼杀在硬件上。
如果发现文章的问题,欢迎指出。
若有疑问,欢迎在下方留言。