[PYTHON] Visualisez la congestion des événements dans l'espace public avec un télémètre laser
Aperçu
- Une expérience a été tentée pour compter et visualiser l'état de congestion des Marches dans l'espace public sur une période de deux jours.
- Il est nécessaire de réduire l'entrée et la sortie pour mesurer le volume du trafic, le nombre de personnes séjournant et la durée du séjour. Cette fois, le nombre de personnes passant à un certain point du site est considéré comme le degré de congestion.
- Le nombre de visiteurs à l'événement est une donnée précieuse. Essayez de voir combien vous pouvez compter sans surveillance
- Nous tenons à remercier la Conférence de développement de la ville d'Ekikita (https://ekikita.jp), qui gère la zone à la sortie nord de la gare d'Hiroshima.
【référence】
À propos de la gestion de la zone (Ministère du foncier, des infrastructures, des transports et du tourisme)
https://www.mlit.go.jp/common/001059393.pdf
Revitalisation régionale Développement de la ville - Gestion de la zone - (Secrétariat du Cabinet Ville / Personnel / Secrétariat du siège de la création du travail)
https://www.kantei.go.jp/jp/singi/sousei/about/areamanagement/areamanagement_panf.pdf
Que préparer
- Raspberry Pi3 modèle B (4 est probablement correct)
- Cas pour Raspberry Pi
- Dissipateur de chaleur et ventilateur pour Raspberry Pi
- Raspberry Pi3 Model B B + ensemble d'alimentation compatible (5V 3.0A)
- Capteur de distance à ultrasons vl53l1x (plage de mesure maximale 4 m)
- LED, résistance 330Ω
- Trépied de magasin de 100 yens
- Boîtier AirPods acheté dans un magasin de 100 yens (utilisé comme couvercle de capteur)
Préparation
- Configurez Raspberry Pi pour pouvoir vous connecter au Wifi.
https://www.raspberrypi.org/downloads/
- Rendre la bibliothèque Ambient (service de visualisation IoT) disponible.
- Créez un tableau de bord dans Ambient et obtenez l'ID de canal et la clé d'écriture.
https://ambidata.io/refs/python/
- Rendre la bibliothèque vl53l1x pour Python disponible
https://github.com/pimoroni/vl53l1x-python
Assemblée
- Connectez Raspberry Pi, capteur de distance laser et LED comme suit
programmation
- Programmation avec Python3 pour utiliser une bibliothèque à usage général
- Modifiez et utilisez distance.py dans le dossier des exemples de la bibliothèque clonée git
- La valeur du capteur de distance laser est bouclée et lue, et le nombre en dessous du seuil est compté comme le nombre de passes.
- Allumez / éteignez la LED connectée à la broche GPIO à chaque fois que vous comptez
- Envoyer les comptes toutes les 5 minutes à Ambient pour la visualisation
distance.py
#!/usr/bin/env python
import time
import sys
import signal
import VL53L1X
import ambient
import datetime
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(25, GPIO.OUT) #Pour le clignotement de la LED
from time import sleep
print("""distance.py
Display the distance read from the sensor.
Uses the "Short Range" timing budget by default.
Press Ctrl+C to exit.
""")
ambi = ambient.Ambient(xxxxx, 'xxxxxxxxxxxxxxxx') #← ID du canal ambiant et touche lumière
count = 0
sndcnt = 0
# Open and start the VL53L1X sensor.
# If you've previously used change-address.py then you
# should use the new i2c address here.
# If you're using a software i2c bus (ie: HyperPixel4) then
# you should `ls /dev/i2c-*` and use the relevant bus number.
tof = VL53L1X.VL53L1X(i2c_bus=1, i2c_address=0x29)
tof.open()
# Optionally set an explicit timing budget
# These values are measurement time in microseconds,
# and inter-measurement time in milliseconds.
# If you uncomment the line below to set a budget you
# should use `tof.start_ranging(0)`
tof.set_timing(66000, 70)
tof.start_ranging(0) # Start ranging
# 0 = Unchanged
# 1 = Short Range
# 2 = Medium Range
# 3 = Long Range
running = True
def exit_handler(signal, frame):
global running
running = False
tof.stop_ranging()
print()
sys.exit(0)
# Attach a signal handler to catch SIGINT (Ctrl+C) and exit gracefully
signal.signal(signal.SIGINT, exit_handler)
while running:
distance_in_mm = tof.get_distance()
print("Distance: {}mm".format(distance_in_mm))
now = datetime.datetime.now()
minute = '{0:%M}'.format(now)
second = '{0:%S}'.format(now)
print(minute)
print(second)
if distance_in_mm < 1300: #Seuil de comptage ou non(mm)
count += 1
GPIO.output(25, GPIO.HIGH) #LED clignotante
sleep(0.5)
GPIO.output(25, GPIO.LOW)
sleep(0.5)
if int(minute) % 5 == 0 and int(second) == 0:
if sndcnt < 1:
r = ambi.send({'d1': count})
if r.status_code != 200:
continue
print(count)
print("***sended***\n")
count = 0
sndcnt += 1
else:
sndcnt = 0
time.sleep(0.1)
État d'installation sur site
résultat
- Il n'a pas été possible de compter normalement pendant toute la durée de l'événement.
- Ajustement Bien que des ajustements aient été faits localement, comme le changement de l'emplacement d'installation et du seuil, un comptage stable n'était pas possible.
Fond rouge: la partie où les données ont été acquises
Fond bleu: réglage
Fond gris: après l'événement
Contenu de bogue
- La valeur du télémètre laser n'est pas stable. La stabilité change en fonction du matériau de l'objet (pierre, bois, papier) et de l'inégalité de la surface.
- Le passage d'une personne sera compté comme deux ou trois personnes. (Il s'est amélioré dans une certaine mesure en mettant une attente quand il a été détecté)
- Il semble qu'il y ait une grande différence de luminosité et de stabilité entre le moment où il n'est pas exposé au soleil et celui où il n'est pas exposé au soleil.
- Une fois toutes les quelques heures, j'obtiens une erreur HTTP MaxRetryError pour une URL d'api ambiante.
Comme il fonctionne depuis plus de 10 heures à domicile en Wifi, il est fort possible que cela soit dû à l'équipement Wifi loué sur place.
Pour le futur
- Il est difficile d'organiser un événement en salle en raison du tourbillon corona, mais nous continuerons d'abord à faire des ajustements afin de pouvoir compter de manière fiable à l'intérieur.
- Pour les problèmes difficiles à compter à l'extérieur, envisagez d'autres types de capteurs
- Lorsque vous utilisez un télémètre de type ToF, préparez un objet qui peut refléter de manière stable.
- Il est nécessaire de tester à l'avance s'il y a un problème de connexion à long terme dans l'environnement Wifi local.