齐护K210系列教程(三十四)_视觉PID巡线小车

视觉PID巡线小车

  • 1.前言
  • 2.简介
  • 3.代码讲解
    • 3.1初始化
    • 3.2.色块查找
    • 3.3色块分析
      • 3.3.1 区域1
      • 3.3.2 区域2
    • 3.4 侦测关键点部分
      • 3.4.1正常巡线
      • 3.4.2 右转路口
    • 3.4.3十字路口
    • 3.4. PID计算
  • 4.完整代码
  • 5.小车端程序
  • 6.参考程序
  • 联系我们

1.前言

本课程主要讲述如何使用AIstart_k210主板完成简单的PID寻线任务,并举例应用齐护小车的PID寻线图形化编程。

也可以采用 AIstart_Q1+扩展板(自带电机驱动等功能)的方式直接一个 K210主板就完成算法及电机运行,可以参考教程:【齐护人工智能小车学习套件】

原理:通过调用K210模块中现有的查找色块方法,获取偏移量和关键点(如十字路口,T字路口,起停线等)的位置数据,并将数据返回给小车进行巡线。

固件使用: firmware_2055KB.bin(齐护标准固件即可)

2.简介

通过在指定区域寻找黑色块相对于屏幕的偏移量,并对偏移量进行PID运算后,将结果通过串口发送给小车执行。
在这里插入图片描述

如上图所示,在区域1(红色框内)内检测黑色块的中心点位置相对于屏幕中心的偏移量。

在区域2(红色框内)检测黑色块,用于判断是路口状态。

3.代码讲解

3.1初始化

在这里插入图片描述

用于PID运算的变量初始化,其中Kp,Kd为比例和微分系数。

串口初始化,用于K210向小车传送信息。

LCD初始化

摄像头初始化,为了颜色更好识别,摄像头为黑白模式。

将像素模式设置为灰度灰度模式对于只有两种颜色的地图可以起到提高帧数,过滤其它颜色的影响,提高了识别的正确率。

3.2.色块查找

在这里插入图片描述

从摄像头获取图像
对图像进行色块查找,参数意义如下:
图像:要查找的图片对象。
阀值:用LAB表示的颜色阀值,因为图像是灰度的,所以其范围为0~255(黑到白)
区域:要检测的区域。
滤掉区域:面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉,减少干扰提高巡线准确度
滤掉素数:像素个数阈值,如果色块像素数量小于这个值,会被过滤掉,同上面作用相同。
合并:为边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。此参数只在检测关键点寻找色块函数中运用,可以更明确的侦测出关键点,如Y型路口。
重叠:为真时,将所有重叠的blob合并为一个。

3.3色块分析

3.3.1 区域1

在这里插入图片描述

判断是否检测到黑色色块。
对检测结果就行迭代。
结果内会返回色块的信息,如坐标,中心点等数据,使用这些数据可以在图像上标注出其位置。
将色块的中心点传送到PID计算函数就行位置计算,并得到偏移量。
将偏移发送给小车执行.

3.3.2 区域2

在这里插入图片描述

判断是否检测到黑色色块。
对检测结果就行迭代。
结果内会返回色块的信息,如坐标,中心点等数据,使用这些数据可以在图像上标注出其位置。
通过其宽度参数给于不同的判断,并将结果发送给小画执行。
将图像显示在屏幕上。

3.4 侦测关键点部分

​ 当要经过十字路口,y型路口,起停线时,可以通过判断对像的宽度值来区分。(区域2内进行分析)
在这里插入图片描述

3.4.1正常巡线

正常巡线宽度会比较小
在这里插入图片描述

3.4.2 右转路口

可以将长方体的中心坐标输出,当在屏幕左边时代表是左T型路口,在右边时侧是右T型路口。
在这里插入图片描述

3.4.3十字路口

在这里插入图片描述

​ 只需要判断色块的宽度和中心坐标就可以区别出不同的路况。

3.4. PID计算

