アプリとサービスのすすめ

アプリやIT系のサービスを中心に書いていきます。たまに副業やビジネス関係の情報なども気ままにつづります

Jetson nanoと超音波センサー(HC-SR04)で奥行きの距離を測定

前回はステレオビジョンで奥行きを測定したけど、今回は超音波センサー(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台使うからデバイスへの負荷がでかい
精度が低い


センサーはかなり正確で用途によってかなり使い勝手がいい。ステレオビジョンは代替手法がかなり多くなってきたからわざわざ使う必要なくなってる感じがした。




参考記事

超音波距離センサー(HC-SR04)をJetson Nanoで使用してみました