Bestimmen Sie die Position eines Kugelgelenks durch Bildverarbeitung

Ich frage mich, ob es möglich ist, die Position eines Kugelgelenks zu erfassen mit:

  • Ein Fotodiodenarray einer optischen Maus , eingebettet in den Sockel
  • Ein bestimmtes Muster, das auf den Ball aufgebracht wird
  • Ein Prozessor, der anhand des freigelegten Teils des Musters erkennen kann, auf welchen Teil des Balls er schaut und wie er ausgerichtet ist.

Ich stelle mir vor, dass etwas Ähnliches wie ein de Bruijn Torus , der auf eine sphärische Oberfläche projiziert werden kann, anstatt auf einen Torus oder eine Ebene, den Zweck erfüllen würde.

Gibt es einen bekannten Algorithmus zum Erzeugen und/oder Decodieren eines solchen Bildes?

Der optische Maussensor ist eine wirklich gute Idee. Sie haben heutzutage viel DSP-Punch und können auf einer Vielzahl von Oberflächen tracken (wie wir alle wissen). Es gibt eine relative Bewegung, so dass die Integration für die Position Ihnen überlassen bleibt.
@tyblu - Wenn Sie sich den Link (de Bruijn Torus) ansehen, scheint er an einer absoluten Positionierung interessiert zu sein.
Wenn Sie ein Kugelgelenk verwenden, gehe ich davon aus, dass etwas aus einer Stelle auf dem Ball herausragt. Wenn das stimmt, können Sie von der Erkennung von Merkmalen auf dem Ball zur Erkennung auf der Grundlage der Position des Links übergehen? Welche Bewegungsbereiche müssen Sie mit diesem Kugelgelenk unterstützen? Hast du eine Grundskizze?
Nach der Idee der optischen Maus habe ich gehört, dass es Trackballs gibt, die eine absolute Positionierung durchführen. In diesem Fall könnten Sie das Gerät mehr oder weniger einfach so verwenden, wie es ist. Auch wenn es nur relativ ist, vielleicht reicht es für deine Bedürfnisse aus und du sparst dir viel Arbeit.

Antworten (4)

Bestimmung der absoluten Position auf einer Kugel

Finden der absoluten Position in einer Ebene

Ja, es gibt mehrere solcher Muster, die zur Bestimmung der absoluten Position auf einer Ebene verwendet werden:

Wenn ein digitaler Stift auf digitalem Papier verwendet wird , sind zwei wichtige Schritte im Algorithmus (a) das Decodieren des vom Stift sichtbaren Teils des Musters in Bits und (b) das Decodieren dieser Bits in eine absolute Position, die angibt, welche Seite darin ist das Notizbuch und eine grobe Position auf dieser Seite. Oder mit anderen Worten, wenn er das System entwirft und entscheidet, wo die Tinte auf das Papier kommt, wählt der Systemdesigner zuerst (b) ein Bitmuster auf einem Raster aus, vielleicht den zyklischen einspurigen Gray-Code, der im Anoto-Adressteppich verwendet wird , oder ein de Bruijn-Torus oder eine Vielzahl anderer Muster von Bits-on-a-Grid. Dann wählt der Systemdesigner (a) eine von mehreren Möglichkeiten, um jedes Bit als Tinte auf Papier darzustellen.

Abufadel, Smietana und Armstrong; "Positionscodierung" gibt eine detaillierte Beschreibung einiger der möglichen Auswahlmöglichkeiten für (a) und (b). Wenn ich das richtig verstehe, verwendet der Anoto-Adressteppich eine Sequenz, die eng mit einer de Bruijn-Sequenz verwandt ist, aber technisch gesehen kein de Bruijn-Torus ist.

Hecht; "Printed Embedded Data Graphical User Interfaces" geben eine detaillierte Beschreibung der DataGlyphs, die er für (a) verwendet, und des "Teppichcodes", den er für (b) verwendet. Jeff Breidenbach und ich verwenden den Ausdruck „ein DataGlyph-Adressteppich“ für diese spezielle Kombination von (a) und (b).

Anpassen eines flachen Musters an eine Kugel

Es gibt mehrere Möglichkeiten, solche "flachen" Muster auf eine Kugel zu projizieren ; vielleicht unter Verwendung einer Projektion wie dem vierseitigen kugelförmigen Würfel oder einer anderen geodätischen Gittertechnik zur Verpixelung der Kugel . Alle diese Vorsprünge haben die eine oder andere Art von Verzerrung (viele Nähte) oder eine andere (viel Dehnung in einigen Bereichen im Vergleich zu anderen) oder eine Art Kompromiss (wenige Nähte und etwas weniger Dehnung); Hoffentlich finden Sie einen, der mit Ihrer Hardware funktioniert.

