第18届全国大学生智能汽车竞赛四轮车开源讲解【11】--零散的建议
本章对对智能车一些其他小事进行了分享。包括但不限于软件代码规范,元素状态机,图传,赛道设计布置等细节方面。也附上了十四届至十八届省赛,国赛赛道设计规范,以及赛道实际图。以及14-18届比赛的技术报告。希望大家能够从细节入手,顺利调车。
开源汇总写在下面
第18届全国大学生智能汽车竞赛四轮车开源讲解_Joshua.X的博客-CSDN博客
开源链接写在下面
https://gitee.com/joshua_xu/the-18th-smartcarhttps://gitee.com/joshua_xu/the-18th-smartcar
一、软件
1.状态机
状态机机制是很有用的一种软件设计。
我在代码中基本每个元素都使用了状态机。比如环岛9个状态的转换;坡道的上坡,坡中,下坡;横断的打角,反打脚,自动控制,回归正常;甚至整车发车过程,出库打角,充电,充电完成后正常寻迹,看到斑马线停车。
整个车模运行过程其实就是一个大状态机,在这个大状态机种又套着元素状态机。
这样有个好处,可以做到元素互斥。我可以清楚的知道当前是什么元素,是什么状态,即将进入什么状态,需要什么条件。也可以根据元素进行特殊的控制方式,比如减速,更换pd系数。
状态机更新条件一般是定时器计时,编码器积分,陀螺仪积分
参考代码在下面。
//横断路障处理区
//下面这段代码位于50ms中断中
if(Barricade_Flag!=0)
{
if(Barricade_Flag==1)
{
count_50ms=0;
encoder_accu=0;//清干净,为后续积分准备
Barricade_Flag=2;
}
else if(Barricade_Flag==2)//2状态向右打角,同时计时
{
count_50ms++;//计算时间
if(count_50ms>=5)//打角计时和积分都可以,看自己选择
{
count_50ms=0;
Barricade_Flag=3;
}
}
else if(Barricade_Flag==3)
{
count_50ms++;
//encoder_accu+=Speed_Right_Real;
if(count_50ms>=10)
{
count_50ms=0;
Barricade_Flag=4;
}
}
else if(Barricade_Flag==4)//4自由寻迹归正
{
encoder_accu+=Speed_Right_Real;
if(encoder_accu>=1500)
{
encoder_accu=0;
Barricade_Flag=0;
}
}
2.代码规范
做智能车是写代码,写代码就需要有良好的编程习惯。
我现在也上班了,在公司做开发,写代码都需要遵循代码规范的。包括命名规范,函数层次要求,注释规范等。
不然你的代码传下去别人无从下手,看不懂,后人就会在背后骂你(狗头)。
这里我建议各种变量尽量用结构体。建议每个元素开一个元素结构体,结构体里面再放各种使用变量,如状态,计时,积分,角点位置等,这样就不用每个.c文件开头50行全是密密麻麻的全局变量。
注释,注释更是必须的。虽然有说法说:优雅的代码不需要注释。显然大部分人没有这么优雅的能力。那就老老实实写注释,每个函数的作用,参数传递要求,包括函数数组等数据越界保护,都写清楚,能想到的问题都做个处理,mcu不差你那一点算力。不要等到出问题了,找半天找不出来bug。
3.图传
这里建议调摄像头车的各位朋友尽量记录车子跑车时候的图片,可以使用图传,sd卡等。实时记录车子的图像,有些时候靠手推车不能很好的还原当时的问题,使用图传,sd卡就可以知道车子在那时看见了什么。
要是能有pc平台能够运行车子里的代码,在电脑上查看各种变量信息就更好了。
可惜找了许多上位机,没有完全满足我要求的。各位要是有能力的话自己写一个,这对调车非常有帮助。写出来代码在仿真环境里面跑一遍,再上车跑。车上出现的问题找出实际的图像,再放回仿真里面解决问题,这对图像处理用处非常之大。
我曾经使用的是b站up主满心欢喜大佬的绉吾图传,不过现在大佬已经关闭服务器不再更新,此图传也无法使用了,在这里本人感谢大佬的图传,对我的调车有着非常大的便利。祝大佬学业有成,工作顺利。
4.UI
由于18届比赛不设置试车时间,初赛直接开始跑,如果下代码的话会比较浪费时间。
建议写个ui,将发车方向,各种速度,横断方向,pd系数,电感参数都显示在屏幕上,根据实际情况调整各种参数。把参数存到flash中,掉电不丢失。
5.程序架构层次
想好车子要实现那些功能,中断放什么东西,while放什么东西。
图像判断里面谁在前,谁在后;控制里面,谁先处理,谁在后面,前期规划的好,后期修改代码可以省很多心。
智能车主要是两个环,速度环和方向环。
速度环进行速度控制,执行机构往往是电机,控制源头为速度决策,而速度决策源于内部控制算法。
方向环进行方向控制,执行机构可能是舵机,也可能是串级PID进行电机差速控制。方向环往往来源于摄像头,电磁,声音,信标,陀螺仪等各种各样的外设,他们拿到数据,最终会给一个方向值,进行方向控制。
这里建议四轮车这样的设备,速度环,方向环输出放在定时器中,保证每次控制输出定时进行,图像处理在main中进行,因为图像处理时间不固定,有可能这次进到环岛,图像处理时间变长,不便于定时处理。
输出放在定时器中,但是速度决策,方向决策放在main中,通过若干全局变量将值传出去,速度环方向环读取各自期望值即可。
6.Debug
上班之后发现debug是真的好用,在一些地方打上断点,单步运行,分析程序情况,查看相关变量,简直不要太舒服。
大家在遇到问题的时候,可以尝试用debug试一下。看看变量都是什么情况,走了哪个if,或者进到了哪些地方。debug可以直接看代码跑到哪里去了,这里非常推荐debug。
二、硬件
因为我是做软件的,对硬件的要求就行希望软硬两个人可以相互交流。
主要交流接口位置,引脚情况,以及使用过程中各种问题。
最后就是硬件越早出板越好,这样有更长的时间进行测试。测试的越多,肯定稳定性越高。
三、赛道
1.设计规范
这里分享下我收集到的这几年的官方赛道设计图。
另外据我观察,智能车几大赛区省赛的赛道都是一样的,区别不会太大。
所以大家可以打个时间差,看看哪个赛区最早开赛,看看他们的赛道,参考价值极高。
十五届车赛

十五届赛道设计图

十五届赛道修改图

十五届赛道实际图

十五届决赛图
参考资料如下:
2020年智能车竞赛由预赛赛道拼接成决赛赛道的方案_智能车赛道拼接图-CSDN博客
十六届车赛

十六届赛道设计图

十六届实际赛道

十六届实际赛道
十六届车赛华南赛区省赛无决赛。
由于种种原因的影响,十六届车赛国赛从线下赛改为线上赛。
赛道变成各个国赛学校赛点自行设计,无统一设计。
十七届车赛
又是因为众所周知的原因,十七届省赛改成抱团组队线上赛。
组委会公布赛道,多所高校抱团组成赛点,共同使用一套场地进行比赛。

十七届赛道设计图

十七届实际赛道
十七届省赛线上赛赛道卓大说27.1米,某商家说27.8米,各位自行计算吧。
十七届国赛分为线上赛和线下赛,线上赛还是跑的上面的赛道,多跑一圈而已。
线下赛在南京工程大学,赛道设计如下:

十七届国赛设计赛道
第十七届全国大学生智能车竞赛总决赛线下赛道设计-CSDN博客
实际图我手头没存,各位去b站搜索吧。(但据我肉眼观测实际图和设计图貌似不太一样)
十八届车赛
华南是最早比赛的一个,其他赛区赛道和华南略有区别。
由于线下赛的惨烈性,完赛率极低。据我所知,各个赛区没有设置单独的决赛赛道,大家还是预赛赛道稍微修跑改一下再一次。

十八届实际赛道
十八届华南赛区决赛赛道是将横断去掉,换成一个坡道。
也就是说十八届华南决赛是有两个坡道,没有路障。

十八届国赛初赛

十八届国赛决赛
十八届国赛初赛和决赛赛道见上,看起来就就很难。
2.铺设规范
建议按照标准铺设规范来,某飞家铺设规范在下面,大家参考。
这里做一个提示,在铺设电磁线时候,白色绝缘胶不要绷的太死,不然第二天会全部崩开的。
轻轻的放在电磁线上,用手压紧就好。
反例见下图。
四、交流
智能车比赛是个很复杂的比赛,涉及到方方面面,一个学校能做到的其实有限,我希望大家合作交流。
我们在备赛期间也向附近学校进行了交流,他们也热情的接待了我们。就是这样的相互交流,互换赛道跑车可以更好的检验车子的稳定性,有问题大家可以简单的交流分析,交流设计方案设计想法。
赛场上我们是对手,赛场下我们是朋友。
五、技术报告
下面是我收集到的从第14届智能车比赛,一直到18届智能车比赛的技术报告。
大家可以自由下载,链接失效在评论区和我说即可,我看到后会及时更新的。
(2024年7月9日已更新)
链接:https://pan.baidu.com/s/19-oFlO4pTXTYNmPwDAUDQw?pwd=exql
提取码:exql
希望能够帮助到一些人。
本人菜鸡一只,各位大佬发现问题欢迎留言指出。
更多推荐
所有评论(0)