树莓派+二自由度云台制作智能小车(三)——小车运动+简单的自动避障

小车与避障原理

一、小车运动模块

小车主要是分为动力模块和控制模块,动力模块由驱动板,直流电机加轮子以及外接供电的锂电池组成。控制模块就是树莓派了,连接驱动板对电机进行控制,实现对小车运动的控制。
注意事项:当小车不转的时候,一定要注意,驱动板和树莓派是否构成一个完整的回路(共地)。
其次是不同的直流电机和供电,会导致小车速度不同,然后会影响避障策略的设置,此时需要调整延时时间即可,若各位有比较好的意见,请在评论区留言,欢迎进行交流。
本文涉及的驱动板是L298n驱动板,长下面这个样子,有IN1–IN4共4个输入接口,对应OUT1–OUT4,ENA、ENB共两个使能接口,一个5V,一个12V和一个GND的电源接口,具体参数,有兴趣的可以下载看一下,由于无法直接放文件,所以可以点这里下载
L298n驱动板

二、避障原理

在了解避障决策之前,让我们先对障碍物类型进行一个分类,各位看官道友也可以根据自己的喜好对障碍物进行分类,然后设置不同的避障决策。
在这里插入图片描述

箭头代表了传感器的探测方向,本文正前方的箭头设置为红外传感器,左右的为超声波传感器。由于红外传感器只有一个,由于红外传感器设计的探测范围问题,容易出现侧前方出现障碍物,识别不准障碍物类型的情况,可适当添加传感器。
==建议:==使用同款传感器和T型板的话,建议对红外传感器的连接线进行一下改动,将母头改成公头。方便和T型板进行连接。
采用的是一种比较简单的避障决策,用一张图,可以用以下这张图来体现。
在这里插入图片描述

三、实现

从这里开始就要注意各个部件连接的接口号了,我们为方便统一管理,创建一个config.ini的配置文件,用于管理硬件连接的pin口编号。云台后续再进行添加管理。之后的连线,也主要都是通过看配置文件里面,就比较方便,不用一个个文件看。

[car]
# This is the parmaters that will control the car's wheels
# The number is the interface number if GPIO(GPIO.BCM)
#board 11 12 13 15
IN1 = 17
IN2 = 18
IN3 = 27
IN4 = 22

[ultrasonic]
#BCM 25 6 12 5
#control ultrasonic detection distance for obstacle avoidance
Trigger_l = 25
Trigger_r =6
Echo_l = 12
Echo_r = 5

[infrared]
#BCM  20 detected = 20CM
single_pin = 20

使用了配置文件之后,就需要import configparser。
然后读取配置文件。

        config = configparser.ConfigParser()
        config.read("config.ini")

(1)将传感器整合。

将各个障碍物类型进行分类后,设置几个传感器配合,对障碍物类型进行判别,同时可以传参给树莓派进行避障策略选择。创建名为sense.py。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 传感器探测障碍物类型
import RPi.GPIO as GPIO
import time
import configparser
from infrared import Infrared
from ultrasonic import Ultrasonic

#Define the number of all the GPIO taht used for 4wd car
class Sense():
    
    def __init__(self):
        config = configparser.ConfigParser()
        config.read("config.ini")
        
        trigger_l=config.getint("ultrasonic","Trigger_l")
        trigger_r=config.getint("ultrasonic","Trigger_r")
        echo_l=config.getint("ultrasonic","Echo_l")
        echo_r=config.getint("ultrasonic","Echo_r")
        single_pin=config.getint("infrared","single_pin")
        
        self.Sonic_l = Ultrasonic(trigger_l,echo_l)
        self.Sonic_r = Ultrasonic(trigger_r,echo_r)
        self.Infrared = Infrared(single_pin)
    #get obstacles type   
    def detection(self):
        
        #NO Obstacles or 20cm safe distance  type 0
        if self.Infrared.check_distance() == "OK":
            return "Fgo"
        #Obstacles ahead
        #self.Infrared.check_distance() == "Warning"
        else 
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值