Forum: Mikrocontroller und Digitale Elektronik Eigene Stereokamera bauen || OV9281 Stereo


von Geka (geka_akeg)


Lesenswert?

Hey Leute!

*Ausgangssituation*: Ich möchte einen Tennisball tracken und die Pose 
als Input für meine Software nutzen. Ich habe Softwareerfahrung aber 
überhaupt keine Erfahrung mit µ-controllern und hardware.

*Mein Ziel*: Eine günstige Stereokamera, mit global Shutter und hoher 
fps.

Deshalb habe ich als besten Sensor für mein Problem den OV9281 
ausgewählt, das Problem ist dass ich in Deutschland keine in absehbarer 
Zeit erschwingliche Lösung finden konnte um daraus ein Stereo Setup zu 
machen. Hier mal die Optionen die ich sehe:


1) Nutze ein fertiges Stereomodul, dass leider mit 60mm nur eine gerine 
Baseline hat und damit auf meine Entfernungen keine gute Tiefenschätzung 
ermöglicht. Ich finde in Deutschland auch leider keine Variante mit 
flexibler Baseline. Hier ein Beispiel: https://amzn.eu/d/07wDwy99

Kennt jemand irgendwo einen Shop in dem es eine Variante gibt bei der 
die Distanz zwischen den Kameras vergrößert werden kann?

2) Nutze eine USB Version der OV9281, trigger die beiden Kameras mittels 
Arduino und verbinde sie separat mit dem PC. Das Problem ist, ich finde 
einfach keine USB Variante die auch Trigger Kontakte hat.

Weiß jemand ob es irgendwo eine USB Variante der Kamera mit 
Triggermöglichkeit gibt?


3) Nutze die MIPI Version der Kamera. Verbinde sie mit einem rasberry pi 
5 und trigger die kameras auch über den rasberry pi. Hier weiß ich aber 
nicht was für eine latenz ich reinbekomme, wenn ich die beiden mipi 
kameras über den rasberry and meinen rechner schicke. Hier eine Kamera 
mit mipi und trigger kontakten auf der rückseite:
 https://amzn.eu/d/09fOhOtK

Was für eine Latenz bekomme ich über den Rasberry? Schafft er es 
überhaupt die zwei streams über einen usb port and den rechner zu 
schicken?


Was würdet ihr sagen ist die beste Option? Könnt ihr mir irgendwelche 
Shops empfehlen, auf denen solche Hardware in Deutschland verfügbar ist? 
Ich lande immer wieder auf den gleichen shops wie antratek und roboshop 
wo das zeug einfach nicht verfügbar ist.

von Fabian S. (fsasm)


Lesenswert?

Eine flexible Baseline kannst vergessen. Die muss starr und stabil gegen 
Umwelteinflüssen sein (Temperatur, Feuchtigkeit, Vibration) sonst ist 
die Kalibrierung der Kameras kaputt. Eine leichte Verbiegung führt schon 
dazu, dass keine Tiefenwerte berechnet werden. Meistens nimmt man 
Aluminium oder Karbonfasern als Sensorträger. Es gibt Algorithmen, die 
eine kleine Veränderung korrigieren können, aber da kenne ich mich zu 
wenig aus.

Bei Sensoren musst du genau ins Datenblatt schauen. Manche liefern nur 
mehr die halbe FPS, sobald du sie über ein externes Signal 
synchronisierst. Es gibt dedizierte Sensoren, die über eine 
Master-Slave-Kommunikation sich selber synchronisieren und da verliert 
man keine FPS und Exposure wird auch synchronisiert.

Hast du dir auch Gedanken über die Laufzeit der Algorithmen gemacht? Ein 
Tiefenbild mit SGBM braucht viel Rechenleistung. Wenn man hohe FPS, 
niedrige Latenz und eine gute Auflösung haben wollte, hat man früher 
FPGAs genommen. Vermutlich können das die heutigen NV Jetson auch so 
schnell. Pose Detection und Object tracking willst du auch machen. Auch 
das braucht Rechenleistung.

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Bei meinem Arbytegeber wird für so etwas meist auf Jetson AGX ORIN 
Boards und PCIe-Kameras vom Ximea (ximea.com) zurückgegriffen. Diese 
Kameras schreiben ihre Daten direkt per DMA in den Hauptspeicher des 
NVidia Boards, wo die GPU mit ihren 2048 CUDA Cores direkt darauf 
zugreifen kann.

ok, das wirst Du Dir nicht leisten können. Definitiv. Also:
1. Nimm einen Pi5 mit mindestens 4GB RAM
2. Nimm zwei Raspberry Global Shutter Kameras. Jede Kamera an ihrem 
eigenen CSI/DSI Port
3. Die Global Shutter Kameras können für den Betrieb mit externem 
Triggereingang modifiziert werden. Lies hier:
https://www.raspberrypi.com/documentation/accessories/camera.html#external-trigger
4. Die Triggereingänge haben 1.8V Pegel. Du brauchst einen Pegelwandler 
wie 74LVC1T45.
5. Für die Erzeugung der Triggersignal würde ich irgendwas in Richtung 
STM32L0 oder so nehmen. Der läuft auch mit 1.8V. Bedenke, dass die 
fallende Flanke des Triggersignals die Aufnahme startet und den 
elektronischen Shutter öffnet, und die steigende Flanke den 
elektronischen Shutter wieder schließt und die Digitalisierung des 
Bildes startet. Du musst also sehr präzise Frequenz und Pulsbreite 
steuern.

Bei meinem Arbytegeber benutzen wir teilweise gepulste Infrarot-Laser 
zur Beleuchtung des Objektes und lassen dafür den Shutter länger offen. 
Da definiert also die Pulsbreite des Lasers die Belichtungszeit.

fchk
PS: Randbedingung: Da die CSI-Folienleiter nicht länger als 20...30cm 
lang sein dürfen, können die beiden Kameras maximal 50..55cm voneinander 
entfernt sein.

: Bearbeitet durch User
von Geka (geka_akeg)


Lesenswert?

@fsasm
Vielen Dank! Ich möchte natürlich die Baseline nicht flexibel halten, 
mir ging es mehr darum, dass es Systeme gibt die flexibler sind, so dass 
man seine Baseline zu Beginn festlegen kann. Bzgl. Algorithmus werde ich 
lediglich die Position des Balls tracken, nicht die Tiefe des gesamten 
Bildes schätzen, das sollte dann mit hoher fps gehen.

@fchk
Wow danke! Ja die Alternative über teuren Jetson macht für mich keinen 
Sinn, weil ich trotzdem einen weiteren Computer brauche für die Software 
die ich steuern möchte. Du empfiehlst mir also meine zweite Alternative. 
Kannst du abschätzen, ob der rasberry pi 5 es denn schafft 2x720p mit 
120fps an den Pc zu schicken?

Warum brauch ich den Pegelwandler und Signalerzeuger? Kann das der 
Rasberry nicht schon selber? In dem Tutorial siehts zumindest für mich 
so aus: 
https://docs.arducam.com/UVC-Camera/Appilcation-Note/External-Trigger-Mode/OV9281-Global-Shutter/#14-adjust-exposure-manually

Ich würde dann einfach den raspy direkt nutzen und mit einem Steckboard 
das Signal auf beide Kameras spiegeln wollen. Denkst du das klappt?

: Bearbeitet durch User
von Frank K. (fchk)


Lesenswert?

Geka schrieb:

> Kannst du abschätzen, ob der rasberry pi 5 es denn schafft 2x720p mit
> 120fps an den Pc zu schicken?

Schätzen wir mal ab: 1280(X)*720(Y)*3(Bytes pro Pixel bei 24 Bit 
RGB)*120(Bilder pro Sekunde)=316MByte pro Sekunde pro Kamera. Ist also 
schon mehr als ein Gigabit LAN kann. Du musst also entweder mit dem 
Bildformat oder der Farbtiefe runter oder komprimieren, was viele 
Algorithmen überhaupt nicht mögen. Auch eine USB2 Kamera kann das nicht 
ohne Kompression, auch nicht monochrom. Du brauchst also USB3-Kameras.

CSI kann Datenströme im Gigabit-Bereich transportieren. Bei meinem 
Arbytegeber werden die Daten lokal auf dem Orin verarbeitet, weil man 
sonst 25 GBit Ethernet bräuchte.

Ob ein Pi5 für die lokale Verarbeitung reicht, weiß ich nicht. Könnte 
eng werden. Der hat ja keine GPU. Hängt von Deinen Algorithmen ab.

> Warum brauch ich den Pegelwandler und Signalerzeuger? Kann das der
> Rasberry nicht schon selber? In dem Tutorial siehts zumindest für mich
> so aus:
> 
https://docs.arducam.com/UVC-Camera/Appilcation-Note/External-Trigger-Mode/OV9281-Global-Shutter/#14-adjust-exposure-manually

Andere Kamera. Bei den Pi-Kameras ist der Signaleingang halt 1.8V. Wenn 
man da 3.3V Signal draufgibt, gehts kaputt.

Und Du brauchst einen präzisen Zeitgeber. Ein Task auf einem 
Linux-System ist dafür nicht genau genug, das gibt Jitter. Und die 
Pi-Cams haben leider keinen Trigger-Out - dann könnte eine Kamera 
Zeitgeber spielen.

Noch eine Gemeinheit: Wenn Du einen PC verwendet, dann werden sich dort 
mehrere USB-Ports die Bandbreite teilen. Mit einer Kamera funktioniert 
es dann, mit zweien nicht mehr. Wobei USB2 und USB3-Signale völlig 
getrennt verarbeitet werden. Zwei USB2 Kameras auf zwei USB3-Ports 
können daher auch nur 480 MBit/s (60MByte/s) zusammen bekommen, je 
nachdem, wie das intern geschaltet wird.

Deswegen verwenden wir hier bei einigen Sachen PCIe-Kameras. Da kann 
jede Kamera bei PCIe Gen 2 x4 2.5 GByte an Daten pro Sekunde ins RAM 
schreiben.

fchk

von Markus K. (markus-)


Lesenswert?

Geka schrieb:

> Kannst du abschätzen, ob der rasberry pi 5 es denn schafft 2x720p mit
> 120fps an den Pc zu schicken?

Der Imager ist monochrom, oder?
Dann sind 1280x720@120fps mit 8Bit = 110MB/s, bei 2 Kameras das 
doppelte.
Das ist viel. Das geht vielleicht über 2,5GBbps Ethernet drüber.

Frank K. schrieb:
> Ob ein Pi5 für die lokale Verarbeitung reicht, weiß ich nicht. Könnte
> eng werden. Der hat ja keine GPU.

Ein Raspberry Pi ist eine GPU, an die man ein paar ARM-Kerne rangemacht 
hat. Ernsthaft. Zuerst bootet die GPU und die startet dann ARM-CPUs. Sie 
ist aber nicht übermäßig schnell.

von Markus K. (markus-)


Lesenswert?


von Rick (rick)


Lesenswert?

Markus K. schrieb:
> 110MB/s, bei 2 Kameras das doppelte.
> Das ist viel. Das geht vielleicht über 2,5GBbps Ethernet drüber.

GBit-Ethernet schafft 118 MByte/s (mit Jumboframes). Gemessen. Da sollte 
2,5 GBit/s für zwei Streams reichen.

von Markus K. (markus-)


Lesenswert?

Geka schrieb:
> 2) Nutze eine USB Version der OV9281, trigger die beiden Kameras mittels
> Arduino und verbinde sie separat mit dem PC. Das Problem ist, ich finde
> einfach keine USB Variante die auch Trigger Kontakte hat.
>
> Weiß jemand ob es irgendwo eine USB Variante der Kamera mit
> Triggermöglichkeit gibt?

