文章目录

  • 追小球的小车
  • 巡线小车

这个例子展示了在OpenMV Cam上使用get_regression()方法获得ROI的线性回归。使用这种方法,可以轻松让机器人跟踪所有指向相同大致方向的线。

本例程可以用于机器人巡线,效果非常好。

“巡线小车”的原理和“追小球的小车”是差不多一样的,其中car.py和pid.py完全一样,改动的就只有主函数main.py

追小球的小车

采用的是颜色识别算法,调用的是find_blobs()函数

巡线小车

采用的是线性回归算法,调用的是get_regression()函数:快速线性回归,返回视野中的一条回归直线,该函数可以得到直线的斜率、角度(或者说是偏移的距离),然后我们就可以用直线返回来的角度来控制我们的小球进行运动
如果我们在OpenMV视野中看到的直线正好是竖直的,说明我们看到的是一条位于正前方的直线,那么我们就可以控制小车的两个电机转速一样往前跑
如果我们在OpenMV视野中看到的直线是左偏45°,那么我们就可以控制我们的小车右边的电机比左边的速度快让小车稍微向左前方进行移动,右前方同理

car.py和pid.py详见"追小球的小车"
使用时要将car.py和pid.py保存到OpenMV内置的flash中!

main.py

THRESHOLD = (5, 70, -23, 15, -57, 0) # 追踪的线的颜色阈值import sensor, image, time
from pyb import LED
import car
from pid import PID# 一条线的表示方法 " y = ax + b "   其中:
rho_pid = PID(p=0.4, i=0)   # 相当于“ b ”——> 截距        控制直线在视野中的位置(左右距离的偏移)最终目的是线在视野的中央
theta_pid = PID(p=0.001, i=0)   # 相当于“ a ”——> 斜率    控制直线偏移的角度    # 如果在运动过程中小车偏移得比较大或者是转弯转得比较大,那么就减小相应pid的值# 打开OpenMV的RGB灯——>用于补光  因为颜色会受到环境光照的影响,所以我们建议最好打开OpenMV自带的补光灯来保持环境的稳定
LED(1).on()
LED(2).on()
LED(3).on()#如果开灯会造成严重反光,则关闭灯!sensor.reset()# 在安装时我们的OpenMV是倒着安装的,因此我们需要相应地在代码里把图像正过来!以下两句函数均是对图像进行镜像处理
sensor.set_vflip(True)      # 设置OpenMV图像“水平方向进行翻转”
sensor.set_hmirror(True)    # 设置OpenMV图像“竖直方向进行翻转”
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQQVGA) # 线性回归算法的运算量大,越小的分辨率识别的效果越好,运算速度越快
#sensor.set_windowing([0,20,80,40])
sensor.skip_frames(time = 2000)     # 等待2秒    # 警告:如果使用QQVGA,有时处理帧可能需要几秒钟。
clock = time.clock()                while(True):clock.tick()img = sensor.snapshot().binary([THRESHOLD]) # 截取一张图片,进行 “阈值分割”# 阈值分割函数image.binary()对图像进行二值化(binary:二元的;由两部分组成的)# 得到的效果是:将阈值颜色变成白色,非阈值颜色变成黑色# 调用线性回归函数line = img.get_regression([(100,100)], robust = True)# 对所有的阈值像素进行线性回归# 线性回归的效果就是将我们视野中“二值化”分割后的图像回归成一条直线# get_regression()返回的是一条直线line#如果发现了线                                       if (line):# 利用得到的line对象来计算pid的值——>进而控制小车运动rho_err = abs(line.rho())-img.width()/2 # 计算我们的直线相对于中央位置偏移的距离(偏移的像素)# abs()函数:返回数字的绝对值  line.rho():返回霍夫变换后的直线p值。# 进行坐标的变换:y轴方向为0°,x轴正方向为90°,x轴负方向为-90°if line.theta()>90:# line.theta()是我们得到的直线的角度theta_err = line.theta()-180else:theta_err = line.theta()# 将我们得到的直线画出来    img.draw_line(line.line(), color = 127)# line.line():返回一个直线元组(x1, y1, x2, y2)  print(rho_err,line.magnitude(),rho_err) #line.magnitude()返回一个表示“线性回归效果”的值,这个值越大,线性回归效果越好;# 如果越接近于0,说明我们的线性回归效果越接近于一个圆,效果越差 if line.magnitude()>8:  # 如果线性回归的效果比较好#进行pid的运算rho_output = rho_pid.get_pid(rho_err,1) # 将刚刚计算出的rho_err传递进rho_pid中theta_output = theta_pid.get_pid(theta_err,1)output = rho_output+theta_output    # 将得到的两个pid参数进行相加,利用得到的参数output来控制小车电机的运动car.run(50+output, 50-output)# 对于左轮子来说就是+output,对于右轮子来说就是-output# 以中央速度50为基准值进行加减(car.run()函数中小车电机的速度为0-100)# 如果想让小车快一点就设置为大于50的数,慢一点就设置为小于50的数   else:# 如果线性回归的效果并不好car.run(0,0)    # 那么就停止运动# 如果没有发现线else:car.run(50,-50)# 原地旋转,寻找视野中的线pass#print(clock.fps())

