树莓派小车————避障篇

2023-05-16

避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物。当然避障的方式有很多种。我选择的是超声波结合红外传感器来避障。

  • 为什么要用超声波传感器结合红外传感器?
    因为硬件原因,没有舵机,原本超声波可以安装在舵机上,通过舵机转动,让超声波检测周围障碍物,我们可以设置舵机转动的角度,最大程度减少超声波检测的盲区。我在设计的时候提前没有想到要舵机,所以后来也来不及了。
    我的超声波传感器固定在了小车的正前方,只能检测到正前方的障碍物,左右两边的障碍物超声波无法检测,所以我只能在左前和右前两个位置安装了两个红外避障传感器来检测障碍物。
  • 避障方案还存在的不足?
    1.虽然用红外传感器检测了左右的障碍物,但是超声波依然存在盲区,高于和低于超声波检测位置的障碍物无法检测到。
    2.小车后方的障碍物没有检测的装置
    3.红外传感器在强光下无法正常工作
  • 如何完善避障方案?
    如果你想设计更加完善的避障方案,需要做如下工作:
    1.增加舵机
    2.小车后方增加超声波传感器或者红外传感器
    接下来讲解避障电路和原理
  • 电路连接:
    (1)超声波的电路连接:超声波共有4个引脚,VCC、GND、Trig、Echo。
    Trig是发送端,发出超声波,Echo是接收端,接收超声波。电路连接图如下:
    在这里插入图片描述
    如上图所示,VCC接了2号引脚(+5V),GND接了39号引脚(GND),Trig和Echo分别接了35和37号引脚(GPIO),还是一样,你自己在设计的时候可以选择正确的任何引脚。
    (2)红外避障传感器的电路连接:红外避障传感器共有三个引脚,VCC、GND、OUT。电路连接图如下:
    在这里插入图片描述
    如图中所示,两个传感器的VCC都接树莓派的4号引脚(+5V),GND都接树莓派的34号引脚(GND),OUT分别接了36号和40号引脚(GPIO口)。还是一样,你自己可以选择引脚来设计。
  • 避障原理:
    (1)超声波测距原理:
    超声波传感器包括发射端(Trig)和接收端(Echo),使用IO口Trig触发测距,给在至少10us的高电平信号下会模块会自动发射方波,发出信号的同时接收端会输出高电平,等到接收到反射回来的信号时,Echo就会跳转为低电平。通过超声波的工作原理可知:从Trig=1到Echo=0的时间,就是超声波从发射到返回的时间,因此:障碍物的距离=Echo高电平持续的时间*声速/2。
    (2)红外避障传感器:红外传感器检测到障碍物时状态为False,两个灯亮,没有检测到时为True,一个灯亮。
  • 设计方案图解:
    在这里插入图片描述
  • 代码:
#coding=utf-8
import RPi.GPIO as GPIO
import time
#定义超声波模块的GPIO口
Trig=35 #发射端
Echo=37 #接收端
#定义红外避障传感器GPIO口
L_Senso=40
R_Senso=36

def init():
    #设置接触警告
    GPIO.setwarnings(False)
    #设置引脚模式为物理模式
    GPIO.setmode(GPIO.BOARD)
 	#超声波传感器引脚初始化
    GPIO.setup(Trig,GPIO.OUT) #将发射端引脚设置为输出
    GPIO.setup(Echo,GPIO.IN) #将接收端引脚设置为输入
    #红外避障传感器引脚初始化,设置为输入,接受红外信号
    GPIO.setup(L_Senso,GPIO.IN)
    GPIO.setup(R_Senso,GPIO.IN)