Native sphärische Muster

  • Wie Nick T erwähnte, zeigt ein "zufälliges Punktmuster" mit ziemlicher Sicherheit viele einzigartige Muster, die nach dem "Kalibrieren" durch Speichern der bestimmten Muster auf diesem bestimmten Ball und ihrer genauen Position auf diesem Ball verwendet werden können, um die absolute Position zu bestimmen. Dadurch wird das Problem der "Projektionsverzerrung" vollständig vermieden.

De Bruijn-Torus

Ich verstehe nicht ganz, warum der de Bruijn-Torus nicht funktionieren würde

Es funktioniert fast .

Ein de Bruijn-Torus funktioniert gut als Bitraster in einem Adressteppich, um die absolute Position auf einer Ebene zu finden. Die beliebtesten Adressteppichsysteme verwenden andere Bitmuster, die einfacher zu decodieren sind als ein De-Bruijn-Torus, obwohl sie erfordern, dass der Sensor etwas mehr Module erkennt.

Ein De-Bruijn-Torus würde auch gut als Bitraster in einem Adressteppich funktionieren, um die absolute Position auf einem Torus oder einem Abschnitt eines Zylinders zu finden – mit sorgfältigem Design könnte das Muster so gestaltet werden, dass es „richtig zusammenpasst“, wenn es den vollen Weg geht um den Umfang eines Zylinders zu kreisen, und um beide vollen Kreise um beide Umfänge eines Torus zu fahren, um "richtig zusammenzupassen".

Beginnend in der Nähe (zum Beispiel) der Stadt Accra, könnte man mit sorgfältigem Design ein Muster entwerfen, das auf einem de Bruijn-Torus basiert, der ein schmales Band in der Nähe des Äquators vollständig bedeckt und "richtig zusammenpasst", indem er den vollen Kreis um den Äquator (aber links) zurücklegt die Pole unbedeckt). Alternativ könnte man, beginnend in der Nähe derselben Stadt, mit sorgfältigem Design genau das gleiche Muster in der Nähe der Stadt Accra drucken, es aber entlang des Nullmeridians und der internationalen Datumsgrenze verlängern und beide Pole abdecken. Diese beiden Ansätze würden genau das gleiche Muster auf dem Globus in der Nähe von Accra drucken, aber leider ergibt ein de Bruijn-Torus am Antipoden von Accra auf der internationalen Datumsgrenze in der Nähe des Äquators widersprüchliche Muster.

Gibt es ein anderes Muster ähnlich einem de Bruijn-Torus, das gleichzeitig in beide Richtungen "richtig zusammenpasst", wenn es gedruckt wird, um eine Kugel oder sogar einen Würfel vollständig zu bedecken? Bisher scheint niemand in der Lage zu sein, eine zu finden, und so sind wir gezwungen, Systeme zu verwenden, die "Nähte" im Muster tolerieren können, genauso wie Kartenhersteller gezwungen sind, mindestens eine Naht in einen Globus zu schneiden, um dies zu tun projizieren Sie einen ganzen Globus auf ein flaches Blatt Papier.

Sobald Sie Nähte zulassen, funktionieren Muster, die auf dem de Bruijn-Torus basieren, wieder gut - schneiden Sie einen oder mehrere große Stücke aus diesem Muster heraus und verwenden Sie die Stücke als "Anpassen eines flachen Musters an eine Kugel", indem Sie sie abschneiden Überlappung; auch wenn das Muster an den Nähten nicht "richtig zusammenpasst".

