日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2024/3/26 编程问答 148 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派小车————避障篇 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

避障模塊的功能就是讓小車能夠檢測到障礙物并且可以正確的避開障礙物。當然避障的方式有很多種。我選擇的是超聲波結合紅外傳感器來避障。

  • 為什么要用超聲波傳感器結合紅外傳感器?
    因為硬件原因,沒有舵機,原本超聲波可以安裝在舵機上,通過舵機轉動,讓超聲波檢測周圍障礙物,我們可以設置舵機轉動的角度,最大程度減少超聲波檢測的盲區。我在設計的時候提前沒有想到要舵機,所以后來也來不及了。
    我的超聲波傳感器固定在了小車的正前方,只能檢測到正前方的障礙物,左右兩邊的障礙物超聲波無法檢測,所以我只能在左前和右前兩個位置安裝了兩個紅外避障傳感器來檢測障礙物。
  • 避障方案還存在的不足?
    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=36def 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: #等待接收高電平passt1=time.time() #記錄信號發出的時間while GPIO.input(Echo)==GPIO.HIGH: #接收端還沒接收到信號變成低電平就循環等待(等高電平結束)passt2=time.time() #記錄接收到反饋信號的時間distance=(t2-t1)*340*100/2 #計算距離,單位換成cmreturn 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)我的避障的處理代碼只能作為參考,寫的不是很簡潔??梢詤⒖疾糠衷?#xff0c;你自己需要設計符合你自己情況的避障代碼。

總結

以上是生活随笔為你收集整理的树莓派小车————避障篇的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。