在这里插入图片描述

  1. 声明全局变量,在函数中使用全局变量需要声明,否则会被视为局部变量。
  2. 传入的x坐标为屏中心点为0点。
  3. P项为偏差乘系数
  4. D项为与上次的偏差的差乘以系数
  5. 输出数据
    ​ 其中的 Kp 和 Kd 是巡线PID的参数没有使用到积分参数,Kd设置为0的原因是因为仅仅调节Kp时巡线就已经很稳定了,如果你的小车仅靠Kp无法达到稳定或者出现了高频振荡,请自行调节Kd。

4.完整代码

在这里插入图片描述

上传程序后测试,可以看到对应的输出数据。

在这里插入图片描述

5.小车端程序

以齐护编程小车为例,核心为ArduinoUNO 328P主控。

小车端程序主要是对串口数据进行处理,在K210端我们的18-19为串口数据输出端,对接我们小车上的A2-A3,波特率为9600要相同,TX-RX交叉连接。
在这里插入图片描述

  1. 主串口的初始化
  2. 接收信息软件串口的初始化,波特率要与K210相同。
  3. 使用的中间变量的初始化
  4. 当串口收到数据时,开始接收数据。
  5. K210发出的每条数据都带了回车,读取这一段数据。
  6. 判断收到的数据是不是偏差数据
  7. 截取有效数据并转化为整数。保存在变量内用于控制小车的速度。
  8. 如果C开头则是路口类型,K210根据实际判断结果发送对应标志,在这里进行解析。也可以将宽度发送过来,在这里进行处理。
  9. 根据偏移量计算出电机的转速。
    当偏差小于零时说明小车向右偏,需要增加左轮的速度,减小右轮的速度,反之亦然。

6.参考程序

齐护编程AIstart_k210巡线scratch

联系我们

扫码或者点这里加群了解更多!
在这里插入图片描述
Created by qdprobot

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/640283.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringMVC接收请求参数的方式:

