前回はステレオビジョンで奥行きを測定したけど、今回は超音波センサー(HC-SR04)を使って奥行きを測定した。
個人的な備忘録なので、簡単にまとめてく。
目次
1. 配線の構成図
2. 超音波センサーで奥行き測定
3. ステレオビジョンと超音波センサーのメリットとデメリット
1. 配線の構成図
・jetson nano・USBカメラ
・超音波センサー
・ブレッドボード
の4つを使って配線を組んだ。
GND => GND Trig => 19 番pin Echo => 21番pin VCC => 5 V(電源)
画像とセンサーの検出物体の位置に差が出ないように、超音波センサーとUSBカメラはなるべく近づけた。
2. 超音波センサーで奥行き測定
下のコードで測定(一部略)
import time import RPi.GPIO as GPIO class SensorDist(): def __init__(self, hyp): self.__TRIG = hyp['TRIG_PIN'] # 19 pin self.__ECHO = hyp['ECHO_PIN'] # 21 pin GPIO.setwarnings(False) GPIO.setmode(GPIO.BOARD) GPIO.setup(self.__TRIG,GPIO.OUT) GPIO.setup(self.__ECHO,GPIO.IN) self.sound_speed = hyp['sound_speed'] #[cm/s] def getDistance(self): GPIO.output(self.__TRIG, GPIO.LOW) # TRIG = HIGH GPIO.output(self.__TRIG, True) # after 0.01[s], TRIG = LOW time.sleep(0.01) GPIO.output(self.__TRIG, False) signaloff=0 signalon=0 # signal start while GPIO.input(self.__ECHO) == 0: signaloff = time.time() # signal returned while GPIO.input(self.__ECHO) == 1: signalon = time.time() # dist calculation return (signalon - signaloff) * int(self.sound_speed /2) def __del__(self): GPIO.cleanup() def run_camera(opt, hyp): sensor = SensorDist(hyp) cap = cv2.VideoCapture(0) i = 0 while True: ret, frame = cap.read() i+=1 if i%opt.per_frames==0: distance = sensor_dist(sensor) texts = 'Distance: {} [cm/s]'.format(str(distance)) cv2.putText(frame, texts, (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 2, [255, 0, 0], thickness=3) frame = cv2.resize(frame, (500, 500)) cv2.imshow('camera', frame) #print("{:.0f}cm".format(distance)) if cv2.waitKey(1) & 0xFF == ord('q'): break cap.release() cv2.destroyAllWindows() del sensor
パフォーマンスとしてはかなり正確。
3. ステレオビジョンと超音波センサーのメリットとデメリット
超音波センサー
ステレオビジョン
・メリット
検出領域が広い。カメラ画像と連動して距離を検出できるので、応用範囲が広い
検出領域が広い。カメラ画像と連動して距離を検出できるので、応用範囲が広い
・デメリット
LIDARや機械学習みたい代替手法の方がいいのでわざわざ使うメリットが少なくなってる。
カメラ2台使うからデバイスへの負荷がでかい
精度が低い
センサーはかなり正確で用途によってかなり使い勝手がいい。ステレオビジョンは代替手法がかなり多くなってきたからわざわざ使う必要なくなってる感じがした。