1.目的

VL53L1Xは、4mまで測定可能な測距センサである。この測距センサをpreMSM Pass4に搭載した際のアプリとして、通った人数を数えるMan Counterを検討する。

2.システム構成

VL53L1XをI2Cで接続したRasberry Pi(gw337d)とgw337dからPublishされたデータをMQTT ブローカーで受けるRasberry Pi(gw15c1)でシステムを構成する。

図1. システム構成図

また、マン・カウンタの考え方を以下に示す。

3. 人数検出フロー

人数検出フローを図2に示す。

図2. 人数検出フロー

■ Node-REDでのglobal変数の使い方

Node-REDのfunctionブロックで記載するプログラムを以下に示す。

var i, j;
if (context.global.get("mc") === undefined) {
context.global.set("mc", 0)
}
i = context.global.get("counter");
j = context.global.get("mc");
if (i > 2){
j = j + 1;
i = 0;
context.global.set("counter", i);
context.global.set("mc", j);
}
msg.i = i;
msg.mc = j;
return msg;

4. 評価実験

・2021年11月17日8:15~2021年11月18日7:50まで、SIP実験室前で評価実験を実施した(図3)。
・人物を検出するたびに時間とデータを記録しており、結果を集計した(図4)


【課題】
・18時42分以降、センサ出力値が異常になり、すべてのデータを保存していた。
  異常値:-1185
 再起動後、正常値を出力している。
 ⇒ フェールセーフ機能必要。通常,負の値は取らないので、負の値を検出して、プログラムのリスタートを入れる必要がある。
・人物検出のアルゴリズムに課題あり。
 距離の出力が平均値の2/3以下になったら、人物検出としているが、廊下の反対側の端の方を歩いておられる場合、検出できなかったのを目視した。
 ⇒ 数値をもう少し大きめにする必要あり。誤検出とのバーター。                                       図3.実験風景

図4. 実験結果

Appendix.1 マン・カウンタのダッシュボード画面とエディタ画面

図A-1. ダッシュボード画面

図A-2. Node-RED フロー画面

Appendix  2.  MQTT通信の実現

A2-1. Pythonでの準備

  1. VL53L1Xのライブラリをインストール
    $ python3 –m pip3 install vl53l1x
  2. MQTTのライブラリをインストール
    $ python3 –m pip3 install paho.mqtt

A2-2.Publish側のpythonプログラムを作成

#added for MQTT のコメントの3行がMQTT用に追加したプログラム


### ToF_test3.py
# MQTT publish version

import VL53L1X
import time
import paho.mqtt.publish as publish       # added for MQTT

tof = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29)
print("Python: Initialized")
tof.open()
print("Python: Opened")

time_start = time.time()

try :
    while True:
        ### ------------------- get_time ----------------- ###
        time_end = time.time()
        time_elapsed = time_end - time_start

        print("")
        print("--- Time : {:.2f}s ---".format(time_elapsed))

        ### ------------------- get_distance ----------------- ###
        ### --- Medium Range --- ###
        tof.start_ranging(2)    # 2 = Medium Range
        distance_mm = tof.get_distance()
        print("Medium Range Distance: {}mm".format(distance_mm))
        tof.stop_ranging()
        json_data = '{"Distance":'+str(distance_mm)+'}'                 # added for MQTT
        publish.single("/VL53L1X",json_data,hostname="192.168.11.43")   # added for MQTT
        print(json_data)
        time.sleep(0.05)

except KeyboardInterrupt:
        print("\nCtrl+C")

A2-3.Node-RED側の準備

  1. MQTT Brokerの配置

  2. MQTT Subscribeの配置