接收简单变量的请求参数 直接使用简单变量作为形参进行接收(这里简单变量名称需要与接收的参数名称保持一致,否则需要加上RequestParam注解): 细节: 1:SpringMVC会针对常见类型(八种基本类型及…

【Crypto】一眼就解密

文章目录 前言一眼就解密解题感悟 前言 Basic写累了,写写别的 一眼就解密 一眼md5试一试 小小flag 拿下! 解题感悟 30秒搞定

Python第三方包安装与配置教程

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、Windows系统下的Python包安装 二、Linux系统下的Python包安装 三、配置Python环境 四…

打印9*9乘法表(递归或压缩矩阵)python

打印9*9表def print_multiplication_table(row, col):if row > 10:return # 递归结束条件if col row:print() # 换行print_multiplication_table(row 1, 1) # 递归调用下一行else:print(f"{row-1} * {col} {(row-1) * col}\t", end"") # 打印乘法…

Top3专业课150满分,怎么考的?

这个系列会邀请上岸学长学姐进行经验分享~ 今天经验分享的同学是小马哥上海交大819的全程班学员,专业课150分满分,这位同学也是819期末考试的第一名,非常厉害!大家吸吸欧气! 初试成绩单 前言 先介绍下自己&#xff0…

mysql binlog统一恢复误删数据库、表、数据(没有任何备份)

先将mysql文件夹中的my.ini进行设置 在 [mysqld]下边加上 # mysql-bin 是日志的基本名或前缀名,最后生成的日志文件是mysql-bin.000001类似,重启mysql数字会递增 log_binmysql-bin #binlog格式,statement,row,mixed可…

慢性乙型肝炎肝脏剪切波弹性成像的深度学习放射学显著改善了肝纤维化的诊断性能 | 文献速递-深度学习结合影像组学

慢性乙型肝炎肝脏剪切波弹性成像的深度学习放射学显著改善了肝纤维化的诊断性能 | 文献速递-深度学习结合影像组学 麦田医学 美好事物中转站 2024-05-21 11:03 Title 题目 Deep learning Radiomics of shear wave elastography significantly improved diagnostic performa…

【linux-kernel内核移植记录-踩坑以及注意事项】

目录 1. 环境介绍2.编译原厂的kernel2.1 通过tftp挂载原厂linux内核 3. 修改对应的驱动3.1 修改CPU频率3.2 修改MMC3.3 修改网络驱动 4. 总结 1. 环境介绍 ubuntu版本16.04I.MX6ULL开发板,阿尔法uboot正常启动,能ping通ubuntu,可通过tftpboo…

【0007day】总体标准差、样本标准差和无偏估计

文章目录 总体标准差和样本标准差无偏估计无偏性与无偏估计量 总体标准差和样本标准差 一些表示上的差别。 总体标准差 样本标准差 两者的区别 样本方差为什么除以n-1? 这主要是由于样本的方差会低估总体的方差(抽样的过程中,按照概率来说&#xff0…

C++面向对象的第二大特性:继承

1.继承的介绍 首先容我先向大家举一个列子: 我这里定义了一个Person的类 class Person { protected:string name;int age;string address;}; 在这个基础上,我要定义一个关于Student , Worker 的类 由于Student Worker都具有Person类中的成员变量 &#xff0c…

【C语言】指针(三)

目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…

探索亚马逊云科技技术课程:大模型平台与提示工程的应用与优化

上方图片源自亚马逊云科技【生成式 AI 精英速成计划】技术开发技能课程 前言 学习了亚马逊云科技–技术开发技能课程 本课程分为三个部分,了解如何使用大模型平台、如何训练与部署大模型及生成式AI产品应用与开发,了解各类服务的优势、功能、典型使用案…

借助 CloudFlare 增强站点内容保护防采集

今天在一位站长的帮助下实测了 CloudFlare 增强站点内容保护实现防采集的功能,效果那是杠杠的,如果您的站点原创内容比较多的话,明月强烈建议试试 CloudFlare 这个内容保护,无论是 WordPress 、Typecho 都有非常好的效果,并且几乎没有任何误伤,搜索引擎爬虫蜘蛛更是不会影…

Adobe Animate AN v24.0.2 安装教程 (动画特效设计及合成工具)

Adobe系列软件安装目录 一、Adobe Photoshop PS 25.6.0 安装教程 (最流行的图像设计软件) 二、Adobe Media Encoder ME v24.3.0 安装教程 (视频和音频编码渲染工具) 三、Adobe Premiere Pro v24.3.0 安装教程 (领先的视频编辑软件) 四、Adobe After Effects AE v24.3.0 安装…

深度神经网络教程(个人总结版)

深度神经网络(Deep Neural Networks, DNN)是机器学习和人工智能的核心技术之一,已经广泛应用于图像识别、自然语言处理、语音识别、自动驾驶等领域。本文将详细介绍深度神经网络的背景、基本原理、架构、训练方法、优化技巧以及常见应用。 一…

vue通过for循环生成input框后双向绑定失效问题

有些时候页面上有太多的表单元素&#xff0c;一个个的写太过繁琐&#xff0c;拿 input 框举例&#xff0c;众多的 input 框&#xff0c;无非就是输入框前的说明和 input 框的 name 属性不一样 <el-form :inline"true" :model"formInline" size"mi…

Linux-笔记 应用编程函数总结

之前一直没做总结&#xff0c;这里总结一下。 一、文件I/O open #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); 例子&#xff1a; int fd; fd open("./test_kondon", O_WRONLY …

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进粒子滤波的锂离子电池剩余寿命预测 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

在使用LabVIEW控制多个串口设备进行数据读取时,读取时间过长

在使用LabVIEW控制多个串口设备进行数据读取时&#xff0c;如果发现数据更新时间超过5秒&#xff0c;可以从以下几个方面进行分析和解决&#xff1a; 1. 串口配置与通信参数 确保每个串口的通信参数&#xff08;波特率、数据位、停止位、校验位等&#xff09;配置正确&#x…

vue的异步操作,钩子函数,和Element组件

目录 使用vue进行异步操作 钩子函数 1.create 2.beforeMount​ 3.mounted​ 4.beforeUpdate​ 5.updated​ 6.beforeUnmount​ 7.unmounted​ Element组件 使用vue进行异步操作 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…