Determinar la posición de una rótula mediante procesamiento de imágenes

Me pregunto si es posible detectar la posición de una rótula usando:

  • Una matriz de fotodiodos de un mouse óptico , incrustada en el zócalo
  • Un patrón específico depositado en la pelota.
  • Un procesador que puede usar la parte expuesta del patrón para identificar qué parte de la pelota está mirando y cómo está orientada.

Me imagino que algo similar a un de Bruijn Torus , que se puede proyectar sobre una superficie esférica en lugar de un toro o un plano, haría el truco.

¿Existe un algoritmo conocido para generar y/o decodificar dicha imagen?

El sensor óptico del ratón es una muy buena idea. En la actualidad, tienen un gran impacto DSP y pueden rastrear en una variedad de superficies (como todos sabemos). Da movimiento relativo, por lo que la integración de la posición depende de usted.
@tyblu: si miras el enlace (de Bruijn Torus), parece que está interesado en el posicionamiento absoluto.
si está usando una rótula, supongo que algo sobresale de un punto de la bola. Si eso es cierto, ¿puede dejar de detectar las características de la bola para detectarlas en función de la posición del enlace? ¿Cuáles son los rangos de movimiento que tienes que soportar con esta rótula? ¿Tienes un boceto básico?
Siguiendo la idea del mouse óptico, escuché que hay trackballs que hacen un posicionamiento absoluto. En cuyo caso, podría más o menos usar ese dispositivo tal como está. Aunque sea solo relativo, quizás sea suficiente para tus necesidades y te ahorres mucho trabajo.

Respuestas (4)

encontrar la posición absoluta en una esfera

encontrar la posición absoluta en un plano

Sí, existen varios patrones de este tipo que se utilizan para determinar la posición absoluta en un plano:

Cuando se usa un bolígrafo digital en papel digital , dos pasos clave en el algoritmo son (a) decodificar la parte del patrón visible desde el bolígrafo en bits, y (b) decodificar esos bits en una ubicación absoluta, que indica qué página en el cuaderno y una posición tosca en esa página. O, en otras palabras, al diseñar el sistema y decidir dónde va la tinta en el papel, el diseñador del sistema primero (b) elige algún patrón de bits en una cuadrícula, tal vez el código gris cíclico de pista única que se usa en la carpeta de direcciones de Anoto o un toro de Bruijn o una variedad de otros patrones de bits en una cuadrícula. Luego, el diseñador del sistema (a) elige una de varias maneras de representar cada bit como tinta sobre papel.

Aboufadel, Smietana y Armstrong; "Codificación de posición" proporciona una descripción detallada de algunas de las opciones posibles para (a) y (b). Si entiendo correctamente, la alfombra de dirección de Anoto usa una secuencia estrechamente relacionada con una secuencia de Bruijn, pero técnicamente no es un toroide de Bruijn.

hecht; Las "Interfaces gráficas de usuario de datos integrados impresos" brindan una descripción detallada de DataGlyphs, que usa para (a), y el "código de alfombra" que usa para (b). Jeff Breidenbach y yo usamos la frase "una alfombra de direcciones de DataGlyph" para esa combinación particular de (a) y (b).

adaptar un patrón plano a una esfera

Hay varias formas de proyectar estos patrones "planos" en una esfera ; tal vez usando una proyección como el cubo esférico cuadrilateralizado o alguna otra técnica de cuadrícula geodésica para pixelizar la esfera . Todas estas proyecciones tienen un tipo de distorsión (muchas costuras) u otro (mucho estiramiento en algunas regiones en comparación con otras) o algún tipo de compromiso (pocas costuras y algo menos de estiramiento); esperemos que pueda encontrar uno que funcione bien con su hardware.

Patrones esféricos nativos

  • Como mencionó Nick T, un "patrón de puntos aleatorios" casi seguramente mostrará muchos patrones únicos que, después de "calibrar" al memorizar los patrones particulares en esta bola en particular y su posición exacta en esta bola, se pueden usar para determinar la posición absoluta. Esto evita por completo el problema de la "distorsión de proyección".

Toro de De Bruijn

No veo por qué el toroide de Bruijn no funcionaría

Casi funciona .

Un toroide de Bruijn funciona bien como la cuadrícula de bits en una alfombra de direcciones para encontrar la posición absoluta en un plano. Los sistemas de alfombra de direcciones más populares utilizan otros patrones de bits que son más fáciles de decodificar que un toro de De Bruijn, aunque requieren que el sensor vea un poco más de módulos.

Un toroide de Bruijn también funcionaría bien como la cuadrícula de bits en una carpeta de direcciones para encontrar la posición absoluta en un toroide o una sección de un cilindro; con un diseño cuidadoso, el patrón podría diseñarse para "coincidir correctamente" recorriendo todo el círculo alrededor de la circunferencia de un cilindro, y para "hacer coincidir correctamente" viajando ambos círculos completos alrededor de ambas circunferencias de un toro.