https://docs.arducam.com/USB-Industrial-Camera/Connect-and-Sync-Multi-Stereo-Cameras/Hardware-Trigger-with-External-Signal/

von Geka (geka_akeg)


Lesenswert?

Echt vielen Dank, dass du dir die Zeit nimmst!

Ich hatte oben geschrieben, dass ich auch die OV9281 Kameras nutzen 
möchte, dabei handelt es sich um monochrome Kameras. Und das Tutorial 
von oben benutzt das gleiche Modell, deshalb denke ich dass die OV9281 
schon 3,3V nimmt. Und ja Linux ist kein Echtzeit-Betriebssystem, aber da 
ich ja ein einzelnes Signal über Steckboard splitte, bedeutet das doch 
nur das mein Abstand zwischen den Bildern schwanken kann, aber die 
Bilder der beiden Kameras werden doch immer Synchron sein? Und so lange 
ich einen Zeitstempel bekomme, kann mir ja der Abstand zwischen den 
Bildern relativ egal sein.

von Weingut P. (weinbauer)


Lesenswert?

Geka schrieb:
> kann mir ja der Abstand zwischen den
> Bildern relativ egal sein.

Wenn der Ball am Boden still liegt, ja

von Geka (geka_akeg)


Lesenswert?

Hey Markus!

Leider finde ich die arducam nirgendwo lieferbar in Deutschland.

@weingut aber mit dem pi trigger sollte ich doch trotzdem an die 100fps 
kommen können?

von Geka (geka_akeg)


Lesenswert?

Ich hab noch folgende Option gefunden, was denkt ihr dazu?

Es gibt diese Kamera, die einen USB Anschluss hat aber einen Farbsensor, 
der aber immernoch 90fps schafft:
https://www.amazon.de/gp/product/B0CJ2F23Q4/ref=ox_sc_act_title_1?smid=AB76YQVSI6332&th=1


Ich bräuchte dann nur noch, eine Uhr um beide zu triggern. Und dann muss 
ich irgendwie die beiden ankommenden Bilder am PC Syncen.

von Markus K. (markus-)


Lesenswert?

Geka schrieb:
> Ich hab noch folgende Option gefunden, was denkt ihr dazu?
>
> Es gibt diese Kamera, die einen USB Anschluss hat aber einen Farbsensor,
> der aber immernoch 90fps schafft:
> 
https://www.amazon.de/gp/product/B0CJ2F23Q4/ref=ox_sc_act_title_1?smid=AB76YQVSI6332&th=1

Die macht aber nur JPEG. Ist das gut genug für Deine Anwendung?

von Frank K. (fchk)


Lesenswert?

Geka schrieb:
> Ich hab noch folgende Option gefunden, was denkt ihr dazu?
>
> Es gibt diese Kamera, die einen USB Anschluss hat aber einen Farbsensor,
> der aber immernoch 90fps schafft:
> 
https://www.amazon.de/gp/product/B0CJ2F23Q4/ref=ox_sc_act_title_1?smid=AB76YQVSI6332&th=1

Du bekommst keine rohen 1920*1200 bei 90fps über USB2. Nur komprimiert. 
Und die JPEG-Kompression fällt Dir als Mensch nicht so auf, aber etliche 
Bildverarbeitungsalgorithmen reagieren sehr empfindlich auf 
Kompressionsartefakte. Das willst Du nicht.

Und: Schau mal auf dem dafür vorgesehen PC mit lsusb nach, wie viele USB 
2.0 Root Hubs Du siehst. Wenn Du da nur einen siehst, hast Du genau 
einmal 480MBit/s zur Verfügung. Das reicht dann genau für eine Kamera an 
dem PC, egal wie viele USB-Ports Du hast.

Du willst USB 3.0 Kameras haben.

Sowas wäre was passendes für Dich, aber auch nicht wirklich billig.
https://www.ximea.com/products/usb-vision-industrial/xic-sony-cmos-pregius-usb3-cameras/sony-imx174-usb3-mono-xic-industrial-camera

fchk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.