Posted on 1 Kommentar

Technischer Tiefgang

Viele Leute haben uns gefragt, was das Besondere an unserem Unleashed ist. Man sagt, dass der Teufel im Detail steckt, also wollten wir einige der technischen Details vorstellen, die das Unleashed wirklich auszeichnen. Jetzt wird’s richtig nerdig, also schnallt euch an 🤓

Wo fangen wir an?

Wir haben mit bis zu 8 Entwicklern gleichzeitig am Unleashed gearbeitet, und das über einen Zeitraum von etwa 5 Jahren! Allein die Firmware besteht aus rund einer Viertelmillion Zeilen Code! Für alle, die nicht wissen, was das bedeutet: Das ist SEHR VIEL!

Das Unleashed hat zwei Hauptkomponenten – einem Bluetooth-Modul, das auf einem Nordic-Chipsatz basiert, und einem Mikroprozessor von STM. Der STM ist für die Kommunikation mit der Kamera zuständig. Er implementiert eine USB-Host-Instanz, zwei serielle Protokolle und GPIOs. Der Nordic Chipsatz ist für die Kommunikation mit der App und dem Bluetooth-Zubehör zuständig, das direkt mit dem Unleashed gekoppelt ist.

Hier ist das Besondere, was diese ~250000 Zeilen Code noch unglaublicher macht: Der STM hat nur 128 Kilobyte RAM und 256 Kilobyte Speicher, der Nordic nur 64KB RAM, aber etwas mehr Speicher.

Das bedeutet, dass wir keine der verfügbaren Bildverarbeitungsbibliotheken oder SDKs zur Steuerung der Kameras verwenden können sondern alles von Grund auf selbst programmieren mussten. Wir programmieren Bare-Metal – d. h. wir verwenden nicht einmal ein Betriebssystem! Wir mussten extrem vorsichtig mit unseren sehr, sehr begrenzten Ressourcen umgehen, was zu einem sauberen und effizienten Code geführt hat – zwangsläufig. Und das führt zu einer großartigen Benutzererfahrung für Euch! Das Traurige daran ist, dass die meisten Dinge, auf die wir so viel Mühe gesteckt haben, niemandem auffallen werden. Weil es halt einfach so funktioniert, wie man es erwartet! Leider bemerken wir normalerweise immer nur die Dinge, die nicht so funktionieren, wie sie sollten.

Da ich sehr stolz auf unsere Errungenschaften bin, möchte ich dieses Update nutzen, um einige der Dinge hervorzuheben, die Ihr wahrscheinlich sonst nie bemerken würdet.

USB-Protokoll-Wahnsinn

Mit Ausnahme von Nikon, die eine ausgezeichnete Dokumentation über das von ihnen verwendete USB-Protokoll bereitstellen, mussten wir dieses Protokoll für alle anderen Kameramarken reverse-engineeren. Dieses Protokoll nennt sich PTP/MTP, für das es tatsächlich einen gut definierten Standard gibt. Was wir wirklich seltsam fanden, ist, dass aus uns unerfindlichen Gründen jeder Hersteller seine eigene seltsame Erweiterung dieses Protokolls hat, anstatt es so zu verwenden, wie es bereits in der Norm definiert ist. Auch hier bildet Nikon eine Ausnahme, und vielleicht ist das ein Grund dafür, dass sie gerne alle Details ihrer API veröffentlichen. Ihr könnt euch nicht vorstellen, wie oft wir Entwickler, wenn wir endlich herausgefunden haben, wie etwas bei einem bestimmten Hersteller funktioniert, kollektiv den Kopf geschüttelt und gefragt haben: „Warum???“. Das ist der Grund, warum es nicht so einfach ist, neue Hersteller in unsere Kompatibilitätsliste aufzunehmen. Das Standard des Protokolls deckt eigentlich die meisten Kamerafunktionen ab und bietet einfache Möglichkeiten zur Erweiterung, aber statt dies zu nutzen macht jeder einzelne Hersteller (außer Nikon) sein eigenes Ding ob drauf.

Aber das sind nur die Basics. Nachdem wir alles herausgefunden haben, was wir konnten, gab es immer noch so viele Fälle, in denen wir uns fragten, warum sie nicht einfach auch diese andere Kleinigkeit machen konnten, um allen das Leben leichter zu machen. Stattdessen mussten wir komplizierte Umgehungslösungen für Dinge einführen, die von vornherein hätten funktionieren sollen.

