當今,汽車行業的發展可謂是日新月異。智能汽車的概念也越來越火熱。自動駕駛也将得到越來越廣泛的應用。不知你有沒有想過,平時我們在人工駕駛汽車時,主要使用的是視覺來感覺距離,對于人工智能來說,它是如何通過感覺距離來擷取周圍環境資訊的呢?這就需要使用到相關的測距傳感器。
一、超聲測距傳感器
我們知道,超音波頻率高,相對于普通聲波,其能量消耗慢,傳播距離遠且指向性很強。十分适合用來進行距離的測量。本次實驗,我們使用HC-SR04超聲測距子產品來進行距離測量。元件如下圖所示:
如上圖所示,HC-SR04子產品有一個超聲發生器(T端)和一個超聲收集器(R端)以及4個引腳。在網上很容易購買到此子產品,其價格低廉,精準度高,使用簡單,成本效益非常高。HC-SR04硬體原理圖如下:
子產品内部電路結構雖然看上去非常複雜,但是我們使用它來測距并不需要了解其内部完整的工作原理,要進行距離的測定,離不開公式_s = v * t_。如果要計算出距離s,需要得知速度v和時間t,聲波的速度v是一定的,我們可以取340m/s,時間t就是HC-SR04子產品能夠幫助我們得到的。
超聲測距的核心原理是通過發生源發出超音波,當超音波遇到障礙時會被反射,反射的超音波可以被感覺源感覺到,從聲波發出到被感覺到這之間的時間就是超音波從子產品到障礙物間傳遞一次來回所使用的時間。如下圖所示:
對于HC-SR04子產品,其Trig引腳是觸發引腳,向其發10us以上的高電平即可觸發發送超音波指令,HC-SR04子產品會自動發送8個40kHz的方波,當發送完成後,Echo引腳會輸出高電平,當收到反射回來的聲波後,Echo會重新變回低電平。是以,在使用HC-SR04子產品時,我們隻需要通過向Trig引腳加高電平觸發測量指令,之後監聽Echo引腳高電平的持續時間,即可完成測距工作。
二、連線與編碼
我們選擇BCM編碼下的GPIO17來控制超聲發生Trig引腳,使用GPIO18來擷取Echo引腳的電平。連線如下:
HC-SR04子產品 樹莓派
VCC +5V電源
GND GND
Trig GPIO17(BCM編碼)
Echo CGIO18(BCM編碼)
編寫如下代碼:
#coding:utf-8
import RPi.GPIO as GPIO
import time
# 觸發聲波引腳
trig = 11
# 監聽信号
echo = 12
def getDistance():
# 輸出高電平
GPIO.output(trig, GPIO.HIGH)
# 持續15us高電平 觸發超音波
time.sleep(0.000015)
# 停止加高電平
GPIO.output(trig, GPIO.LOW)
# 開始檢測信号引腳的電平為高電平時開始計時
while GPIO.input(echo) == 0:
pass
t1 = time.time()
# 信号引腳的電平為低電平時計算時間間隔
while GPIO.input(echo) == 1:
t2 = time.time()
# 計算距離
s = (t2 - t1)*340/2
return s
GPIO.setmode(GPIO.BOARD)
GPIO.setup(trig, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(echo, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
while True:
s = getDistance()
print("目前距離前方障礙物:%fm"%(s))
time.sleep(1)
在樹莓派中運作上面代碼,即可實作超音波測距,效果如下圖: