-
Notifications
You must be signed in to change notification settings - Fork 0
/
E04_Distanzmessung.qmd
212 lines (172 loc) · 11.6 KB
/
E04_Distanzmessung.qmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
---
title: "Distanzmessung"
author: "Pia Bereuter"
date: today
other-links:
- text: Kapitel PDF
icon: file-pdf
href: chapters/E04_Distanzmessung.pdf
code-links:
- text: Ausgangsdaten
icon: file-zip
href: data/E04_Distanzmessung.zip
resources:
- data/E04_Distanzmessung.zip
abstract: "Distanzmessungen sind essentiell im Bereich der Geomatik. Unterschiedliche Messverfahren ermöglichen Distanzmessungen unter anderem Time-of-Flight Sensoren, die in dieser Übung praktisch genutzt und getestet werden."
---
## Einführung
Ziel dieser Übung ist es Distanzmessungen mit dem VL53L5CX Sensor kennen zu lernen und die Sensordaten auszulesen und testen. Der *VL53L5CX* ist ein 8x8 Time of Flight (ToF) Array Sensor, der über eine I2C Schnittstelle mit dem Raspberry Pi verbunden wird und einer Python Library angesteuert werden kann.
**Unterlagen:** *<i class="bi-file-zip"></i> E04_Distanzmessung.zip*
**Vorbereitung**
- Schaut folgende von Video von Adafruit Industries zur Funktionsweise des VL53L5CX Sensors an: [EYE ON NPI - ST VL53L5CX Time-of-Flight Ranging Sensor](https://www.youtube.com/embed/nf527vcKRSE?si=Q2Wm_pS2O1n99-ha)
- Studiere das Datenblatt zum VL53L5CX [@st2021], sowie die *Application Note* [@st2023]
- In welchen Temperaturbereichen kann der Sensor eingesetzt werden?
- Welches ist die höchste Abtastrate für die Distanzfeldmessungen?
- Was sind Anwendungsgebiete für diesen Sensor?
::: {.content-visible when-format="html"}
{{< video https://www.youtube.com/embed/nf527vcKRSE?si=Q2Wm_pS2O1n99-ha >}}
:::
::: {.content-visible unless-format="html"}
![Adafruit - EYE ON NPI - ST VL53L5CX Time-of-Flight Ranging Sensor [Youtube Video](https://www.youtube.com/embed/nf527vcKRSE?si=Q2Wm_pS2O1n99-ha)](images/youtube_adafruit_VL53L5CX.png)
:::
| **Unterlagen** | |
| ---------- | ------------------------------------------------------------ |
| Produkt | [VL53L5CX Breakout](https://shop.pimoroni.com/products/vl53l5cx-time-of-flight-tof-sensor-breakout) |
| Datenblatt | [VL53L5CX](https://cdn.shopify.com/s/files/1/0174/1800/files/vl53l5cx.pdf) |
| GitHub | [vl53l5cx-python](https://github.com/pimoroni/vl53l5cx-python) |
## VL53L5CX 8x8 Time of Flight (ToF) Array Sensor\index{VL53L5CX}
Der VL53L5CX ist hochentwickelter Distanzsensor mit einer 8x8-Multizonenmessung und einem großen Sichtfeld, ideal für Roboter und fortschrittliche Bewegungserkennung. Der mit die Entfernung mit Time of Flight (ToF), also mit der Laufzeit von Licht, indem er einen Infrarotlaser mit geringer Leisten auf ein Ziel schickt und die Zeit misst, die das Licht benötigt, um zurückzukehren.
Dieser Sensor hat eine hohe Genauigkeit und Abtastfrequenz (bis zu 60 Hz) und einen großen Erfassungsbereich (von 2 cm bis 4 m). Besonders interessant ist, dass der Sensor nicht nur eine Messung durchführt, sondern eine 8x8 Matrix mit Messwerten zurückgibt. Das bedeutet, das Bewegungen aus bestimmten Richtungen erkannt werden können oder der Sensor benutzt werden kann um Kollisionen zu vermeiden oder Objekte zu verfolgen ohne dass mehrere Sensoren benötigt werden.
VL53L5CX 8x8 Time of Flight (ToF) Array Sensor Breakout
- 8x8 Multizone readings
- Distance 2cm - 4m
- I2C interface, with address: 0x52
- Python, C Library
![links: VL53L5CX Breakout von Pimoroni, rechts: schematische Darstellung TOF Moduls Quelle: @st2023](images/VL53L5CX_wide.jpg){#fig-vl53l5cx}
## Übungsaufbau
- Schliesse den Raspberry Pi an Monitor, Keyboard und Maus an oder verbinde Dich mit diesem über SSH (und SFTP).
- Erstelle auf dem Raspberry Pi im `Documents` Ordner einen neuen Ordner `VL53L5CX`, in welchem Du Änderungen und neue Dateien für diese Übung speichern kannst.
- Schliesse den Sensor **VL53L5CX** an den Raspberry Pi über die Breakout Garden **I2C** Schnittstelle korrekt an (siehe [E01 Luftqualität](E01_Luftqualitaet.qmd)), so dass die Beschriftung der Anschlüsse am Sensor und bei der Schnittstelle übereinstimmen.
- Kontrolliere mit dem Befehl `i2cdetect -y 1` ob der Raspberry Pi mit dem Sensor verbunden ist. Der Sensor sollte auf der Adresse `0x29` erkannt werden.
- Aktiviere die virtuelle Environment von Python mit `source ~/.env/bin/activate` und kontrolliere, ob die Libraries `vl53l5cx_ctypes` und `st7789` installiert sind mit `python -c "import st7789"` und `python -c "import vl53l5cx_ctypes"`. Bei einer Fehlermeldung muss die jeweilige fehlende Library in der aktivierten virtuellen Environment mit `pip install st7789` oder `pip install vl53l5cx_ctypes` installiert werden.
Wechsle in den Ordner *Documents* und kopiere mit folgenden Befehlen die Library auf Deinen Raspberry Pi.
``` bash
cd Documents
git clone https://github.com/pimoroni/vl53l5cx-python
cd vl53l5cx-python/examples
```
## Aufgabe 1: Distanzmessung Konsole
Teste das Beispiel `test.py` im Ordner *examples*. Dieses Beispiel liest die Werte der 8x8 Time of Flight Messung aus mit Werten zu *motion, distance, reflectance* und *status* aus.
::: hint
Das Script startet langsam, da die Library jeweils die Firmware beim Starten lädt.
:::
Startet das Script mit `python test.py`. Mit `Ctrl+C` kann das Script wieder gestopppt werden. Die Ausgabe sollte in etwa so aussehen (gekürzt):
``` bash
python3 test.py
Uploading firmware, please wait...
Done!
[[ 36 26 2356 543]
[ 38 62 1943 3847]
[ 27 68 530 6744]
[ 14 18 66 458]] [[1254 308 406 2042 365 377 314 237]
[1275 351 397 413 404 403 354 228]
[1297 357 375 432 427 422 391 241]
[1250 348 385 389 415 437 398 315]
[1273 358 358 385 405 429 400 363]
[1238 336 2240 368 424 417 379 336]
[1262 226 2215 180 188 218 202 190]
[ 108 110 113 117 116 120 120 124]] [[23 1 2 30 11 8 27 41]
[16 1 3 4 4 17 43 35]
[23 1 2 6 5 21 58 32]
[21 1 2 4 6 32 62 52]
[27 1 3 5 9 36 65 71]
[27 1 59 5 16 47 52 46]
[26 1 39 6 9 20 20 21]
[13 13 14 14 15 16 17 20]] [[False False False True False False True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False False False False True True True]
[ True False True False True True True True]
[ True False False True True True True True]
[ True True True True True True True True]]
```
Folgendes Code Snippet zeigt eine gekürzte Version des `test.py` Python Beispiels für die Ausgabe der Distanzmatrix.
```{.python}
import time
import numpy
import vl53l5cx_ctypes as vl53l5cx
from vl53l5cx_ctypes import STATUS_RANGE_VALID, STATUS_RANGE_VALID_LARGE_PULSE
print("Uploading firmware, please wait...")
vl53 = vl53l5cx.VL53L5CX() # <1>
print("Done!")
vl53.set_resolution(8 * 8) # <2>
vl53.enable_motion_indicator(8 * 8) # <2>
# vl53.set_integration_time_ms(50)
# Enable motion indication at 8x8 resolution
vl53.enable_motion_indicator(8 * 8) # <2>
# Default motion distance is quite far, set a sensible range
# eg: 40cm to 1.4m
vl53.set_motion_distance(400, 1400) # <2>
vl53.start_ranging() # <3>
while True:
if vl53.data_ready():
data = vl53.get_data() # <4>
# 2d array of motion data (always 4x4?)
motion = numpy.flipud(numpy.array(data.motion_indicator.motion[0:16]).reshape((4, 4)))
# 2d array of distance
distance = numpy.flipud(numpy.array(data.distance_mm).reshape((8, 8)))
# 2d array of reflectance
reflectance = numpy.flipud(numpy.array(data.reflectance).reshape((8, 8)))
# 2d array of good ranging data
status = numpy.isin(numpy.flipud(numpy.array(data.target_status).reshape((8, 8))), (STATUS_RANGE_VALID, STATUS_RANGE_VALID_LARGE_PULSE))
print(motion, distance, reflectance, status)
time.sleep(0.1) # <5>
```
1. Sensor initialisieren und Firmware laden
2. Sensor konfigurieren (Auflösung, Bewegungserkennung, Messbereich)
3. Messung initialisieren
4. Warten 0.1 Sekunden (damit die Ausgabe nicht zu schnell ist)
::: {#exr-distanzmessung}
**Bewegungsmessung**
- Führe das Beispiel `test.py` aus und beobachte die Messwerte.
- Führe unterschiedliche Tests durch, indem Du ein Objekt vor den Sensor hältst und bewegst.
- Vergleiche die Messwerte und kontrolliere die gemessenen Distanzen.
- Untersuche die einzelnen Matrizen und versuche die Bedeutung der einzelnen Werte zu verstehen.
:::
::: {.content-hidden unless-meta="solution"}
::: {#sol-distanzmessung}
Das Beispiel `test.py` liest die Werte der 8x8 Time of Flight Messung aus mit Werten als 4x4 / 8x8 Matrizen zu *motion, distance, reflectance* und *status* aus.
:::
:::
## Aufgabe 2: Distanzmessung mit LCD Bildschirm
Folgende Aufgabe nutzt den 1.54" LCD Bildschirm mit einer 240x240 Pixel Auflösung. Die Library `vl53l5cx_ctypes` enthält mehrere Beispiele, die die Distanzmatrizen für die *Distanz-*, *Bewegungs-* und *Reflektanzmessung* auf dem Bildschirm anzeigen. Die Beispiele sind im Ordner `examples` zu finden.
![Aufbau der Versuchsanordnung für die Distanzmessung mit dem LCD Bildschirm montiert im dem *hinteren* SPI Slot](images/VL53L5CX_LCD.jpg){#fig-vl53l5cx-LCD}
**Vorbereitung**
- Kontrolliert mit `python -c "import st7789"` ob die Library *st7789* installiert ist. Testet auch, ob die Bibliotheken `numpy` und `matplotlib` installiert sind und installiert diese ansonsten mit `sudo apt install python3-matplotlib python3-numpy`.
- Kontrolliere, ob der Raspberry Pi den *Breakout Garden HAT* mit den 2 SPI Anschlüssen und 4 I2C Anschlüssen bestückt ist (@fig-vl53l5cx-LCD).
- Montiere den Bildschirm im hinteren SPI Slot des *Breakout Garden HAT*s wie in @fig-vl53l5cx-LCD, da er sonst die Messung des VL53L5CX Sensors verdeckt.
Führt nun folgende Scripts aus und beobachtet die Ausgabe auf dem LCD Bildschirm. Auch hier braucht es etwas Geduld, da die Firmware beim Starten geladen wird.
- `python distance_240x240_lcd.py`
- `python motion_240x240_lcd.py`
- `python reflectance_240x240_lcd.py`
- `python object_tracking.py`
::: {#exr-distanzmessung-LCD}
**Distanzmessung**
- Führe die Beispiele aus und beobachte die Ausgabe auf dem LCD Bildschirm.
- Untersuche die einzelnen Matrizen und versuche die Bedeutung der einzelnen Werte zu verstehen.
- Führe unterschiedliche Tests durch, indem Du ein Objekt vor den Sensor hälst und bewegst.
- Was passiert wenn Du ein Objekt vor den Sensor hältst? Ist die Form erkennbar?
- Was passiert wenn Du ein Objekt vor den Sensor hältst und bewegst?
- Studiere den Code der Beispiele und versuche die Funktionsweise zu verstehen.
- Überlege Dir Anwendungsfälle für diesen Sensor allgemein und im speziellen für die Geomatik.
:::
::: {.content-hidden unless-meta="solution"}
::: {#sol-distanzmessung-LCD}
Die Distanzmatrix stellt ein grob aufgelöstes Tiefenbild auf dem LCD Bildschirm dar und ist von den ausgegebenen Werten am einfachsten interpretierbar. Auch sind einfach Elemente gut zu erkennen. Schwieriger ist die Interpretation von Bewegung und Reflektanz.
Anwendungsbereiche für diese Sensoren sind z.B. in der Robotik, um Hindernisse zu erkennen und zu umfahren oder in der Automobilindustrie für die Abstandsmessung. Im Bereich der Geomatik liegt die Anwendung von ToF Flightsensoren in der Messtechnik, z.B. für die Erfassung von 3D Punktwolken.
:::
:::
::: {.content-visible when-profile="chapter"}
## Referenzen
:::