Comenzando cerca (por ejemplo) de la ciudad de Accra, con un diseño cuidadoso se podría diseñar un patrón basado en un toroide de Bruijn que cubriera completamente una banda angosta cerca del ecuador y "emparejara apropiadamente" recorriendo el círculo completo alrededor del ecuador (pero dejando los polos descubiertos). Alternativamente, comenzando cerca de la misma ciudad, con un diseño cuidadoso se podría imprimir exactamente el mismo patrón cerca de la ciudad de Accra, pero extenderlo a lo largo del meridiano principal y la línea de cambio de fecha internacional, cubriendo ambos polos. Esos dos enfoques imprimirían exactamente el mismo patrón en el globo terráqueo cerca de Accra, pero, por desgracia, un toroide de Bruijn da patrones contradictorios en las antípodas de Accra en la línea de fecha internacional cerca del ecuador.

¿Hay algún otro patrón similar a un toroide de Bruijn que "coincide correctamente" en ambas direcciones al mismo tiempo, cuando se imprime para cubrir completamente una esfera o incluso un cubo? Hasta el momento nadie parece ser capaz de encontrar uno, por lo que nos vemos obligados a utilizar sistemas que pueden tolerar "costuras" en el patrón, de la misma manera que los cartógrafos se ven obligados a cortar al menos una costura en un globo para poder proyectar un globo entero en una hoja plana de papel.

Una vez que permita las costuras, nuevamente los patrones basados ​​​​en el toroide de Bruijn funcionarían bien: corte uno o más trozos grandes de ese patrón y use los trozos como "adaptación de un patrón plano a una esfera", recortando superposición; a pesar de que el patrón no "coincidirá correctamente" en las costuras.

DataGlyphs y el patrón Anoto son solo métodos para representar discretamente sus bits, aún necesitaría algo como el toroide de Bruijn para determinar qué bits realmente necesita :) Aunque no veo por qué el toroide de Bruijn no funcionaría . La invariancia rotacional podría ser el mayor problema.
@Christian: supuestamente existe un "patrón completo (que) abarca un área que supera los 4,6 millones de km ^ 2" . Propongo cortar un rectángulo de ese patrón y proyectarlo en una esfera. ¿Podría explicar, o proporcionar un enlace, su afirmación de que "... el patrón de Anoto son solo métodos para representar discretamente sus partes..."?
@Christian: GlyphChess usa una "alfombra de direcciones DataGlyph". Propongo cortar un rectángulo de esa alfombra y proyectarlo en una esfera. ¿Podría explicar, o proporcionar un enlace, su afirmación de que "... DataGlyphs... son solo métodos para representar discretamente sus bits..."?
Lo que quise decir es lo que ellos mismos dicen: "Los DataGlyphs/Microglyphs básicos son un patrón de barras hacia adelante y hacia atrás que representan unos y ceros". Mi punto es simplemente: es un proceso de dos pasos. 1) Encuentre un campo de bits 2D que se ajuste y le brinde la ubicación exacta para cada submatriz de un tamaño mínimo 2) Encuentre una manera de mostrar este campo de bits de manera óptima en la esfera.
@Christian: Todavía no entiendo tu punto. "un campo de bits 2D que... le brinda la ubicación exacta para cada submatriz de un tamaño mínimo" es exactamente para lo que se diseñaron el patrón de puntos de Anoto y la alfombra de direcciones DataGlyph y el esquema de codificación de posición absoluta de Jon Howell. ¿Podría darme un enlace a alguien que use patrones de Anoto para "representar bits" en lugar de ubicaciones absolutas fijas?
El patrón Anoto consta de una cuadrícula regular de puntos que se desplazan en una de las cuatro direcciones para codificar dos bits por punto. Esto le da una apariencia general que aún es mayormente blanca y no tiene feos grupos de puntos que se verían feos y distraerían cuando desea escribir en el papel. Luego puede usar una matriz de Bruijn para determinar cómo compensar realmente los píxeles. O simplemente vas al azar y esperas lo mejor.
@Christian: Creo que hemos estado hablando entre nosotros porque hemos estado usando diferentes definiciones. Déjame tratar de aclarar...
@Christian: Traté de incorporar sus comentarios en esta respuesta, ¿mejor ahora? Ha estado explicando repetidamente los sistemas de codificación de bits (a); y luego insistiendo en que no es suficiente, también necesitamos usar esos bits de alguna manera para codificar la posición, tal vez usando una matriz de Bruijn (b). Acepto que los DataGlyphs (a) por sí solos no son suficientes. ¿Estamos ahora totalmente de acuerdo en que una combinación de (a) y también (b), como "una alfombra de dirección de DataGlyph" o "el patrón de puntos de Anoto", son adecuados para descubrir la posición absoluta al observar un tamaño muy pequeño? patrón local?
Wow, creo que tu respuesta mejoró mucho :)
@Cristiano: Gracias. Además, si alguna vez encuentra a alguien que use el sistema de codificación de bits de Anoto para cualquier otra cosa que no sean regiones del "patrón completo de puntos de Anoto" fijo para siempre, por favor dígame la URL, estaría fascinado. ¿O sigo entendiendo mal lo que dices?
No puedo ver para qué sería útil de lo contrario, pero si alguna vez me tropiezo con algo, te lo haré saber. La cuestión es que el patrón de Anoto es realmente especial para no tener una densidad de datos demasiado alta, por lo que el papel aún se puede usar como papel. Sin embargo, para la mayoría de los otros casos de uso, esto es más un obstáculo que una característica. ¿Por qué algo que almacena datos está en su mayoría en blanco? :)

