Contents
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での準備
- VL53L1Xのライブラリをインストール
$ python3 –m pip3 install vl53l1x - 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側の準備
-
MQTT Brokerの配置
-
MQTT Subscribeの配置