Raspberry Pi-Stereokamera-Frame-Synchronisation/Genlock (Video oder Standbild)

Ich muss eine Stereokamera für eine Computer-Vision-Anwendung synchronisieren. Die Synchronisation sollte bestmöglich sein, hoffentlich auf Millisekunden-Niveau. Ich möchte entweder als Video oder als Standbild etwa 10 FPS erhalten. Die Auflösungsanforderung liegt bei etwa 2 Mpix.

Die Anwendung wird ein mobiler Stereo-Straßen-/Geländescanner von einem Pkw sein, der tagsüber bis zu 100 km/h schnell ist (also gute Lichtverhältnisse). Laut diesem und diesem Video sollte Rolling Shutter kein Problem mit der Pi-Kamera bei FullHD sein .

Meine aktuelle Hardware-Suche ist bei einer Raspberry-Pi-Lösung gelandet. Ich denke grundsätzlich habe ich 2 Möglichkeiten damit:

  1. Holen Sie sich zwei eigenständige Raspberry Pi-Einheiten mit jeweils einer Kamera. Synchronisieren Sie sie über einen externen GPIO-Trigger. Die Kosten betragen 2x25+2x16 = £82.

  2. Holen Sie sich das neue Compute Module Development Kit und verbinden Sie beide Kameras mit dem Single Board. Koppeln Sie die beiden Kameras für eine simultane Auslösung per Software. Die Kosten betragen 126+16+16 = £158.

Werden beide Optionen ähnliche Synchronisierungsergebnisse haben? Außerdem möchte ich lieber eine Standbildausgabe als eine Videoausgabe, da ich sowieso bestimmte Frames aus dem Video extrahieren muss. Die Standbilder wären vorzugsweise unkomprimiert, um keine Bilddetails zu verlieren, aber JPEG ist auch in Ordnung. Ich bin mir nicht sicher, wie viele FPS der externe GPIO-Trigger mit Standbild machen kann.

Die Kosten sind für mich ein wichtiger Faktor. Die Verwendung von USB-Webcams wird wahrscheinlich nicht funktionieren, da USB-Geräte nicht einfach synchronisiert werden können (siehe Link unten). Ich freue mich über eine weitere Hardwareempfehlung, wenn jemand bessere Sachen in einer ähnlichen Preisklasse kennt.

Der Ursprung dieser Frage liegt auf der Website von Video Production SE in einem Beitrag mit dem Titel „ Synchronisierte Stereovideos mit 2 Kameras zu niedrigen Kosten erstellen“ . Dieser Link kann etwas mehr Hintergrund enthüllen.

Sie möchten eine Raspberry Pi-Kamera oder eine USB-Webcam verwenden?
Wie hohe Auflösung benötigen Sie? Welche Lichtverhältnisse?
Ich habe der Frage weitere Informationen hinzugefügt, je nachdem, wonach Sie fragen. Ich plane, eine Pi-Kamera zu verwenden, keine USB-Webcams (USB kann nicht synchronisiert werden).
AFAIK, für Kameras wie OV5640 gibt es keine klar dokumentierte Möglichkeit, die Frame-Synchronisation unter Linux auf Einzelbildebene im Videomodus durchzuführen. Sie haben vielleicht mehr Glück mit Standbildern, sind aber immer noch durch das Nicht-Echtzeit-Design von Linux eingeschränkt.
Eine ähnliche Frage wurde bei Raspberry Pi SE gestellt .

Antworten (2)

Ich denke, Ihre beiden Optionen/Ideen (Pi und Compute) können funktionieren.

Raspberry Pi GPIO ist schnell genug (10 MHz+), das Lesen des GPIO-Eingangsstatus jede Millisekunde ist überhaupt kein Problem.

Wenn Sie Daten auf dem Raspberry Pi mit OpenCV oder ähnlichem verarbeiten möchten - erwarten Sie nicht zu viel, die Pi-CPU ist nicht so schnell, wie manche Leute denken. Führen Sie einige Experimente mit vorab aufgezeichneten Videos oder Bildern durch und sehen Sie, wie viel Rechenleistung Sie haben.

Wenn Sie feststellen, dass Raspberry nicht schnell genug ist, können Sie Folgendes verwenden (für die Bildverarbeitung):

Nvidia Jetson TK1-Entwicklungskit

- NVIDIA Kepler GPU with 192 CUDA cores
- NVIDIA 4-Plus-1 quad-core ARM Cortex-A15 CPU
- 2 GB memory, 16 GB eMMC
- Gigabit Ethernet, USB 3.0, SD/MMC, miniPCIe
- HDMI 1.4, SATA, Line out/Mic in, RS232 serial port
- Expansion ports for additional display, GPIOs, and high-bandwidth camera interface

