基于树莓派的opencv-Python小车循线学习笔记

基于树莓派的opencv-Python小车循线学习笔记

安装小车

选择好控制电机的引脚并将其与L298N双H桥直流电机驱动器的IO输入相连接,因为我是两轮的小车,所以选择了树莓派上的16和22端口分别接L298N双H桥直流电机驱动器的in1,in2的IO口控制两个电机。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
把 L289N 的直流电源接好,然后把树莓派的 GND 与 L298N 的 GND 连在一起,因为共地后 L298N 才能识别树莓派发送的 IN1、IN2 到底是高电平还是低电平。

代码

import RPi.GPIO as gpio
import time
import cv2
import numpy as np

# 定义引脚
pin1 = 16
#pin2 = 12
pin3 = 22
#pin4 = 18

# 设置GPIO口为BOARD编号规范
gpio.setmode(gpio.BOARD)

# 设置GPIO口为输出
gpio.setup(pin1, gpio.OUT)
#gpio.setup(pin2, gpio.OUT)
gpio.setup(pin3, gpio.OUT)
#gpio.setup(pin4, gpio.OUT)

# 设置PWM波,频率为500Hz
pwm1 = gpio.PWM(pin1, 500)
#pwm2 = gpio.PWM(pin2, 500)
pwm3 = gpio.PWM(pin3, 500)
#pwm4 = gpio.PWM(pin4, 500)

# pwm波控制初始化
pwm1.start(0)
#pwm2.start(0)
pwm3.start(0)
#pwm4.start(0)

# center定义
center = 320
# 打开摄像头,图像尺寸640*480(长*高),opencv存储值为480*640(行*列)
cap = cv2.VideoCapture(0)
while(1):  # check !
    ret, frame = cap.read()
    # 转化为灰度图
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    # 大津法二值化
    retval, dst = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU)
    # 膨胀,白区域变大
    dst = cv2.dilate(dst, None, iterations=2)
    # # 腐蚀,白区域变小
    #
    #dst = cv2.erode(dst, None, iterations=6)

    # 单看第400行的像素值
    color = dst[400]
    # 找到白色的像素点个数
    white_count = np.sum(color == 0)
    # 找到白色的像素点索引
    white_index = np.where(color == 0)

    # 防止white_count=0的报错
    if white_count == 0:
        white_count = 1

    # 找到白色像素的中心点位置
    center = (white_index[0][white_count - 1] + white_index[0][0]) / 2

    # 计算出center与标准中心点的偏移量
    direction = center - 320
    cv2.imshow('dst',dst)
    print(direction)

    # 停止
    if abs(direction) > 280:
        pwm1.ChangeDutyCycle(0)
        pwm3.ChangeDutyCycle(0)

    # 右转
    elif direction >= 0:
        # 限制在70以内
        if direction > 30:
            direction = 30
        pwm1.ChangeDutyCycle(20+direction)
        #pwm2.ChangeDutyCycle(0)
        pwm3.ChangeDutyCycle(10)
       # pwm4.ChangeDutyCycle(0)
        
   

    # 左转
    elif direction < 0:
        if direction < -5:
          direction = -30
        pwm1.ChangeDutyCycle(10)
        #pwm2.ChangeDutyCycle(0)
        pwm3.ChangeDutyCycle( 30-direction)
       # pwm4.ChangeDutyCycle(0)

   

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

# 释放清理
cap.release()
cv2.destroyAllWindows()
pwm1.stop()
#pwm2.stop()
pwm3.stop()
#pwm4.stop()
gpio.cleanup()

原理是通过调整pwn来控制电机的转速,从而实现小车的调整

现在小车循迹直线还可以,但是在转弯时总会出现不能及时调整从而使线段超出视野使程序终止的问题,可能是以下问题:
1.判别时延时过高,这时候可以通过调整代码的灵敏度得到一定的改善,或者调整程序判别逻辑机制使运行时延时降低。
2.树莓派过热时导致的处理变慢
3.在转弯时与中心值相差的数值变动过大,这时候加上图像分割将线段分割很多份使树莓派识别到的永远是直线。(本人正在试验)
4.摄像头视野调整不到位。

与Windows的远程连接

只需要在raspbian下面安装一个服务xdrp即可。输入如下命令安装:
sudo apt-get install xrdp
然后在Windows远程桌面连接输入树莓派ip地址,输入用户名和密码进行连接,远程控制。

猜你喜欢

转载自blog.csdn.net/weixin_45215354/article/details/106912050