智能车学习日记【一】——让小车跑正方形赛道

  • 目录
    • 开篇
    • 舵机
    • 赛道图像处理
    • 图像处理
    • 代码![在这里插入图片描述](https://img-blog.csdnimg.cn/9ec0eb76bd8941a380e4b34b443c0809.png#pic_center)
    • 图像处理控制舵机打角
    • 最后亿点

目录

开篇

    博主最近开始学智能车,开始时遇到了很多困难。我觉得这些问题应该也
是每一个智能车人开始都可能会遇到的,写下来分享一下,也顺便巩固一下自
身所学。如果有错误或可以改进的地方还希望多多指出交流~。

这是博主的第一篇文章,如果觉得有帮助还希望点赞收藏支持一下~

舵机

      首先要说说舵机,舵机是让小车车跑好的一大重要因素,网上有很多有关不同种类舵机的详细原理和使用。这里我就简单说说
  1. 舵机的作用是控制智能车轮子转向。通过输入不同的脉冲信号来使舵机有不同大小的打角,比如你输入的pwm等于750时舵机打角位于中间,则小车直走,大于750时舵机打角偏向右边,则小车左转。
  2. 通过处理图像中线位置来给舵机输入对应脉冲信号来控制打角。先对你摄像头拍到的图像进行图像处理(摄像头原理在这不过多解释,后面会大致讲一下简单的图像处理)。比如你的屏幕中线的x坐标为50,而你图像处理后得到的中线x坐标为70,说明你的车偏右了(这里要注意我的坐标系零点是屏幕右下角),要让车左走回正,这时你就要输入对应的脉冲信号,让舵机控制车子向左转。
  3. 在写对舵机的控制前请一定要让舵机摆正!先写固定的脉冲信号让舵机打一个固定角度,然后轻推小车,小车能沿直线走,就说明摆正了,再进行之后的调试。

赛道图像处理

怎么处理赛道应该是难点之一了,这里博主只介绍直道和90°弯道,其他的可能有后续更新吧。

图像处理

 智能车(摄像头)的图像处理主要就是识别出左右边线(一般边线是黑线,外边是蓝布,中间赛道是白色),然后拟合出中线,让车子沿着中线跑。

这里我推荐新手使用左右寻线法来拟合中线,至于为什么不用八邻域法我只能说,新手阶段不需要贪那运算速度,左右寻线法写起来容易理解,能跑完赛道最重要,优化算法是之后的事情了。

代码

middle是存放中线x坐标的数组
left是存放左边线x坐标的数组
right是存放右边线x坐标的数组
Pixels是像素坐标数组,由摄像头读出并处理生成
pixels为1是白,为0是黑,屏幕x坐标是从0到185

这里放一个我判断左边界的部分代码,首先第0行是从中间开始往左右扫线,比如我这个第0行应该从x=93开始左右扫线 (那我这里为什么是从middle[y-1]开始呢,因为我这是从第1行开始的,我第一行中间起始点是用第0行的中线,第二行中间起始点是用第一行的中线坐标,以此类推) 。以找左边线为例子,右边线类似。从中间起始点开始向左边扫描,如果扫描到白黑黑的部分,则认定为找到左边线,将左边线记录下来。右边线也是找到白黑黑的组合,记录下左右边线。中线就是左右边线之和除2。
至于我为什么还有个x==184的条件,其实这是用在弯道处,
这是我将弯道图片上传到上位机后得到的图像,左边是原图,右边是图像处理以后的。可以发现有时左边一直到屏幕边界都还是白色,所以我让左扫描到最左边时,将x=184作为了左边界(其实还有更好的处理的方式,但这里只是介绍给新手们最基本的)。右边同理有个x == 0的边界判断。

小贴士

  1. 第一帧图像的第0行中间起始点可以选屏幕中间点,因为发车都是直道发车,一般不存在第0行中间像素点为黑的情况。之后每一行中间起始点都是前一行的中点(这样可以防止拐弯时中线丢失)。此后第二帧开始,第0行的中间起始点就选择上一帧的第2行的中点(选第几行按照自己情况而定),这样做其实也是在防止拐弯时中线丢失(中线丢失是什么情况还是希望大家可以自己去尝试一下,有时会发现拐弯到一半车子突然直行,只有自己经历过才能更好理解这些方法)
  2. 做好赛道类型判断。通过你处理后得到的中线趋势来判断现在是直道还是弯道
// 赛道类型判断int i;float sum1 = 0;float sum2 = 0;for(i=0 ; i<20 ; i++){sum2 += (94-middle[i])*(94-middle[i]);sum1 += (94-middle[i]);}if(sqrt(sum2)/20 > 3.2 || sum1/20 > 18.5 || sum1 < -18.5){choose = 1;                     //弯道}else{choose = 0;                     //直道}

我这里通过图像中线和屏幕中线的方差和平均值来判断赛道类型,这么做有什么好处呢?有时你会发现,走直道时车一直在左右摇摆,就有可能你没有分类赛道,直道和弯道用的同一个PID算法,这会导致直道有点歪时小车想打角来走直线,却用的是弯道的打角,导致打角太大了,就会一直左右摇摆。以后写什么小弯道啊,环岛的也是要判断的。
下面是我直道的PD算法,直道的PD给的就很小,因为就是微调,弯道的PD要给大一点(要问为什么不写i,因为我之前忘记写了…)

float kp1 = 0.2;
float kd1 = 0.4;
void zhidao()
{float cha=0;cha = 94 - middle[17];                //与中线差值duty = (int)(780 - kp1*cha - kd1*(cha - last));if(duty>840){duty = 840;}if(duty<700){duty = 700;}//    systick_delay_ms(STM0,20);pwm_duty(ATOM0_CH6_P02_6,duty);pwm_duty(ATOM1_CH4_P22_3,duty_car_z);pwm_duty(ATOM1_CH0_P22_1,0);pwm_duty(ATOM1_CH6_P23_1,0);pwm_duty(ATOM2_CH5_P33_13,duty_car_z);
}

图像处理控制舵机打角

其实控制舵机打角也是上边的代码

上位机直道图

    float cha=0;cha = 94 - middle[17];                //与中线差值duty = (int)(780 - kp1*cha - kd1*(cha - last));......pwm_duty(ATOM0_CH6_P02_6,duty);

这里的duty就是我输出给舵机的脉冲信号,来控制小车在直道时的打角

cha是屏幕中线和第17行中线的差值,用于下面的计算
last是上一次的cha值
这个第17行是根据你摄像头高度来选择的,有很多种方式取这个值

最后亿点

小车最开始调试时,可以给直道和弯道不同的PWM,弯道可以慢速点过,保证平滑,
直道再加速。这里面有很多门道的,博主也在慢慢摸索。
新手想要车能跑正方形赛道,最难的应该是图像处理部分了,这部分我其实主要在
讲一些问题,原理性的可能不太详细,因为这是第一次写博客,很多想法很难表达
出来,大家可以先收藏,然后看看网上左右寻线详细原理,等到写上车后发现问题,
再来看应该会更多体会与帮助。

我也是刚刚开始的智能车小白,希望大家能一起互帮互助,一起进步!如果觉得有帮助,还希望点赞收藏多多支持一下~

最后有一句话分享给大家和我自己:如果你的车没有撞过,就说明速度还不够快!加油智能车人!

————————————————————————————————
22年10月29号更新的一点小鼓励:
如果你是从这篇文章开始看的相信你也是刚刚接触智能车(如果是大佬回顾新手村就当我没说过这句话)。回顾我这一年的智能车经历,我觉得智能车竞赛和别的竞赛最大的区别在于周期更长,细节更多。给大家分享一下我的经历和感受
有一张图很生动

智能车最重要的是学会解决问题的能力,剩下就坚持和经验加上好心态了。我是大一的暑假第一次接触到智能车,也就是第一次发这篇文章的时候,到大二的8月底,刚刚好一年的时间,我拿到了浙江省赛第二名和国赛第六名。很多人觉得这个比赛靠的是传承,这个我并不否认,如果有完美的传承对于这个比赛确实优势巨大,但真正能把一套好的模板传下去的学校真的很少。学长传给我的更多是经验,这个问题大概是什么原因怎么解决,比赛时要怎么安排等等。虽然代码是留了下来,但实际上学弟都懒得看学长的代码。我们的所有控制、图像代码都是自己一点点敲出来的,很多问题都要靠自己慢慢去研究解决才能积累经验。
很多时候吃饭前车子跑的飞快,饭后车子就寄了等情况层出不穷。

甚至卓老师可能还会临时变一下卦

还有就是态度端正,心态要好。每个人都会遇到很多玄学问题,不能指望别人能给你所有的完美的解决方案,更多时候需要自己去研究。很喜欢我队友在准备国赛期间说的话:”我每次睡觉前都把视频看个几遍(赛前b站有很多快车发视频和省赛的冠军车视频)“。提速阶段的优化就是看到别人的车跑的很好,再回过来思考我要怎么往他的方向去靠。

省赛的初赛我抽到了第四个(一共51队)出场,基础四轮组的友友肯定知道越早出场的劣势越大,线下的很多因素都是未知的,前面出场的就是给后面出场的擦干净赛道,试试看赛道哪里的反光比较严重,而且决赛出场顺序是根据初赛排名的倒序出场,要是初赛慢了相当于第二天决赛又是上去给别人试一个新赛道。当时心里多少有点难过的,但难过归难过,还是调整好心态规划好比赛时遇到不同状况该怎么解决。最终也是侥幸初赛拿下了第五名,第二天决赛第二名。

这里放一下我省赛初赛第一次完赛的保命参数视频: 清理手机内存之十七届智能车浙江省赛保命参数

国赛准备期间的不到一个月时间里我们更换了摄像头类型和摄像头高度。没有搞错,这么紧的时间里我们直接改了最重要的摄像头部分,当时省赛期间与其他队伍的交流里发现了我们摄像头的安装和使用有很大的缺陷,这导致我们遇到更多玄学问题,上限也被限制了。于是省赛结束后几天,我们毅然决定拆除旧车直接修改摄像头(虽然直接用旧车去国赛大概率也是国一,但想冲更远一点吧)。现在也挺佩服当时破釜沉舟的决定的,换一个摄像头类型和高度以后看到的图像和以前的完全不一样,甚至开始连正入十字都补不好,控制更是shit一样,但既然把省赛旧车拆了,退路都没给自己留,还是对我们积累了一年的能力抱有很大信心的。玩智能车最不能缺的就是重头再来的勇气。

国赛抽签也很有意思,引导员发一个红包,抢的金额越大明天越早出场,我顿时来劲了,想我这几乎没当过运气王的霉运终于是派上用场了。结果小抽0.24元砍下运气王称号,群友:好耶我不是运气王,我:焯!(赛前传的是场地光线很差,斑马线都看不见的那种,所以当抽到第一时心态确实发生了点变化,甚至在回顾今年我有没有做大缺德的事让我抽到第四和第一)。不过还好也是很快接受事实,和队友商议好明天上场要怎么怎么做,摄像头要怎么调,把每个细节都想清楚。唯一没考虑到的可能就是最后加速冲刺时刻车坏了,跑不直了,也幸好凭借之前的优势拿下国一。
所以现在在调车的你遇到困难请不要慌,摆正心态,努力解决,肯定有很好的收获,毕竟指导思想就是鼓励探索,追求卓晴越嘛。等你拼命解决完遇到的所有问题以后来到国赛现场,相信你不会再只羡慕别人拿国一的风景,而是能感动于自己的拼命努力迎来的落幕

智能车学习日记【一】——让小车跑正方形赛道(摄像头图像处理赛道)相关推荐

  1. 智能车学习日记【四】————环岛

    智能车学习日记[四]----环岛 文章目录 智能车学习日记[四]----环岛 前言 一.环岛分状态(以左环岛为例) 二.每个状态思路 状态1和状态2: 状态3: 状态4: 状态5: 状态6: 状态7: ...

  2. 智能车学习日记【二】————十字和斜入十字

    智能车学习日记[二]----十字和斜入十字 文章目录 智能车学习日记[二]----十字和斜入十字 前言 一.普通十字补线 二.斜入十字 1.判断是否为斜入十字和斜入十字类型 2.找斜入十字拐点 总结 ...

  3. 智能车学习日记【五】——————坡道和弯接坡道

    文章目录 前言 一.坡道的判别 二.直道接坡道 1.上坡 2.位于坡道上 3.下坡 三.弯接坡道 总结 前言 这里记录一下坡道的写法和思路.博主的坡道处理是纯图像处理,没有使用陀螺仪等其他硬件设备进行 ...

  4. 智能车学习日记(三)PIT_demo

    pit是定时器中断,每经过一段规定的时间发生中断,其中中断服务函数写在isr.c文件中,中断优先级规定写在isr_config.h中 zf_ccu6_pit.c //----------------- ...

  5. 智能车学习笔记(摄像头组)——基础扫线

    今年第一次搞智能车,刚刚上大一,一切都是摸索着来,趁着放假了就把自己学会的东西梳理一下.第一次写的比较乱,欢迎各位一起学习(我亲爱的队友要加倍努力哈,这几天嗓子疼,不能腾讯会议给你讲了,专门给你写的) ...

  6. 基于ROS+镭神激光雷达+amcl定位、导航的智能车学习记录

    目录 一.背景 二. 难点之避障学习 三.比赛实参 一.背景 背景 目前大火的智能车.机器人.无人驾驶技术,现基于嵌入式系统.人工智能.机器人定位与导航基础 开展了第十四届全国大学生智能汽车竞赛-室外 ...

  7. 【智能车学习】电磁循迹中的基本控制算法

    文章目录 前言 采样信号滤波 什么是滤波 常见的软件滤波办法 限幅法 算术平均值滤波 归一化 什么是归一化 归一化的代码实现 PID控制 什么是PID控制 PID算法的代码实现 舵机控制 电机控制 目 ...

  8. 智能车复工日记【7】:关于会车的图像问题

    2022.3.10新增订阅通知 近期把此专栏设置为了付费模式,可以直接花9.9买这个专栏,买了就可以直接这个专栏的所有文章了.后续也会更新一些经验贴.也可以进交流群咨询群中大佬问题,查看相关代码以及资 ...

  9. 智能车复工日记【6】:有bug的模糊PID记录

    目录 2022.3.10新增订阅通知 系列文章 DYY Warning 算法参考链接: 代码 .c文件 .h文件 调用方法 希望有大佬能帮我指正错误之处.以后假如有机会的话再搞这个模糊吧,头疼!!! ...

最新文章

  1. Windows LTSC、LTSB、Server 安装 Windows Store 应用商店
  2. Springboot,SSM框架比较,区别
  3. M2 Scrum 12.08
  4. 视频云的全景蓝图,想象力的允诺之地
  5. 第三篇——第二部分——第一文 SQL Server镜像简介
  6. Angular安装教程
  7. linux exit 流程,Shell exit流程控制语句及用法
  8. 开源2D图形库/图形框架
  9. 教你彻底卸载Ubuntu双系统,去污不残留
  10. 编译原理完整学习笔记(八):目标代码生成
  11. David Marr-《视觉计算理论》-思想总结
  12. 睡眠监测目前的原理分析
  13. Vue项目上线的基本流程
  14. matlab带未知数的劳斯判据,自动控制原理实验用Matlab软件编制劳斯判据程序并解题(《学习辅导》例4.3.5)...
  15. Python: PS 滤镜--碎片特效
  16. hacker 入门指南
  17. java word设置纸张a3,Word中进行设置A3文档纸张大小的操作技巧
  18. 【转】密钥管理服务(KMS)
  19. 百度推广——搜索营销新视角
  20. 计算机网络故障与维护方法,试论计算机网络故障处理及维护方法

热门文章

  1. matlab版吴恩达机器学习第五章笔记
  2. index.php 首页,更改首页默认index.php改成index.html的方法
  3. Ubuntu上qtcreator的arm-poky-linux-gnueabi-配置
  4. 计算机毕业大学生如何解决难就业问题?
  5. CentOS 7 常用软件安装汇总
  6. 《Python编程:从入门到实践》读书笔记——第6章:字典
  7. PTA 7-194 循环结构 —— 中国古代著名算题。趣味题目:物不知其数。
  8. UNREAL4 PROPERTY SYSTEM
  9. repo仓库管理工具介绍
  10. 圣诞的荒诞小故事并记录互联网协议-五层模型