Nikon-Video

Nach all dem Lob hier eine Nikon-Kuriosität. Aus irgendeinem Grund hat Nikon beim Starten von Liveview (z. B. für Videoaufnahmen) über USB nicht zugelassen, dass das Liveview-Bild auf dem LCD der Kamera angezeigt wird. Ich nehme an, dass Nikon davon ausgeht, dass die meisten Anwendungsfälle für die Fernsteuerung über USB darin bestehen, einen größeren Bildschirm wie einen Laptop hinzuzufügen, und daher erwartet, dass das Liveview-Bild über USB übertragen wird. Das ist ja in Ordnung, aber warum muss man es dann auf dem Kamerabildschirm deaktivieren? Wie auch immer, wir haben eine wirklich coole Lösung dafür gefunden: Wenn der Benutzer eine Videoaufzeichnung aus der App heraus startet, ändern wir schnell eine Einstellung tief im Kameramenü, die es uns ermöglicht, Liveview zu starten, indem wir den Auslöser halb drücken, und eine Videoaufzeichnung zu starten, indem wir den Auslöser ganz drücken. Dann schalten wir das USB-Protokoll aus und ein sekundäres Protokoll ein (dazu später mehr), drücken den Auslöser erst halb und dann ganz durch und können innerhalb kürzester Zeit eine Videoaufzeichnung starten, wobei das Live-View-Bild nun doch auf dem Kamerabildschirm angezeigt wird (und auch über HDMI für diejenigen, die einen externen Recorder haben). Wenn wir das Video anhalten, können wir die Einstellung schnell wieder auf den vorherigen Zustand zurücksetzen. Ziemlich cool, oder?

Nikons 10-Pin-Protokoll und GPS

Das sekundäre Protokoll, das ich erwähnt habe, ist eines, das niemand kennt und das wir selbst erarbeitet haben – und es erlaubt fast alle Funktionen über den 10-poligen Anschluss, an den das Unleashed N1 und N2 angeschlossen sind. Das bedeutet, dass das Unleashed N1 und N2 auch ohne USB Kabel sehr gut funktioniert und fast alle Funktionen des Unleasehd bietet, mit Ausnahme von allem, was mit Bilddaten zu tun hat. Das bedeutet, dass die Bildbetrachtung, die Galerie und die LRT Autoramping Algorithmen nicht funktionieren, aber alles andere schon.

Auf diese Weise können wir euch auch weiterhin die Kontrolle über alle Einstellungen geben, während wir den USB-Anschluss abschalten, um euch die Aufnahme von Videos zu ermöglichen.

Ein Nachteil dieses Protokolls ist, dass es dieselben Pins verwendet, die wir für das GPS-Protokoll der Nikon-Kameras benötigen. Wenn es also mit aktiviertem Geotagging verwendet wird, müssen wir das Protokoll schnell ausschalten, das GPS einschalten und dann ein Foto machen. Dies führt zu einer leichten Verzögerung bei der Auslösung, aber dafür gibt es ja die Einstellung „GPS-Priorität“ – wenn du keine Verzögerungen wünschst, kannst du die Auslöspriorität wählen, auf die Gefahr hin, dass einige Fotos ohne GPS-Daten entstehen.

Ein weiterer Vorteil des 10-poligen Anschlusses von Nikon ist, dass wir über diese Pins viele Informationen über den Zustand der Kamera erhalten. Zum Beispiel, ob die Kamera eingeschaltet ist, ob das Belichtungsmesser gerade läuft, und vieles mehr. Diese Infos nutzen wir um viele Stromsparmechanismen zu implementieren!

Tap-to-trigger

Eine sehr nützliche Information ist auch, wann genau sich der Verschluss öffnet und schließt. Damit lassen sich mehrere coole Funktionen realisieren. Die einfachste ist „Tippen zum Auslösen“. Zunächst haben wir das Drücken des Auslösers in der App zu 100 % mit dem Drücken des Auslösers an der Kamera übersetzt. Als Fotografen sind wir es gewohnt, den Auslöser so lange zu drücken, bis wir das Klicken des Verschlusses hören, um dann loszulassen. Aber bei den ersten Benutzertests, die wir durchgeführt haben, haben wir festgestellt, dass 100 % aller Tester, egal ob sie eingefleischte Fotografen waren oder nicht, den Auslöser in der App nur kurz antippten und sich wunderten, warum die Kamera kein Foto machte! Denn das ist man ja von Apps gewohnt! Und so haben wir in unserer Firmware eine Lösung dafür implementiert: Wenn wir ein “antippen” erhalten, hält das Unleashed den Auslöser der Kamera genau so lange gedrückt, bis es das Öffnen des Verschlusses erkennt – also bis die Kamera die Aufnahme startet! Dann lassen wir den Auslöser so schnell los, dass die Kamera, selbst wenn sie auf die schnellste Serienaufnahme eingestellt ist, nur eine einzige Aufnahme macht! Wenn du den Auslöser in der App gedrückt hältst, drückt das Unleashed den Auslöser der Kamera so lange, bis du ihn loslässt, um Serienaufnahmen oder HDR-Bracketing zu machen.