OpenMV:14巡线小车相关推荐

  1. Arduino案例实操 -- 智能巡防小车(三)图形化巡线小车编程

    巡防小车的巡线功能同时可以用图形化编程软件来实现.博主这里用的图形化编程软件是KRobot. 三.图形化巡线小车编程 3.1 编程环境配置 3.1.1 下载编程软件 3.1.2 安装编程软件 3.2 ...

  2. Arduino案例实操 -- 智能巡防小车(三)Arduino IDE巡线小车编程

    三.Arduino IDE巡线小车编程 3.1 Arduino开发环境 下载免安装ZIP包 下载IDE安装包 3.2 Arduino IDE 3.3 Blink项目实例 打开内置案例 进行程序上传 3 ...

  3. 基于STM32F103智能巡线小车

    ​ 项目描述: 巡线小车是我作为新手入手的第一个项目,基本巡线功能是使用红外传感器循迹模块判断黑线的路径来确定转向方向,同时控制单片机配置PWM占空比波控制小车前进的L298N电机模块,实现前后退,左 ...

  4. 基于STC89C52RC模块的巡线小车

    基于STC89C52RC模块的巡线小车 在STC89C52RC的基础上使用电机驱动使小车完成巡线,停站,避障,掉头等多功能智能小车 所需头文件: #include <reg52.h> #i ...

  5. stm32 电磁巡线小车

    stm32 电磁巡线小车 一 可实现功能 使用陀螺仪,根据俯仰角变化在下坡后停车 . 通过三路电感,实现小车巡线,可循 s弯 ,d形弯,8字弯,环岛. 可在不同的地方巡线,有学习能力. 红外光电开关判 ...

  6. 巡线小车学习笔记(arduino 四路循迹)

    巡线小车代码学习笔记 红外布局原理 中间两路巡线一直在黑线上,小车会直行,当任意一个出来,小车会自动纠正.如果最外面的检测到黑线.则小车以更大速度纠正到黑线上去.在算法上,优先处理锐角,直角等外围传感 ...

  7. 从零开始制作OV7670摄像头巡线小车

    大家想不想自己动手制作如下一款摄像头巡线小车呢? 摄像头寻迹小车,你们想要不? 这款硬件原理图如下所示: 需要的主要材料清单有: 1.STM32F411核心板 2.OV7670摄像头 3.A4988步 ...

  8. 根据星瞳科技openmv巡线小车所改进的巡线方案

    首先看一下星瞳科技的巡线方案(附上其开源源码): THRESHOLD = (5, 70, -23, 15, -57, 0) # Grayscale threshold for dark things. ...

  9. OpenMV 线性回归巡线之一:赛道提取

    背景介绍: 通过 <图像处理基础>能知道视觉就是在图片上找目标.通过<OpenMV 图片对象(目标识别基础)>能知道怎么找目标. 本篇继续这个话题,说说找目标是为了做什么. 提 ...

最新文章

  1. ubuntu /boot 空间清理
  2. web移动端_移动端的轮播
  3. 基于Spark ALS算法的个性化推荐
  4. java ubuntu 14.04,Ubuntu 14.04安装java的方法
  5. Vue.js学习笔记四
  6. 点对点 客户端-服务器 聊天程序
  7. 第五周课程总结试验报告三
  8. java两个项目之间通过webservice调用-源码仅供参考
  9. nginx1.8.0安装
  10. [USACO08MAR]Land Acquisition
  11. RPG Maker MV如何导入dlc素材?
  12. SCTP客户/服务器程序
  13. 鸟哥的Linux私房菜(基础学习篇第四版)学习笔记
  14. 为什么我们买了股票就不涨被套,股票割肉就飞了?
  15. 网页怎么算切屏_电脑怎么切屏
  16. 三大策略 + 五大场景,揭秘如何提升私域转化率
  17. 服务器打包文件工具,项目增量发版之全自动打包流程(patch-generator-desk打包软件)...
  18. 汇编语言(二)之将十进制数的ASCⅡ码转换为BCD码
  19. HihoCoder——Trie树
  20. 用Python绘制一朵玫瑰花,送给特别的她

热门文章

  1. 钟丽缇胯也太宽了吧,抹胸裙都快撑破了, 张伦硕能hold住么
  2. 小米MIUI10企业模式上线,万物基于MIUI正在向你靠近
  3. 无线图传- HDMI1.4 无线图传
  4. Samtec技术前沿 | 全新电缆系统提升了热管理并延长了信号覆盖范围
  5. 坑爹的西部数码,悲剧的港台主机
  6. 从远程调用框架认识Zookeeper
  7. 语音识别一、语音识别介绍
  8. svg模糊或不显示问题
  9. linux中进程杀不死解决办法
  10. 软件测试质量保证与测试