DataGlyphs und das Anoto-Muster sind nur Methoden, um Ihre Bits unauffällig darzustellen. Sie benötigen immer noch so etwas wie den de Bruijn-Torus, um festzustellen, welche Bits Sie tatsächlich benötigen :) Ich verstehe nicht ganz, warum der de Bruijn-Torus nicht funktionieren würde aber . Rotationsinvarianz könnte das größere Problem sein.
@Christian: Angeblich gibt es ein "vollständiges Muster (das) eine Fläche von mehr als 4,6 Millionen km ^ 2 umfasst" . Ich schlage vor, aus diesem Muster ein Rechteck auszuschneiden und es auf eine Kugel zu projizieren. Könnten Sie Ihre Behauptung erklären oder einen Link dazu angeben, dass "... das Anoto-Muster nur Methoden sind, um Ihre Bits unauffällig darzustellen ..."?
@Christian: GlyphChess verwendet einen "DataGlyph-Adressteppich". Ich schlage vor, aus diesem Teppich ein Rechteck auszuschneiden und es auf eine Kugel zu projizieren. Könnten Sie Ihre Behauptung erklären oder einen Link dazu angeben, dass "... DataGlyphs ... nur Methoden sind, um Ihre Bits unauffällig darzustellen ..." ?
Was ich meinte, ist, was sie selbst sagen: "Grundlegende DataGlyphs / Microglyphs sind ein Muster aus Vorwärts- und Rückwärtsstrichen, die Einsen und Nullen darstellen." Mein Punkt ist nur: Es ist ein zweistufiger Prozess. 1) Finden Sie ein 2D-Bitfeld, das sich umschließt und Ihnen die genaue Position für jede Untermatrix mit einer Mindestgröße angibt. 2) Finden Sie einen Weg, um dieses Bitfeld optimal auf der Kugel anzuzeigen.
@Christian: Ich verstehe deinen Punkt immer noch nicht. "ein 2D-Bitfeld, das ... Ihnen den genauen Ort für jede Untermatrix mit einer minimalen Größe gibt" ist genau das, wofür das Anoto-Punktmuster und der DataGlyph-Adressteppich und das absolute Positionscodierungsschema von Jon Howell entwickelt wurden. Könnten Sie mir einen Link zu jemandem geben, der Anoto-Muster verwendet, um "Bits darzustellen", anstatt feste absolute Positionen?
Das Anoto-Muster besteht aus einem regelmäßigen Gitter aus Punkten, die in eine von vier Richtungen versetzt sind, um zwei Bits pro Punkt zu codieren. Dies ergibt ein Gesamterscheinungsbild, das immer noch größtenteils weiß ist und keine hässlichen Punktansammlungen aufweist, die hässlich und ablenkend aussehen würden, wenn Sie auf dem Papier schreiben möchten. Sie können dann eine de Bruijn-Matrix verwenden, um zu bestimmen, wie die Pixel tatsächlich versetzt werden. Oder Sie gehen einfach zufällig und hoffen auf das Beste.
@Christian: Ich denke, wir haben aneinander vorbei geredet, weil wir unterschiedliche Definitionen verwendet haben. Lassen Sie mich versuchen, es klarzustellen ...
@Christian: Ich habe versucht, Ihre Kommentare in diese Antwort zu integrieren - jetzt besser? Sie haben wiederholt Bitcodierungssysteme erklärt (a); und dann darauf zu bestehen, dass das nicht genug ist - wir müssen diese Bits auch irgendwie verwenden, um die Position zu codieren, vielleicht mit einer de Bruijn-Matrix (b). Ich stimme zu, dass DataGlyphs (a) allein nicht ausreichen. Sind wir uns jetzt einig, dass eine Kombination aus (a) und auch (b) – wie entweder „ein DataGlyph-Adressteppich“ oder „das Anoto-Punktmuster“ – ausreicht, um die absolute Position durch Betrachtung eines sehr kleinen zu ermitteln lokales Muster?
Wow, ich denke, deine Antwort hat sich stark verbessert :)
@ Christian: Danke. Wenn Sie jemals jemanden finden, der das Anoto-Bitcodierungssystem für etwas anderes als Regionen des für alle Zeiten festgelegten „das gesamte Anoto-Punktmuster“ verwendet, teilen Sie mir bitte die URL mit, ich wäre fasziniert. Oder verstehe ich deine Aussage immer noch falsch?
Ich kann nicht sehen, wofür es sonst nützlich wäre, aber wenn ich jemals über etwas stolpere, werde ich es dich wissen lassen. Die Sache ist, dass das Anoto-Muster wirklich speziell hergestellt wurde, um eine nicht zu hohe Datendichte zu haben, damit das Papier immer noch als Papier verwendet werden kann. Für die meisten anderen Anwendungsfälle ist dies jedoch eher ein Hindernis als ein Feature. Warum sollte etwas, das Daten speichert, größtenteils leer sein? :)

Dies führt zu einer mathematischeren Antwort, aber wenn Sie das Muster, das Sie auf den Ball legen, a priori kennen, sollte jedes ausreichend zufällige Muster funktionieren, solange zwischen allen genügend Unähnlichkeiten (sowohl in der Translation als auch in der Rotation) bestehen mögliche Regionen, die Sie sofort erfassen können.

aber es gibt wahrscheinlich Muster, die weniger Verarbeitung erfordern, wie das Graycode-Muster, das auf einem optischen Encoder verwendet wird, zeigt Ihnen die absolute Position, ohne irgendeine Analyse davon über 1s und 0s hinaus durchzuführen.