Minimale Dunkelzeit

Dies ermöglicht es uns auch, die absolut kürzeste Dunkelzeit bei Zeitrafferaufnahmen zu versprechen! Bei den meisten Intervall-timern wird der Auslöser standardmäßig eine oder zwei Sekunden lang ganz gedrückt, bei einigen sogar das von Ihnen eingestellte Intervall minus 1 Sekunde. Dies führt zu einer Dunkelzeit von mindestens dieser Zeit, egal wie schnell die Verschlusszeit ist. Mit dem Unleashed ist sie garantiert kürzer als die Dunkelzeit der Kamera selbst (während sie das Foto macht). Hinzu kommt, dass die meisten Intervall-timer den Auslöser eine halbe Sekunde lang drücken, bevor sie ihn ganz durchdrücken, für den Fall, dass die Kamera fokussieren muss. Dies verlängert die Dunkelzeit um eine weitere Sekunde und führt in den meisten Fällen dazu, dass man bei längeren Belichtungszeiten die Bilder gar nicht mehr auf dem Kamerabildschirm betrachten kann. Da das Unleashed die Information hat, ob die Kamera auf Autofokus eingestellt ist oder nicht, können wir die Zeit des halben Drückens komplett überspringen. Und da man den Autofokus bei Zeitrafferaufnahmen nicht verwenden sollte, warnt die Unleashed App bei der Einrichtung des Zeitraffers sogar davor. Es gibt eine Handvoll Fälle, in denen wir doch vorab halb-drücken, z.B. wenn Geotagging aktiviert ist, und wir alles dafür tun, um sicherzustellen, dass die GPS-Daten in jedem einzelnen Foto enthalten sind.

Wir haben ähnliche Mechanismen bei mehreren anderen Kameramarken, und da wir bei diesen über USB auslösen, können wir der Kamera oft auch einfach sagen, dass sie ein einzelnes Bild aufnehmen soll, anstatt ihr zu sagen, dass sie den Auslöser halb oder ganz drücken soll. Mit anderen Worten, kein Intervallometer auf dem Markt kann eine kürzere Dunkelzeit haben als das Unleashed!

LED im Dunkeln

Wo wir gerade beim Thema Auslösen sind: Wir haben eine schöne RGB-LED im Unleashed, die Ihnen auf einen Blick zeigt, was im Unleashed passiert. Da eine der vielen Stärken des Unleashed in der Nachtfotografie liegt, kann selbst eine sehr schwache LED eine Aufnahme komplett verändern und einen ganzen Raum erhellen! Aus diesem Grund schaltet das Unleashed die LED automatisch für die gesamte Dauer der Aufnahme ab. Selbst wenn man an der Kamera selbst auslöst (bei den meisten Kameras), schalten wir die LED aus. Das sind die Art von Details, die du in Produkten, die nicht von oder zumindest mit Fotografen entwickelt wurden, nie sehen wirst. Und apropos LED: Im Leerlauf pulsiert die LED des Unleashed langsam in Farben, die den Verbindungsstatus anzeigen. Wir haben verschiedene Pulsiermuster getestet, und die meisten sahen einfach falsch aus. Das bei weitem natürlichste Muster war eine Sinus-Kurve. Weisst du noch, dass wir sagten, wir hätten nur begrenzte Hardware-Ressourcen? Genau. Trigonometrische Funktionen basieren immer auf Fließkommazahlen und benötigen eine Menge Ressourcen. Sowohl im Speicher, um die komplexen Funktionen zu speichern, als auch in der Ausführungszeit, da die Arbeit mit Fließkommazahlen allein schon „teuer“ ist und die Trigonometrie noch viel mehr. Stattdessen durchforsteten wir akademische Paper zu diesem Thema und fanden eine sehr, sehr gute Annäherung – die Sinus-approximierung von Bhaskara I.

