ESP32 MicroPython 小车摄像头目标追踪⑮

ESP32 MicroPython 小车摄像头目标追踪⑮

1、小车摄像头目标追踪

实验目的
使用小车AI摄像头颜色识别、超声波测距功能实现物体追踪
实验内容
根据小车的AI颜色识别红色识别返回的信息,计算出目标图像在前方的左边还是右边和中间,如果图像在中间则小车前进且使用超声波测量前方的距离,测量到前方距离如果小于设定的值(20cm)时,小车停止前进。如果图像目标在左边或者右边,小车将向相应的方向转向并直行寻找目标。
参考代码
程序代码可以在资料包目录“\智能小车mpy例程\综合实验\07-小车摄像头目标追踪”main.py 找到

'''
AI摄像头寻车
'''
from machine import Pin,Timer  #导入Pin引脚和Time定时器模块
from lcd import LCD20          #导入2.0寸LCD模块
import car                     #导入小车控制模块
import cam                     #导入摄像头模块
import time
import ai                      #导入AI模块

import math #使用abs绝对值函数
##########################################################################
SERVOR_MIDPIONT    = const(1400)  #舵机中点脉宽
##########################################################################
#颜色值定义,(R,G,B) 0~255代表颜色值
red = (255,0,0)  #红色
green = (0,255,0) #绿色
blue = (0,0,255)  #蓝色
white = (255,255,255) #白色
back = (0,0,0)    #黑色

#创建LCD对象 dir 显示方向为竖屏,1、3竖屏,2、4屏横
ld=LCD20()  #默认为竖屏1

# 整屏填充指定颜色
ld.fill(back)

myCam = cam.OV2640(frame=2)        #创建摄像头对象,图层为2层
myCam.framesize(cam.LCD240X240)    #显示屏对应的分辨率 方便显示
myCam.set_hmirror(0) #设置摄像头水平镜像关闭
#######################################################
servoMidPointPWM = SERVOR_MIDPIONT      #舵机脉宽控制变量
lsatServoPWM = servoMidPointPWM
dist = 0                     #超声波测距距离
servordir = 0 #0-左转动,1-右转动
################################################
myCar=car.SERIAL_CAR()      #构建小车控制对象
myCar.stop()                       #停止下
time.sleep_ms(100)
myCar.servo(SERVOR_MIDPIONT)      #舵机回中
time.sleep_ms(100)
myAi = ai.colorDetection( color = ai.COLOR_RED,displayType=1) #启动红色检测,LCD显示方式

myAi.start() #启动AI检测