Ich weiß nicht viel darüber, habe nur irgendwo über diese Nvidia-Produkte gelesen, aber es kostet weniger als das Pi-Compute-Modul (192 USD sind 115 GBP?), Und es gibt viel mehr Rechenleistung.

Vielen Dank für Ihre Antwort! Ich plane keine CV-Verarbeitung auf dem Pi. Ich muss das Video nur bildsynchron aufzeichnen und alle anderen Arbeiten erledige ich am PC. Wissen Sie nicht, ob es möglicherweise ein anderes Board auf dem Markt gibt, das möglicherweise 2 CSI-Schnittstellen (oder andere Kameraschnittstellen, aber keine USB-Kamera) hat und billiger als das Compute Module Kit ist und die gleiche Aufgabe erfüllen könnte?
Haben Sie die Zeit überprüft, die das PI-Kameramodul benötigt, um ein Bild aufzunehmen, und wie groß die Abweichung in dieser Zeit ist? Ich denke, Sie haben möglicherweise Probleme mit der Genauigkeit auf ms-Ebene, nicht wegen des Auslösemechanismus über GPIO, sondern wegen der Verzögerungen zwischen dem Auslöser und dem aufgenommenen Foto. Auch an einem bewölkten Tag ist eine Verschlusszeit von 10 ms (1/100) keine Seltenheit.
@Kozuch Ich denke, das Compute Module Kit ist das billigste Gerät mit zwei CSI-Schnittstellen.
@RJR Ich habe die Reaktionszeit der Pi-Kamera nicht getestet, ich habe keine. Ich habe für mein CV-Projekt eine billige USB-Kamera von Logitech verwendet.
@RJR: Eine Verzögerung zwischen dem Auslöser und der Aufnahme des Fotos macht mir nichts aus, da sie für beide Pi-Einheiten genau gleich ist. Natürlich wäre eine lange Verzögerung nicht schön, aber auch hier ist mein Hauptziel die Frame-Synchronisation. Ich denke, beide Einheiten sollten sich genau gleich verhalten, falls ich eine 100% gleiche Installation und Einrichtung durchführe?
@Kozuch - Das Problem ist, dass die Triggerlatenz möglicherweise nicht deterministisch ist, da Linux im Hintergrund möglicherweise etwas anderes tut. Linux ist kein Echtzeitbetriebssystem. Sie können mit dem durchkommen, was Sie wollen, aber jedes Echtzeitverhalten wird ziemlich spröde sein und wahrscheinlich kaputt gehen, wenn Sie das System überhaupt laden.
@ConnorWolf: Würde meine Option Nr. 2 (unter Verwendung des Compute-Moduls mit 2 Kameras darauf) mögliche Probleme mit der Triggerlatenz beseitigen, da sie einen SW-Trigger verwenden würde, der tatsächlich niedriger sein könnte als der GPIO-Trigger?
@Kozuch - Ich glaube nicht, obwohl es wahrscheinlich etwas besser wäre. Das Problem ist das Delta zwischen dem Zeitpunkt, an dem Sie das Bild aufnehmen möchten, und dem Zeitpunkt, an dem die Hardware das Bild tatsächlich aufnimmt. Wenn Linux einen anderen Thread bedient, müssen Sie auf den nächsten Kontextwechsel warten, damit Ihr Thread tatsächlich etwas tut.
@ConnorWolf: Die Bild-/Videoaufnahme wird die einzige Aufgabe in meinem Pi-Setup sein und es wird keine andere Last geben. Einheiten werden von allen COMs (Ethernet usw.) getrennt. Allerdings muss ich Ihnen auf theoretischer Ebene mit RTOS zustimmen. Aber RTOS mit Stereokamera ist ein völlig anderes Preisniveau, oder? Die Frage ist, wie viel von der RTOS-Fähigkeit eine saubere Raspbian-Installation liefern kann. Wenn ich einfach innerhalb weniger ms (z. B. unter 10 ms) eine Synchronisierung erhalte, ist dies für mich in dieser Preisklasse immer noch ein großartiges Ergebnis.
@Kozuch - Wenn Sie 10 ms statt 1 ms fotografieren, ist das meiner Meinung nach viel handhabbarer. Wirklich, es wird / wahrscheinlich / funktionieren, ich möchte nur sichergehen, dass Sie sich der möglichen Komplikationen bewusst sind, insbesondere wenn Sie sich später entscheiden, dem laufenden rPi weitere Aufgaben hinzuzufügen.
Wirklich, das Ausführen eines RTOS bedeutet nicht, dass es etwas mehr kostet, Sie könnten es theoretisch sogar direkt auf dem rPi machen (Bare-Metal ausführen). Das Problem ist meist die fehlende Dokumentation.
Mit einer Latenz eines Standard-Raspbian-Kernels wird es wahrscheinlich nicht so schlimm sein: emlid.com/raspberry-pi-real-time-kernel-available-for-download Ich denke, dies kann als weiche Echtzeit angesehen werden und meinen Bedürfnissen besser entsprechen dann genug (unter Berücksichtigung von 1 ms Genauigkeit)? Die Durchschnittswerte sind fast gleich.