Esto conduce a una respuesta más matemática, pero si tiene conocimiento a priori del patrón que va a colocar en la pelota, cualquier patrón lo suficientemente aleatorio debería funcionar, siempre que haya suficientes diferencias (tanto en traslación como en rotación) entre todos posibles regiones que puede capturar a la vez.

pero probablemente haya patrones que requieran menos procesamiento, como el patrón de código gris utilizado en un codificador óptico que muestra la posición absoluta sin realizar ningún tipo de análisis más allá de 1 y 0.

1) Sugeriría dibujar muchos códigos QR en posiciones aleatorias que cubran> 50% del área que tienen codificadas las coordenadas X e Y. Luego, decodifica el código QR más cercano al centro de la imagen y extrapola un poco las coordenadas para contar el código descentrado.

Actualización: 2) Probablemente puedas vivir con una resolución más pequeña si puedes dibujar una bola en color. Luego, enciende su bola con LED RGB, cada color por separado -> códigos QR dos veces más pequeños.

3) Si la bola no es metálica, puede colocar un imán dentro y ver la dirección usando un par de sensores Hall.

4) Puede simplemente poner una estructura regular allí y rastrear la posición relativa como un mouse óptico

Me preocuparía por la suciedad en la pelota.

Eso funcionaría, pero incluso en condiciones ideales, creo que necesitaría al menos una matriz de sensores de 85x85 para leer un código QR mínimo (15x15). Esperaba poder hacerlo con una matriz más pequeña (y, en consecuencia, menos potencia de procesamiento).
no necesitas 15x15. para coordenadas de 10 bits, solo necesita 20 bits de datos + ECC ~ 10 bits -> 6x6 píxeles más o menos.
Se agregaron algunas ideas más.
Esto me hace pensar en bokodes.org/bokode.html , donde colocan mosaicos en una superficie con códigos Data Matrix y detectan la posición y el ángulo de la cámara.
@BarsMonster: El código QR y el código Micro QR son dos formatos populares de códigos de barras 2D. Me han dicho que el código QR válido más pequeño es de 21x21 módulos; y el "código Micro QR" válido más pequeño es de 11x11 módulos. ¿Qué tipo de formato de [código de barras 2D]( en.wikipedia.org/wiki/2D barcode) permite códigos de barras válidos que son más pequeños que los módulos 11x11?
Vaya, quise decir " formato de código de barras 2D ".

Como dijo tyblu en su comentario, use un sensor óptico y rastree la distancia y la dirección recorrida, luego calcule su nueva posición en función de la distancia y la dirección desde la posición anterior. Este será su método más simple para obtener la información que necesita.

El procesamiento de imágenes como ese puede ser bastante lento y tedioso con un buen margen de error y no es un camino que tomaría para determinar la posición.

¡sí, logitech y kingston ya lo han resuelto! No quiere un mouse, quiere tomar el patrón usado en sus trackballs para obtener X e Y. Vea el patrón especial en la bola: logitech.com/assets/14756/14756.png
@Dave, ese patrón asegura que siempre haya un punto en el rango del sensor, pero no creo que esté diseñado para determinar la posición de forma estática (porque de lo contrario no sería posible intercambiar una bola de otro modelo con un punto diferente densidad, pero puede) pero puede ser posible diseñar un patrón similar que identifique de forma única la posición, por ejemplo, evite la repetición de los cuadriláteros formados por puntos vecinos. Tal vez ya lo hicieron (pero el sensor no lo aprovecha).
@finnw el patrón no es para determinar la posición absoluta, se usa para determinar la posición relativa. Deberá realizar un seguimiento de todos los cambios relativos para obtener su posición absoluta. Al final, creo que eso es "todo" lo que necesitas. :) Ahora, en cuanto a la fuente de los sensores y el patrón de la pelota, no puedo comentar.
@Dave, la posición de la articulación no se conoce cuando el sensor se enciende por primera vez, y es posible que se haya movido mientras el sistema estaba apagado, por lo que no creo que pueda usar esta solución.
@finnw es bastante justo: si no puede obligar al usuario a ubicar la articulación en el momento del encendido, entonces su única solución se encuentra dentro del ámbito de la codificación absoluta/detección de posición.