#超声波测距函数
def get_distance():
    GPIO.output(Trig,GPIO.HIGH) #给Trig发送高电平,发出触发信号
    time.sleep(0.00015) #需要至少10us的高电平信号,触发Trig测距
    GPIO.output(Trig,GPIO.LOW)
    while GPIO.input(Echo)!=GPIO.HIGH: #等待接收高电平
        pass
    t1=time.time() #记录信号发出的时间
    while GPIO.input(Echo)==GPIO.HIGH: #接收端还没接收到信号变成低电平就循环等待(等高电平结束)
        pass
    t2=time.time() #记录接收到反馈信号的时间
    distance=(t2-t1)*340*100/2 #计算距离,单位换成cm
    return distance
#避障功能函数(超声波避障结合红外避障)
def bizhang():
    safe_dis=40 #设置一个安全距离
    while True:
        barrier_dis=get_distance() #获取当前障碍物的距离
        #当测得前方障碍物距离小于安全距离时,先让小车停止
        if (barrier_dis < safe_dis) == True:
            while (barrier_dis < safe_dis) == True:
                L_S=GPIO.input(L_Senso)
                R_S=GPIO.input(R_Senso) #接受红外避障传感器的信号
                #如果红外传感器检测到左边有障碍物,右边没有,小车向右转
                if L_S == False and R_S == True:
                    print "左有障碍物先后退再右转"
                    turn_back(18,0.5)
                    turn_right(18,0.2)
                #如果红外传感器检测到右边有障碍物,左边没有,小车向左转
                if L_S == True and R_S == False:
                    print "右有障碍物先后退再左转"
                    turn_back(18,0.5)
                    turn_left(18,0.2)
                #如果红外传感器检测到左右两边都有障碍物,小车后退
                if L_S ==False and R_S == False:
                    print "两边都有障碍物后退"
                    turn_back(18,0.5)
                    #再次接收红外信号(说明刚才的路线已经不能再走,退到一定程度,小车就得左转或者右转,提前寻找新的路线)
                    L_S=GPIO.input(L_Senso)
                    R_S=GPIO.input(R_Senso)
                    #退到左前和右前都没有障碍物的位置
                    if L_S == True and R_S == True:
                        print "右转"
                        turn_right(18,0.2)
                    #退到了右前没有障碍物的位置
                    if L_S == False and R_S == True:
                        print "右转"
                        turn_right(18,0.2)
                    #退到了左前没有障碍物的位置
                    if L_S == True and R_S == False:
                        print "左转"
                        turn_left(18,0.2)
                    #还没有退出刚才的死路,继续后退

                    if L_S == False and R_S == False:
                        print "后退"
                        turn_back(18,0.5)
                #如果红外传感器检测到两边都没有障碍物,此时让小车后退一点,然后向右转
                if L_S == True and R_S == True:

                    print "两边都没有障碍物,后退再右转"
                    turn_back(18,0.5)
                    turn_right(18,0.2)
                print barrier_dis,'cm'
                print ''
                barrier_dis=get_distance()
        else:
            #小车在安全区里内,但是由于超声波传感器无法检测到除了正前方其他方向的障碍物,所以在此接收红外信号,通过左前和右前有没有障碍物,来判断小车该怎样运行
            L_S=GPIO.input(L_Senso)
            R_S=GPIO.input(R_Senso) #接受红外避障传感器的信号
            #在安全距离内同时红外传感器检测到左前和有前方没有障碍物,小车前进
            if L_S == True and R_S == True:
                print "前方40cm内没有障碍物,且左前和右前方没有障碍物,前进"
                turn_up(18,0)
            #在安全距离内,但左前有障碍物,让小车后退,再右转
            if L_S == False and R_S == True:
                print "前方40cm内没有障碍物,左前有障碍物,右前方没有障碍物,后退右转"
                turn_back(18,0.5)
                turn_right(18,0.2)
            #在安全距离内,但右前有障碍物,让小车后退,再左转
            if L_S == True and R_S == False:
                print "前方40cm内没有障碍物,右前有障碍物,左前方没有障碍物,后退右转"
                turn_back(18,0.5)
                turn_left(18,0.2)
            #在安全距离内,但左前,右前都有障碍物,让小车后退
            if L_S == False and R_S == False:
                print "前方40cm内没有障碍物,左前,右前方都有障碍物,后退"
                turn_back(18,0.5)
                #再次接收红外信号(说明刚才的路线已经不能再走,退到一定程度,小车就得左转或者右转,提前寻找新的路线)
                L_S=GPIO.input(L_Senso)
                R_S=GPIO.input(R_Senso)
                #退到左前和右前都没有障碍物的位置
                if L_S == True and R_S == True:
                    print "右转"
                    turn_right(18,0.2)
                #退到了右前没有障碍物的位置
                if L_S == False and R_S == True:
                    print "右转"
                    turn_right(18,0.2)
                #退到了左前没有障碍物的位置

                if L_S == True and R_S == False:
                    print "左转"
                    turn_left(18,0.2)
                #还没有退出刚才的死路,继续后退
                if L_S == False and R_S == False:
                    print "后退"
                    turn_back(18,0.5)
        print barrier_dis,'cm'
        print ''
  • 注:
    (1)你在测试运行时,需要添加基本运动的代码。
    (2)我的避障的处理代码只能作为参考,写的不是很简洁。可以参考部分原理,你自己需要设计符合你自己情况的避障代码。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树莓派小车————避障篇 的相关文章

  • copy outerHTML、python爬取csdn文章、一键打包个人csdn文章保存到本地

    文章目录 1copy outerHTML复制网站源码法1 1复制源码1 2 遇到的问题 2 python爬取CSDN博客文章 xff08 保存为html xff0c txt xff0c md xff09 2 1 安装依赖2 2 完整代码 3
  • 一、视觉SLAM基础概述

    视觉SLAM主要是以视觉为传感器 xff0c 解决定位与建图的问题 xff0c 其主要可以分为前端 后端 回环检测和建图等四个部分 xff0c 其中各个部分的作用分别为 xff1a xff08 1 xff09 前端 xff1a 前端也称为视
  • HAL库 MPU6050的使用

    HAL库 amp amp MPU6050 HAL库 MPU6050的使用 xff1a 今天在本教程中 xff0c 我们将使用STM32接口MPU6050 xff08 GY 521 xff09 加速度计陀螺仪 同时 xff0c 我将在PC上利
  • HAL库 AB相编码器

    HAL库 AB相编码器 文章涉及Cube MX的配置 Keil代码的编写以及模板存放之BaiDu Pan 用到的软件 xff1a STM32CubeMX amp Keil 5 用到的硬件 xff1a 光电式编码器 F411RE NUCLEO
  • CUBLI 简化 一维模型(有bug)

    CUBLI 简化 一维模型 xff08 有bug xff09 文章目录 CUBLI 简化 一维模型 xff08 有bug xff09 前言一 CUBLI是什么 xff1f 二 制作步骤1 MPU6050 amp amp 编码器操作2 什么是
  • 阻滞增长模型--Logistic模型

    文章目录 写在前面一 思路二 原始数据三 源代码四 结果 写在前面 做了一个作业 xff0c 觉得挺有意思 xff0c 有空就发上来了 阻滞增长模型 Logistic模型的部分推导 思路 xff0c 并给出参考代码 参考书籍 xff1a 数
  • Linux 图形化Git客户端

    Linux用户主要可以通过命令行来管理Git xff0c 不过外面有几种图形化用户界面 xff08 GUI xff09 Git客户软件 xff0c 它们便于用户在Linux桌面上高效 可靠地使用Git xff0c 即便提供不了所有命令行操作
  • .yml文件语法

    项目里用到yml文件作为配置文件 xff0c 了解下其实挺简单 xff0c 它的基本语法如下 大小写敏感使用缩进表示层级关系缩进时不允许使用Tab键 xff0c 只允许使用空格 缩进的空格数目不重要 xff0c 只要相同层级的元素左侧对齐即
  • 嵌入式总线协议(二)——RS232、RS485

    定义 RS232 RS485为电气层 xff08 物理层 xff09 协议 xff0c 依赖于串口 xff08 UART xff09 存在 xff0c 在电气层进行优化处理 xff0c 达到提高抗干扰能力 提高传输速度 增大传输距离的效果
  • 测试TensorFlow的GPU版本安装成功方法

    程序如下 xff1a import tensorflow as tf print 39 GPU 39 tf test is gpu available a 61 tf constant 2 b 61 tf constant 4 print
  • 深度学习数据集下载

    猫狗识别数据集 链接 xff1a https pan baidu com s 1vQcmQts1jIi5 oA6O411aA amp shfl 61 sharepset 提取码 xff1a 5si6 MNIST数据集 链接 xff1a ht
  • PyTorch版本检测及GPU是否安装成功检测

    PyTorch GPU版本安装方法 xff0c 请看anaconda虚拟环境下镜像安装PyTorch 利用jupyter notebook访问虚拟环境 检测程序如下 xff1a span class token keyword import
  • 树莓派 | 摄像头模块的使用方法

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 在此项目中 xff0c 将了解如何使用树莓派摄像头模块进行拍照 xff0c 录制视频等
  • 树莓派小实验 | 制作一个带快门的照相机 & 录像机

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa x1f4aa 在此项目中 xff0c 通过连接GPIO引脚的按钮控制拍照 xff0c
  • Jetson Nano 关机、重启命令

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 1 重启命令 xff1a span class token function sudo
  • python保存虚拟环境requirement.txt

    保存 pip freeze span class token operator gt span requirement txt 安装 pip span class token function install span r requirem
  • python虚拟环境移植到另一台电脑

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python环境打包离线安装移植的所做笔记 xff0c 一是为了日后查找方便
  • python安装jupyter lab和使用插件

    如果觉得本篇文章对您的学习起到帮助作用 xff0c 请 点赞 43 关注 43 评论 xff0c 留下您的足迹 x1f4aa x1f4aa x1f4aa 本篇文章为python安装jupyter lab和使用插件的所做笔记 xff0c 一是
  • Bean的初始化和销毁(java配置方式)

    bean生命周期管理 spring对bean的生命周期的操作提供了支持 xff0c java配置和注解配置分别使用如下方式 xff1a 1 java配置 xff1a 使用 64 Bean 的initMethod和destoyMethod 2

