Wir haben eine Kamera entwickelt, um AprilTag und ArTag mit mROS zu erkennen. Verbindung über Uart oder Ethernet herstellen.
Wir haben JeVois und OpenMV ausprobiert, die Vor- und Nachteile erkannt und unsere Kamera zusammengebaut.

Suchen Sie anhand der Daten nach visuellen Tags und der Ausrichtung des Roboters. Wir entwickeln einen
Roboter zum Sammeln von Golfbällen auf der Driving Range . Derzeit verkauft weltweit nur ein Unternehmen einen Roboter, um dieses Problem zu lösen. Der Markt ist sehr vielversprechend und hat uns ermutigt, das Projekt von DIY in ein Technologie-Startup zu verwandeln.
Wenn Sie GPS ohne RTK verwenden, um den Roboter zu navigieren, ist es schwierig, die Genauigkeit zu erreichen, die für die korrekte Suche nach einer Basis und einem Parkplatz erforderlich ist. Mit Real Time Kinematic habe ich Probleme bei der Annäherung an Gebäude. Wir haben verschiedene Optionen ausprobiert und beschlossen, unsere eigene Kamera zu bauen, um am Eingang zur Basis nach einer visuellen Markierung zu suchen.
Teil der Entwicklung des Roboters war das Parken an der Dockingstation, um das Ballfach zu entladen und die Batterien aufzuladen. Wir haben lange darüber nachgedacht, wie wir es parken sollen, waren uns einig, dass der Roboter ein optisch helles Objekt finden und ihm folgen würde.
Die AprilTag- oder ArTag-Tags wurden als Ziel ausgewählt, je nachdem, wie sie sich im Feld zeigten. Weil Wir leiden nicht unter dem
NIH- Syndrom. Die Suche nach Bildverarbeitungskameras mit Unterstützung für diese Marker und Skriptunterstützung direkt an der Kamera hat begonnen.
Erster JeVois
Von dem, was schnell gefunden wurde -
JeVois , entwickelt vom Labor der University of Southern California. Leider musste ich über Amazon nach Russland bestellen, es gab keine internen Wiederverkäufer und anscheinend wird es keine geben - anscheinend werden Marketing und Vertrieb von den Entwicklern selbst durchgeführt (wir waren ziemlich überrascht, als wir von Jevois zu Jevois Inc. wechseln mussten, um eine Kamera zu kaufen und dann nach einem Link zum Verzeichnis suchen - wählen Sie die Kamera irgendwo in der Mitte von 10-12 Positionen aus).

Die ersten Läufe auf dem Computer waren sehr ermutigend. Im Allgemeinen funktionierte alles sofort und sah interessant genug aus. Nach Tests mit Anschluss an die Steuerplatine wurden jedoch vier schwerwiegende Probleme deutlich:
Die in den Werbematerialien angegebenen 60-90 FPS gelten für Auflösungen von 160x120 oder 320x240, die für das Parken überhaupt nicht geeignet sind - eine Erfassung aus einer Entfernung von mindestens 5 Metern ist immer noch wünschenswert. Und damit ein Quadrat aus 6-8 Metern Höhe 160x120 in das Korn fällt, müssen Sie es mindestens einen halben Meter groß machen. Wenn Sie sich ihm nähern, schließt es zuerst den Rahmen vollständig und hört dann überhaupt auf zu erkennen.
Verbrauch von 800mA, während die Stromversorgung nur über USB-Kabel mit Mini-USB erfolgt, die diesem Strom ohne großen Spannungsabfall standhalten können. Es stellte sich als sehr schwierig heraus, ein Kabel mit einer Länge von mindestens einem halben Meter mit solchen Merkmalen zu finden - es wurden ungefähr 15 Optionen ausgewählt, und das Ergebnis war ohnehin nicht sehr zufriedenstellend.
Die Kamera ist entweder nachts blind oder blinkt tagsüber. Die automatische Balance funktioniert über Gut und Böse hinaus.
Die Kamera wird von einem Lüfter gekühlt. Der Lüfter ist sehr klein, die Geschwindigkeit ist hoch - hochfrequentes Geräusch oder einfach ein Quietschen.
Der kreischende Roboter ist das Letzte, was wir tun wollten.
Das Schreiben des Ausführungscodes in die Kamera ist eine separate Unterhaltung - die Installation der Umgebung ist ziemlich verwirrend, und das Zusammenbauen und Hochladen auf die SD-Karte dauert mindestens 2-5 Minuten. Ja, es gibt keinen Blitz - alles befindet sich auf der SD-Karte.
Fazit: Eine Kamera zum Spielen mit Enthusiasten in Innenräumen und bei guter Beleuchtung. Gleichzeitig wäre es wünschenswert, wenn die Enthusiasten Studenten wären - die Benutzeroberfläche, die Dokumentation und die Arbeitsmethoden mit der Kamera erinnerten mich lebhaft an die Laborarbeit der Studenten, bei der der Bequemlichkeit der Arbeit mit dem System und anderen Exzessen fast keine Beachtung geschenkt wurde. Hier geht es natürlich um C ++ - Module. Python-Skripte können über Jevois Inventor bearbeitet werden, aber auch die FPS sind erheblich niedriger. Außerhalb des Geländes überlebte die Kamera nicht einmal zwei Regenfälle, und der Ventilator verstopfte den Schmutz auf dem Feld mit Raumgeschwindigkeit.
Das Ergebnis - es ist nicht für den Einsatz am Roboter geeignet, aber die grundsätzliche Möglichkeit des Parkens wurde bewiesen.
OpenMV 3 und alle seine Varianten