Das haben wir dann mit Integer-Logik implementiert, was es extrem effizient und genauso schön wie eine echte Sinuskurve macht. Ziemlich cool, oder?

Es gibt so viele solcher Details in unserer Firmware und unseren Anwendungen, dass es Tage dauern würde, sie alle aufzuschreiben!

Bilddekodierung on the fly

Es gibt einen sehr besonderen Teil unserer Firmware, den ich nicht unerwähnt lassen kann. Unser Bilddecoder. Ich weiß nicht, ob jemand von Ihnen eine Vorstellung davon hat, welche Ressourcen für die Arbeit mit Bildern erforderlich sind. Es ist eine ganze Menge. Normalerweise wird das gesamte Bild in den Arbeitsspeicher geladen, dann wird es vollständig in den Arbeitsspeicher dekodiert, dann werden Berechnungen durchgeführt, und alles wird wieder verworfen. Bei JPEG-Bildern, die leicht 20 Megabyte groß werden und deren dekodierte Version oft über 100 MB groß ist, könnte man meinen, dass dies eine unmögliche Aufgabe für unser kleines Unleashed mit seinen 128 KB RAM ist. Und ja, mit herkömmlichen Methoden wäre es das auch. Deshalb haben wir von Grund auf einen Bilddecoder geschrieben, der JPEG-Bilder dekodieren kann, nur 500 Byte RAM benötigt und Bilddaten in Paketen von jeweils nur 1 Byte verarbeiten kann. Und das alles bei einer Leistung, die auch bei relativ langsamen Verarbeitungsgeschwindigkeiten ausreicht! Das bedeutet, dass wir die Bilddaten nicht speichern müssen, sondern ein Datenpaket verarbeiten, unsere Berechnungen durchführen und es dann wegwerfen können. Wir berechnen und speichern die Histogrammdaten und verwenden sie dann, um die bildbasierten Algorithmen für die automatische Belichtungskorrektur bei Zeitraffern durchzuführen. Und das geschieht einmal pro Intervall. Während wir dabei waren, haben wir auch einen Parser für EXIF-Daten geschrieben, so dass wir einige wertvolle Informationen über jedes Bild in den ersten paar Bytes eines Bildes erhalten, zu den wirklich interessanten Teilen springen und nur diese Teile dann dekodieren müssen, anstatt alles zu dekodieren und nur das zu behalten, was uns interessiert. Auf diese Weise können wir auch die hochauflösenden Vorschaubilder übertragen, ohne die Originale übertragen zu müssen!

Vorschaubilder mit Metadaten

Bei den meisten Kameras werden bei der Übertragung einer hochauflösenden Vorschau die EXIF-Daten des Originals mit den Bilddaten der Vorschaubilder zusammengeführt, wobei natürlich Dinge wie die X- und Y-Auflösung im laufenden Betrieb ersetzt werden. Das macht diese Vorschaubilder noch wertvoller, da sie immer noch alle Metadaten, wie z. B. Geotags, enthalten. Wenn du also die Vorschaubilder in dein iPhones speicherst, kannst dudie Fotos Ihrer Kamera in dem wirklich coolen Album „Orte“ sehen, in dem man alle Fotos auf einer Kartenoberfläche suchen und finden kann.

Wir haben viel an unserem Bilddecoder gearbeitet und sogar eine sehr effiziente Transkodierung von jpeg-Bildern implementiert, um deren Größe im während der übertragung drastisch zu reduzieren. Wir hatten gehofft, die Größe der Liveview-Frames reduzieren zu können, um eine vernünftige Liveview über die geringe Bandbreite von Bluetooth Low Energy anbieten zu können. Aber leider stießen wir nach der Implementierung all dessen auf andere Engpässe, die es uns unmöglich machten, diese Funktion zu veröffentlichen.

Unser Baby

Du hast wahrscheinlich auf unserer Kampagnenseite gelesen, dass das Unleashed nicht nur ein weiteres Produkt ist, sondern unser Baby! Vielleicht verstehst du jetzt ein bisschen besser, was wir damit gemeint haben. Wir lieben das Unleashed und wir geben alles, um es zu dem coolsten Kamerazubehör zu machen, von dem wir persönlich immer geträumt haben!

Gruß aus Berlin.

ZURÜCK ZU INDIEGOGO