1) Ich würde vorschlagen, viele QR-Codes an zufälligen Positionen zu zeichnen, die > 50 % der Fläche abdecken und sowohl X- als auch Y-Koordinaten codiert haben. Dann decodieren Sie den QR-Code, der der Mitte des Bildes am nächsten liegt, und extrapolieren die Koordinaten ein wenig, um für den außermittigen Code zu zählen.

Update: 2) Sie können wahrscheinlich mit geringerer Auflösung leben, wenn Sie auf Kugeln in Farbe zeichnen können. Dann beleuchten Sie Ihren Ball mit RGB-LED - jede Farbe separat -> zweimal kleinere QR-Codes.

3) Wenn der Ball nicht metallisch ist, können Sie einen Magneten hineinstecken und die Richtung mit ein paar Hall-Sensoren messen.

4) Sie können dort einfach eine regelmäßige Struktur einfügen und die relative Position wie bei einer optischen Maus verfolgen

Ich würde mir Sorgen um Schmutz auf dem Ball machen.

Das würde funktionieren, aber selbst unter idealen Bedingungen wäre meiner Meinung nach mindestens ein 85x85-Sensorarray erforderlich, um einen minimalen (15x15) QR-Code zu lesen. Ich hatte gehofft, ich könnte es mit einem kleineren Array (und entsprechend weniger Rechenleistung) machen.
15x15 braucht man nicht. Für 10-Bit-Koordinaten benötigen Sie nur 20 Datenbits + ECC ~ 10 Bit -> 6 x 6 Pixel oder so.
Ein paar weitere Ideen hinzugefügt.
Da fällt mir bokodes.org/bokode.html ein , wo sie eine Oberfläche mit Data-Matrix-Codes kacheln und Position und Winkel der Kamera erkennen
@BarsMonster: Der QR-Code und der Micro-QR-Code sind zwei beliebte 2D-Barcode-Formate. Mir wurde gesagt, dass der kleinste gültige QR-Code 21x21 Module ist; und der kleinste gültige "Micro-QR-Code" ist 11x11 Module. Welche Art von [2D-Barcode]( en.wikipedia.org/wiki/2D-Barcode )-Format erlaubt gültige Barcodes, die kleiner als 11x11-Module sind?
Hoppla, ich meinte " 2D-Barcode-Format ".

Wie Tyblu in seinem Kommentar sagte, verwenden Sie einen optischen Sensor und verfolgen Sie die zurückgelegte Entfernung und Richtung und berechnen Sie dann Ihre neue Position basierend auf der Entfernung und Richtung von der alten Position. Dies ist Ihre einfachste Methode, um die benötigten Informationen zu erhalten.

Eine solche Bildverarbeitung kann ziemlich langsam und mühsam mit einer angemessenen Fehlerspanne sein und ist kein Weg, den ich zur Positionsbestimmung einschlagen würde.

Ja, Logitech und Kingston haben es bereits herausgefunden! Sie möchten keine Maus, sondern das Muster, das in ihren Trackballs verwendet wird, um X und Y zu erhalten. Sehen Sie sich das spezielle Muster auf dem Ball an: logitech.com/assets/14756/14756.png
@Dave, dieses Muster stellt sicher, dass immer ein Punkt in Reichweite des Sensors ist, aber ich glaube nicht, dass es dafür ausgelegt ist, die Position statisch zu bestimmen (weil es sonst nicht möglich wäre, einen Ball von einem anderen Modell mit einem anderen Punkt auszutauschen Dichte, aber Sie können), aber es kann möglich sein, ein ähnliches Muster zu entwerfen, das die Position eindeutig identifiziert, z. B. vermeiden Sie die Wiederholung der Vierecke, die durch benachbarte Punkte gebildet werden. Vielleicht haben sie das schon getan (aber der Sensor nutzt es nicht aus.)
@finnw Das Muster dient nicht zur Bestimmung der absoluten Position, sondern zur Bestimmung der relativen Position. Sie müssten alle relativen Änderungen verfolgen, um Ihre absolute Position zu erhalten. Am Ende denke ich, das ist "alles", was Sie brauchen. :) Nun, was die Beschaffung der Sensoren und das Muster auf dem Ball angeht, kann ich nichts sagen.
@Dave, Die Position des Gelenks ist nicht bekannt, wenn der Sensor zum ersten Mal eingeschaltet wird, und er wurde möglicherweise bewegt, während das System ausgeschaltet war, daher glaube ich nicht, dass ich diese Lösung verwenden kann.
@finnw fair genug - wenn Sie den Benutzer nicht zwingen können, das Gelenk beim Einschalten in die Ausgangsposition zu bringen, liegt Ihre einzige Lösung im Bereich der absoluten Codierung / Positionserfassung.