Nach vielen Recherchen und sogar dem Versuch, 2 RPis mit jeweils einer Kamera für eine Frame-synchronisierte Stereoaufnahme einzurichten, kam ich nicht wirklich dazu, die Synchronisation visuell genau zu messen, aber ich erkannte genau dies zu diesem Zeitpunkt aus verschiedenen Diskussionen und Tech Spezifikationen:

Obwohl es möglich ist, RPi-Boards selbst über ein gemeinsames GPIO-Signal zu synchronisieren (für welche Aufgabe auch immer), ist es nicht möglich, ihre Kameras für eine kontinuierliche Stereoaufnahme zu synchronisieren. Der Hauptgrund ist, dass die Kamerasensoren und -platinen keine externe Triggerfunktionalität unterstützen (weder v1 OmniVision OV5647 noch v2 Sony IMX219PQ Kameraplatine). Der OV5647 hat tatsächlich einen sogenannten FREX-Eingangspin , der für die Frame-Synchronisation verwendet werden könnte, aber er wird weder vom Sensor zur Platine geführt, noch wird er im offiziellen RPi-Kameratreiber/Software unterstützt. Das ArduCam-Board hat eine FREX-Pinbelegung an Bord, aber noch keine Software, um sie zu verwenden.

Es kann jedoch möglich sein, eine einzelne Aufnahme zu synchronisieren (kein kontinuierliches Stereo). Ich schätze, es gab ein Projekt für eine Bullet-Time-Fotografie . Ich habe ihren Python-Code auf Github untersucht(kann mich jetzt nicht an den genauen Projektnamen erinnern) - sie haben RPis über Ethernet synchronisiert und dann raspistill binär synchron für einen einzigen Schuss aufgerufen. Ich denke, das kann funktionieren, auch wenn es zu Beginn von Raspistill eine Verzögerung von 1000 ms gab, damit Kameras die Belichtung einstellen können (das Timeout ist bei allen Kameras gleich, daher sollte die Synchronisierung immer noch funktionieren). Ich denke jedoch, dass unterschiedliche Belichtungszeiten ein Problem mit PiFace sein können. Sobald Raspistill gestartet ist (und hoffentlich nach dem ersten Frame), wechselt der Sensor in den sogenannten „freilaufenden Modus“, in dem das Video vom Sensor mit einer bestimmten FPS gestreamt wird. Da jede Kameraplatine über einen eigenen Oszillator verfügt, sind die FPS für zwei Platinen niemals 100% gleich, selbst wenn sie gleichzeitig gestartet werden, und die Frames driften voneinander ab, je länger das Video läuft.

TL;DR:

Während es möglich sein mag, eine einzelne Stereoaufnahme zu synchronisieren, ist es nicht einfach möglich, zwei RPi-Kameraplatinen für eine kontinuierliche Stereoaufnahme zu synchronisieren, da die Sensoren der Kameras keine externe Triggerfunktion haben.

Eine andere Möglichkeit, dieses Problem anzugehen, besteht darin, die Kamerauhr zu gaten. Wenn die von Ihnen gewählte Kamera von einer externen Taktquelle abhängt, wie z Referenztakt für ein paar Zyklen, um ihn zu verlangsamen).
@ user3528438 Wird die automatische Belichtung (= verschiedene Frame-Belichtungszeiten auf den Kameras) die Synchronisation ruinieren oder gibt es eine Regel, dass die Belichtungszeit nicht länger als 1/FPS werden darf?
Ich habe kein Kamera-Datenblatt und keinen Firmware-Code so gründlich gelesen, um Ihnen so oder so etwas sagen zu können, aber meine Erfahrung mit ov5640 in diesem Referenzdesign-Kit e-consystems.com/CX3-Reference-Design-Kit.asp bestätigt, dass die FPS-Einstellungen außer Kraft gesetzt werden Automatische Belichtung: Das aufgenommene Video ist in Innenräumen im 60-FPS-Modus deutlich dunkler als im 15-FPS-Modus.