Zum Zeitpunkt der ersten Suche war es einfach nicht verfügbar - es gab eine Kampagne auf
Kickstarter .
Nachdem wir genug mit JeVois gespielt hatten und 100 Dollar in den Müll geworfen wurden, wurde ein Verkäufer mit Lagerbeständen gefunden und 2 Stück gekauft.
Im Allgemeinen sind die Impressionen äußerst angenehm - eine bemerkenswert durchdachte Oberfläche in der OpenMV-IDE, eine transparente Python-Kompilierung, die es bequem macht, die Funktionsweise des Algorithmus zu beobachten und ihn zu debuggen. Hier gab es jedoch Probleme:
- Die Auflösung kann beliebig sein, aber AprilTag kann nur in einem Bereich von nicht mehr als 200 x 200 Pixel gesucht werden. Wir kehren zum Problem des Getreides usw. zurück. Der Entwickler empfahl, zuerst Blobs zu ziehen und dann die darin enthaltenen Codes zu überprüfen. Aber auf etwas anderem als einem einfachen Hintergrund (idealerweise einer weißen Wand) funktioniert dies nicht. Grünes Gras und strahlende Sonne vor dem Hintergrund verwandeln alles in Brei. Plus FPS fällt auf maximal 5.
- Günstiger Omnivisionssensor + günstige Optik = Seifenbild. Optisch ist dies beim Betrachten eines Videostreams nicht sehr auffällig, aber beim Betrachten einzelner Frames ist es deutlich sichtbar.
- Es gibt keinen IR-Vorhang, aber eine IR-Beleuchtung. [WHAAAAT?]
- Es gibt keinen Schutz vor der äußeren Umgebung. Überhaupt nicht.

Das Skript wurde auf dieser Kamera getestet, es wurden mehrere Dutzend Parkläufe durchgeführt. Nachdem der Roboter von Moskau nach St. Petersburg und zurück gerollt war, hörte die Kamera auf zu starten - der Leistungsregler wurde ausgeknockt. Die offensichtliche Maßnahme war Verpackung und Leistungsstabilisierung. Und hier wurde das Interessanteste entdeckt - das Gehäuse mit der richtigen IP für diese Kamera konnte einfach nicht gefunden werden, oder es handelte sich um Boxen mit transparenten Abdeckungen ohne interne Halterungen und dichte Kabelein- / -ausgänge. Als Ergebnis der Suche wurde eine Masse billiger chinesischer Überwachungskameras mit den richtigen Fällen gefunden. Die Kamera wurde gekauft und entkernt, eine zweite Kopie von OpenMV stand anstelle der Platine, alles funktionierte.
Aber Abend und Nacht wurden zu einem fast unüberwindlichen Hindernis - es gibt keinen IR-Vorhang.
Ergebnisse: Die Kamera ist SEHR praktisch für das Prototyping, die Ressourcen sind begrenzt, es gibt überhaupt keinen Schutz vor der äußeren Umgebung (die zweite Kamera ging dann zu einem industriellen Gefrierschrank und überlebte -30 nicht). Nicht gut.
Und dann wurde es für uns sehr interessant, welche Art von Boards wir von chinesischen Kameras bekommen haben
HiSilicon-Klone
Bei sorgfältiger Prüfung stellte sich heraus, dass das Board über einen 2-Kern-ARM, einen DSP-Prozessor, einen IR-Vorhang, eine IR-Beleuchtung und einen anständigen Sensor von Sony verfügt. Das Board ist mit einer Schutzmasse + einem Gehäuse für die Straße versehen. Genau das, was Sie brauchen - es bleibt, Software zu sammeln.
Inside erwies sich als ein ziemlich funktionierender Linux-Klon von HiSilicon + u-boot.
Ich musste das SDK aus chinesischen Quellen herunterladen und mich mit Baugruppen befassen. Im Prinzip wurde auf dem Weg nichts Schreckliches gefunden, außer dass mehrere Dateien im SDK repariert werden mussten - die Linux-Distribution, auf der das SDK ziemlich alt sein würde, und einige Header-Dateien haben sich seitdem geändert. Nun, ich musste die Shell von zsh auf bash ändern. Ich werde die Details weglassen. Dies sollte für immer ein separater Artikel sein.
Diese Ressourcen haben geholfen:Analysieren, Verbindung zur Kamera herstellenBeispiel für ein Software-BaugruppendiagrammDann lief alles nach dem bekannten Schema:

Die meiste Zeit, die benötigt wurde, um das Bild vom Sensor zu erhalten, habe ich den Rest in nur 4 Stunden erledigt und nur den debuggten Algorithmus von Python nach C ++ portiert.
Die Arbeit mit dem Sensor dauerte ungefähr anderthalb Wochen. Natürlich gibt es in diesen Geräten kein / dev / video0, fast nackte Hardware mit direkter Arbeit mit Speicher und Ports.
Wir müssen sofort sagen, dass die Beispiele aus dem SDK ohne Änderungen nur auf den Debug-Boards für diese SDKs funktionieren, da sonst viele kleinere Änderungen erforderlich sind. So lustig es auch scheinen mag, das Hauptproblem besteht darin, festzustellen, welcher Sensor sich in der Kamera befindet, weil Die Chinesen schreiben eine in die Beschreibung, eine andere ist auf der Tafel markiert, das dritte Modell ist in der Software initialisiert. Beispielsweise verfügt die Kamera in der Beschreibung über einen IMX323-Sensor. Die Karte ist mit SC2235 gekennzeichnet. Beim Start in Init-Skripten wird sie als AR130 gestartet und von der Kamerasoftware als SC2235P initialisiert.
Die Gründe für all dies sind recht einfach: Für den Endbenutzer, dass IMX323, SC2235 alle gleich sind, ist das Bild sehr ähnlich. Der Kernel und die Rootfs mit int-Skripten wurden mit minimalen Änderungen aus dem SDK zusammengestellt und haben sich nicht um ein separates Initialisierungsskript für jedes Modell gekümmert - nur die Startparameter waren korrekt, und der Name wurde unverändert gelassen. In der Software für die Arbeit mit der Kamera ist bereits die zweite Initialisierung des DSP mit dem Sensor gestartet, und das genaue Modell der Kamera ist dort bereits kritisch - daher haben die Protokolle bereits das genaue Modell - SC2235P. P - Dies ist wichtig. Es handelt sich um einen anderen Sensor in Bezug auf die Eigenschaften, der sogar mit einer geringfügig anderen Busfrequenz und einer anderen Auflösung als der SC2235 arbeitet.
Der zweite Teil der Quest sind Datenblätter zu Sensoren, die im Großen und Ganzen nicht vorhanden sind. Daher musste ich das hi_i2c-Modul mit Drucken in das Protokoll über printk neu erstellen und in den von der Kamera entfernten Speicherauszug ersetzen, den DSP-Konfigurationsdämpfer des Videoprozessors schreiben und die Konfigurationen von der Arbeitskamera entfernen sowie mehrmals die Treiber aus dem DafangSoftware-Projekt überprüfen. Im Detail zeichnet dies 3-4 separate Artikel, die ich nach NG schreiben möchte.
Am Ende lief alles noch besser als erwartet - selbstbewusste Arbeit an der Erfassung von AprilTag aus 6 Metern Entfernung auch bei fast völliger Dunkelheit, 25-12 fps, PID-Parksteuerung usw.
Das Ergebnis: Es ist das Beste für die Arbeit vor Ort. Viele Dinge wurden berücksichtigt, um sich vor äußeren Bedingungen zu schützen. Das einzige, was nicht vollständig überprüft werden konnte, war die Arbeit in der hellen Sonne, das Wetter seit Oktober hat sich verschlechtert.
Idee für die Entwicklung
Und hier hatten wir eine Idee - wir haben ein Analogon von OpenMV mit viel besseren Hardwarefunktionen und Massenproduktion in der Hand. Es bleibt, die Arbeit mit der Kamera auf die OpenMV-Ebene zu bringen, dort Mikropython zu erstellen, eine bequeme IDE zu erstellen und zu überprüfen, wie aktuelle Skripte von OpenMV funktionieren. Darüber hinaus ist mRos dort vollständig portiert, was die Verwendung solcher Kameras für ROS-Systeme sofort erweitert.
Aus diesem Grund planen wir, OpenMV-Analoga im März und
mROS bis Mai zu liefern.
Um den Preis für die Anpassung der Kamera zu senken, bieten wir sie Ihnen gerne an.
Füllen Sie das Formular aus und wir werden uns mit Ihnen in Verbindung setzen, sobald wir bereit sind, die erste Charge zu bestellen.