tarNum = 0  #检测到目标数量
#检测到第一个目标的位置,用于计算中点位置
x0=0
x1=0
y0=0
y1=0 
midPointX = 0 #计算出X轴的中心点,90~150控制区域
#######################################################################
#读取检测结果,并计算中点位置返回坐标
def read_ai_data():
    v=myAi.read() #读取检测到数据
    n = v[0] #读取检测目标数量
    yMax = 0 #读取最大值
    iMax = 0 #最大值对应的索引
    if n > 0: #检测到目标
        yMax = v[2] #读取第一个Y轴左上角坐标的值 作为最大值
        for i in range(n): #遍历查找过滤检测目标为最靠近小车的目标坐标
            if yMax < v[(4*i)+2]: #查找最大值
                yMax = v[(4*i)+2]
                iMax = i #记录最大值对应的索引
            pass
        
        x0 = v[4*iMax+1] #读取底部检测对象的X轴坐标用于计算中点
        x1 = v[4*iMax+3]

        return ((x1 - x0)//2) + x0 #计算出X轴中心位置 ,用于控制调整位置 设置调整位置90~150,120为中心点
    else:
        return 0
    return 0
###########################小车速度控制变量#######################################
leftPWM = 25            #左轮电机控制PWM 变量
lastLeftPWM = 0
rightPWM = 25           #右轮电机控制PWM 变量
lastRightPWM = 0

normalPWM = 30       #小车直行行驶速度

yawMaxPWM = 20       #正常偏航最大速度
yawMinPWM = 10       #正常偏航最小速度

severeYawMaxPWM = 25 #严重偏航最大速度
severeYawMinPWM = 10 #严重偏航最小速度
#######################################################################
def car_servo_findTarget():  #转动舵机寻找目标,舵机左右转动72度,最大视角144度 精度1.8度
    global servoMidPointPWM  #舵机调整变量声明 800转动转动范围
    global servordir
    global midPointX
    servoMidPointPWM = SERVOR_MIDPIONT
    servordir = 0 #默认寻找方向
    findOve = 0 #寻找目标超时标志 ,一个轮回找不到就原地打转再继续寻找
    while True:
        
        if servordir ==0: #左边方向转动
            servoMidPointPWM = servoMidPointPWM + 20
            if servoMidPointPWM > (SERVOR_MIDPIONT+800): #限制范围
                servordir = 1 #标志反方向
                servoMidPointPWM = SERVOR_MIDPIONT #回中位置
                pass
        elif servordir ==1: #右边方向转动
            servoMidPointPWM = servoMidPointPWM - 20
            if servoMidPointPWM < (SERVOR_MIDPIONT-800): #限制范围
                servordir = 0 #标志反方向
                servoMidPointPWM = SERVOR_MIDPIONT #回中位置
                findOve = 1 #标志完成一次寻找
                pass
            pass
        myCar.servo(servoMidPointPWM)  #转动舵机

        time.sleep_ms(100)
        midPointX = read_ai_data()  #读取摄像头识别目标
        if midPointX != 0: #找到目标了
            myCar.servo(SERVOR_MIDPIONT)  #调整摄像头回中
            time.sleep_ms(100)
            if servoMidPointPWM > SERVOR_MIDPIONT: #目标在左边位置,调整车中间位置
                myCar.lrForward(0,yawMaxPWM) #小车左转找目标
                time.sleep_ms(50)
                while True:
                    midPointX = read_ai_data()  #读取摄像头识别目标
                    if( midPointX > 80 and midPointX < 160):
                        break
                    time.sleep_ms(50)
#                     print('midPointX:'+str(midPointX)) #打印出测距距离
                    pass

            elif servoMidPointPWM < SERVOR_MIDPIONT:#目标在右边边位置
                myCar.lrForward(yawMaxPWM,0) #小车左转找目标
                time.sleep_ms(50)
                while True:
                    midPointX = read_ai_data()  #读取摄像头识别目标
                    if( midPointX > 80 and midPointX < 160):
                        break
                    time.sleep_ms(50)
                    print('midPointX:'+str(midPointX)) #打印出测距距离
                    pass
                pass
            break
        else: #没有找到目标
            if findOve == 1: #已经完成一次寻找,还是找不到就转动一定角度
                myCar.lrForward(yawMaxPWM,0)
                time.sleep_ms(2000)
                myCar.stop()
                findOve = 0
            
#######################################################################
#AI摄像头巡线小车处理函数
def ai_car_adj_fun():
    global leftPWM           #全局变量声明
    global rightPWM          #全局变量声明
    global lastLeftPWM
    global lastRightPWM
    global dist
    global servoMidPointPWM
    global lsatServoPWM
    #########进入调整参数################
    LoutFlag = 0 #左边严重出界标志
    RoutFlag = 0 #右边边严重出界标志
    
    while True:
        dist = myCar.distance() #读取测距距离,测距范围25cm~450cm
        midPointX = read_ai_data()  #读取中点位置
        if midPointX == 0 and dist > 20: #视野内没有看到目标 而且前面没有杂物
            rightPWM = 0
            leftPWM = 0
            myCar.lrForward(leftPWM,rightPWM) #停车找目标
            time.sleep_ms(50)        #延时等待稳定
            car_servo_findTarget()
            pass
        else:
            if midPointX > 0 and midPointX <= 47: #0~47 小车严重往左转向
                rightPWM = severeYawMaxPWM   #右轮速度控制
                leftPWM =  severeYawMinPWM   #左轮速度控制
                pass
            elif midPointX >= 48 and midPointX <= 95 : #48~95 小车往左转向
                rightPWM = yawMaxPWM   #右轮速度控制
                leftPWM =  yawMinPWM   #左轮速度控制
                pass
            elif midPointX >= 96 and midPointX <= 143 : #直行
                rightPWM = normalPWM   #右轮速度控制
                leftPWM =  normalPWM   #左轮速度控制
                pass
            elif midPointX >= 144 and midPointX <= 190 :
                rightPWM = yawMinPWM   #右轮速度控制
                leftPWM =  yawMaxPWM   #左轮速度控制
                pass
            elif midPointX >= 191:
                rightPWM = severeYawMinPWM   #右轮速度控制
                leftPWM =  severeYawMaxPWM   #左轮速度控制
                pass
            else:
                rightPWM = 0
                leftPWM = 0
                
            if dist <= 20: #距离太近停车
                leftPWM = 0
                rightPWM = 0
            #小车电机执行转速控制
            if lastLeftPWM != leftPWM or lastRightPWM != rightPWM:
                time.sleep_ms(50)        #延时等待串口通信
                myCar.lrForward(leftPWM,rightPWM)   #左轮前进
                lastLeftPWM = leftPWM
                lastRightPWM = rightPWM
                
            time.sleep_ms(50)
            print('dist:'+str(dist)) #打印出测距距离
##############################################################################################
while True:
    ai_car_adj_fun()

实验结果
我们上传代码到小车内存后,重启电源。放置小车到地面,小车自动左右转动超声波模块以便寻找红色目标。找到后便可看到小车向目标行驶过去。
在这里插入图片描述

相关代码及固件:
https://download.csdn.net/download/lu330274924/88549191

智能小车购买链接
技术支持抖音:易驱达Easy Drive Coming
淘宝官方商城:https://item.taobao.com/item.htm?spm=a1z10.5-c.w4002-18887194911.15.135014bdaKI6mV&id=715385110550

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
1.项目代码功能经验证ok,确保稳定可靠运行。欢迎下载使用!在使用过程中,如有问题或建议,请及时私信沟通。 2.主要针对各个计算机相关专业,包括计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师或企业员工使用。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 STM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zipSTM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zip STM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zip STM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zip STM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zip STM32开发基于Openmv完成的视觉云台追踪小车项目完整源码+项目说明+详细注释.zip

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

物联网程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值