随机推荐

  • UWB使用教程

    前言 本篇文章主要对淘宝商家给的UWB资料进行整理 xff0c 方便大家快速入门 注重UWB定位模块的使用 xff0c 不解释具体的原理 实现功能 xff1a 搭建UWB基站使用上位机配置参数ROS接受UWB的定位信息修改IMU的STM32
  • 【Tiva_C系列】一、ARM Cortex-M4F 处理器

    ARM Cortex M4F 处理器 0 引言1 Cortex M4处理器和基于Cortex M4的MCU2 Cortex M4F处理器结构3 存储器映射4 处理器模式和软件执行的权限级别5 内核寄存器6 异常和中断处理6 1 优先级6 2
  • Windows11解决无法设置移动热点

    文章目录 前言1 解决办法 前言 今天装了个Win11 xff0c 回头发现移动热点无法打开 xff0c 在网上找了好久 xff0c 才找到解决方案 xff0c 这里分享下解决方案 1 解决办法 打开设备管理器 找到网络适配器 启用这两个设
  • python实现aruco的生成和检测

    OpenCV aruco的生成 import cv2 as cv import numpy as np if name 61 61 39 main 39 Load the predefined dictionary dictionary 6
  • SMPL经典论文

    摘要 模型参数从这些数据中学习 xff1a 休息姿势模板 混合 xff08 blend xff09 权重 与姿势相关的混合形状 与身份相关的混合形状 从顶点到关节位置的回归器与姿势相关的混合形状是姿态旋转矩阵的线性函数 xff0c 这个简单
  • 灰度图片二值化matlab

    rge图片灰度化之后 xff0c 往往存在灰度值比较近的情况 根据自己的需求将灰度值调到两个极端值 xff0c 也叫做阈值处理 本文的阈值是自定义的 xff0c 建立在已经读取到灰度图片灰度值的基础之上 存在获取灰度图片最佳阈值的算法 大津
  • Maven Helper插件下载&Maven导入jar包(依赖管理)

    1 maven Helper插件 1 1搜索 File gt Settings gt Plugins gt 搜索Maven Helper 发现没有 1 2 安装 点击Browse reositories gt 选择maven Helper
  • Ubuntu18.04下基于ROS和PX4的无人机仿真平台的基础配置搭建

    Ubuntu18 04下基于ROS和PX4的无人机仿真平台的基础配置搭建 参考资料 xff1a https www yuque com xtdrone manual cn basic config 1 11 https blog csdn
  • darknet_ros安装的以及在PX4无人机仿真平台的目标检测

    darknet ros的安装以及在PX4无人机仿真平台的目标检测 参考资料 xff1a https github com leggedrobotics darknet ros https gitee com robin shaun XTDr
  • Ubuntu上设置查看SSH Key并在GitHub上添加设置

    这里讲了如何在Ubuntu设置查看SSH key并在GitHub上添加设置 有的时候git clone可能出现错误 xff1a 这需要我们在Ubuntu设置查看SSH key并在GitHub上添加设置 1 在终端上输入 ssh keygen
  • git 添加更新子模块

    添加submodule到仓库 下载父仓库 git clone git 64 gitlab span class hljs preprocessor abc span span class hljs preprocessor com span
  • Docker容器图像界面显示到宿主机屏幕配置方法——挂载方式

    原理简介 可以把docker镜像看做一台没配显示器的电脑 xff0c 程序可以运行 xff0c 但是没地方显示 而linux目前的主流图像界面服务X11又支持 客户端 服务端 xff08 Client Server xff09 的工作模式只
  • JETSON TX2卸载原有的opencv安装opencv3.2

    参考博客 xff1a http blog csdn net u014613745 article details 78310916 http blog csdn net public669 article details 99044895
  • Ubuntu使用ros进行多电脑IP通信

    TUF Gaming是我的笔记本 xff0c master是实验室的主机 xff0c 在同学komorebi fresh xff08 https me csdn net weixin 44270815 xff09 的帮助下把我自己的笔记本和
  • Mavros与无人机

    记录一些mavros与无人机的指令 xff0c 这篇博客只是起备忘录的作用 飞控接口赋权 span class token function sudo span span class token function chmod span 77
  • Ubuntu18.04安装ax200网卡驱动以及更新内核

    Ubuntu18 04安装ax200网卡驱动以及更新内核 参考资料 xff1a https zhangyiming748 github io 2019 12 05 useAX200OnUbuntu 原来的网卡是小螃蟹的8822ce xff0
  • 笔记:QGC使用及姿态环仿真调节方式

    笔记 xff1a QGC使用及姿态环仿真调节方式 打开Gazebo及QGC 进入终端管理员权限 sudo s 在终端打开Gazebo cd Firmware make px4 sitl default gazebo 点击文件夹中的QGC x
  • PIX4飞控调参

    飞控调参
  • nano板载电脑连接无线时断时续

    在无人机上使用nano b01板载电脑 xff0c 在地面站电脑上ssh板载电脑名字及ip地址可进入地面站电脑 通过在两个电脑的 bashrc文件中加入主从节点ip xff0c 实现ros通信 xff0c 想要实现用地面站电脑控制板载电脑
  • 树莓派小车————避障篇

    避障模块的功能就是让小车能够检测到障碍物并且可以正确的避开障碍物 当然避障的方式有很多种 我选择的是超声波结合红外传感器来避障 为什么要用超声波传感器结合红外传感器 xff1f 因为硬件原因 xff0c 没有舵机 xff0c 原本超声波可以