Localización de marcador de Aruco

En la última publicación, hablamos sobre cómo llegar del punto A al punto B sin golpear nada. Pero para dar la vuelta a algo, debe comprender dónde estamos y dónde hay obstáculos dinámicos (nuestros oponentes y no solo).

Una persona tiene ojos, oídos y software establecidos por la naturaleza y la experiencia personal para que pueda moverse y navegar fácilmente en el espacio. El sistema de localización es casi el ojo y el oído para los robots. Es necesario para que el robot pueda navegar en el espacio y, ajustándose al entorno, moverse en él.

Hoy hablaremos sobre cómo resolvimos el problema de determinar la posición de los robots en el campo Eurobot, cómo hacer todo esto, lanzarlo y configurarlo usted mismo.



Condiciones objetivo del sistema de localización


Uno de los principios de Eurobot Open es la autonomía. Autonomía de todo lo que está detrás del campo de juego. Todos los cálculos, la toma de decisiones y la localización deben hacerse en \ en robots o en sitios especiales en el campo.

El tamaño del campo es de 2x3 metros, y el error en el tamaño y la posición de los elementos de un campo a otro suele ser de 3-5 mm.

En la imagen a continuación hay un diagrama del campo Eurobot 2019 con zonas marcadas en las que podemos colocar algo más que robots.



  • 6 - Zona de experimento (una de las tareas adicionales)
  • 10 - Zonas del faro
  • 11 - Una torre especial para instalar un dispositivo de seguimiento central (en lo sucesivo, el CCC). Ubicado sobre el campo a una altura de 1 metro
  • También en los robots mismos podemos instalar balizas.

Para todas estas áreas y las dimensiones de los robots en sí, existen restricciones estrictas de peso y tamaño, por lo que es imposible hacer un gran supermódulo productivo en el que todo encaje. Y también hay un límite de 3 minutos para la preparación para el lanzamiento. Durante este tiempo, una o dos personas del equipo deben sacar los robots y todo lo relacionado con ellos, organizarlos, configurarlos y prepararse para el lanzamiento. Obviamente, cuanto menos basura necesites configurar y ajustar, menos probabilidades tendrás de cometer un error o ser multado antes del comienzo de la batalla.


y otro segundo cuadro completo

Analizamos opciones


Con la conciencia de nuestras capacidades y el deseo de obtener una precisión de posicionamiento de al menos unos pocos milímetros, veamos qué podemos usar en general para resolver este problema:

  • La odometría de las ruedas con codificadores ubicados directamente en el variador o ruedas de medición adicionales le permite leer la distancia recorrida por el robot y determinar su posición en relación con el punto de partida. Muchos equipos de Eurobot lo usan como su método de localización principal. Esta es una de las fuentes más rápidas de información de movimiento para el robot. Sin embargo, en la práctica, especialmente cuando se conduce en omni-ruedas (un área de contacto más pequeña que las ruedas clásicas, el juego de rodillos y los errores de fabricación más grandes), la odometría es susceptible al problema de acumulación de errores, que debe corregirse de alguna manera. Puede alinearse con la superficie con coordenadas conocidas, o puede formar complejos con un sistema adicional. Además, si usa codificadores en las ruedas motrices, existe el problema del deslizamiento de las ruedas durante maniobras bruscas y en colisiones del robot. Las ruedas de medición pueden eliminar este problema, pero son difíciles de colocar en un robot pequeño.


    Rueda omnidireccional de medición propia con suspensión independiente y con codificador magnético, que utilizamos en 2018
  • Los lidares tienen ventajas significativas: obtenemos una vista casi circular y distancias a los obstáculos. De los inconvenientes, vale la pena señalar el alto precio, la dificultad para tratar de distinguir pequeños objetos distantes de la basura y un algoritmo de localización relativamente complicado. Los lidares baratos (como rplidar) tienen una frecuencia de actualización y una resolución angular bastante bajas, y también están sujetos a la luz de otros lidars, telémetros, etc. Las reglas de elevación para los sistemas de localización tienen pocos objetos estáticos para el enlace. Sin embargo, el equipo de Skoltech ha estado patinando con éxito durante varios años utilizando el hokuyo ust-10lx y el año pasado obtuvo el segundo lugar en la final europea de la competencia Eurobot en Francia.
  • También consideramos sistemas inerciales , pero en nuestro caso no encajaban bien. El acelerómetro hace ruido, el giroscopio está flotando, puede olvidarse de usar la brújula en interiores. Incluso el uso de un filtro Kalman no logra la precisión deseada. Resulta que la IMU solo se puede usar de manera efectiva para la corrección en un período de tiempo muy corto. El máximo de información útil que pudimos obtener con pixhawk2 es el ángulo durante un giro brusco (por ejemplo, de una colisión).
  • El GPS no funciona en interiores, y la precisión sin RTK es metros.
  • Localización ultrasónica . Una de las implementaciones se puede encontrar aquí: m.habr.com/en/post/451408 . Por desgracia, la precisión de nuestras tareas no es muy alta (+ -2 cm), la diafonía afecta fuertemente o, si utiliza sensores con protección contra esto, se obtiene una baja frecuencia de sondeo. Uno de los equipos en Rusia usa esta solución con un éxito variable, y el equipo alemán Turag utiliza con bastante éxito una tecnología similar desarrollada dentro del laboratorio.
  • La odometría visual no proporciona información sobre la posición de los oponentes debido al hecho de que no hay muchos puntos en el campo a los que sea posible aferrarse de manera confiable.
  • \ Las cámaras estéreo tienen un ángulo estrecho, que no permite cubrir el campo cuando se encuentra en el dispositivo de seguimiento central, ni obtener una vista circular o al menos aceptable cuando se instala en un robot.
  • Los marcadores fiduciarios que hemos elegido y que examinaremos con más detalle.

Marcadores fiduciarios


La navegación por marcadores ha existido durante mucho tiempo. Teóricamente, el llamado marcador puede ser cualquier objeto. Pero hay muchos problemas al usar:

  • restricciones debido a la resolución de la cámara;
  • falta de fiabilidad de detección cuando se utiliza el color como fuente principal de información;
  • la necesidad de determinar la orientación del marcador;
  • las marcas de bajo contraste funcionan bien solo con buena luz;
  • Se requiere un alto poder de procesamiento del equipo (procesamiento en tiempo real de las tramas entrantes).

Para sortear los problemas anteriores, generalmente debe usar algo simple e inequívoco para el reconocimiento, por ejemplo, un círculo de color o un cuadrado (y me gustaría un pato amarillo).

imagen
diferentes tipos de marcadores

De hecho, además de determinar la posición de un marcador, a menudo es necesario determinar su singularidad, por ejemplo, para detectar varios objetos a la vez. Para hacer esto, puede cambiar el color o la forma, pero luego nos enfrentaremos rápidamente a una disminución en la confiabilidad de la detección.
Este problema es bastante común y hay muchos estándares de marcadores. El más famoso de ellos es el código qr, pero rara vez se usa para problemas de localización debido a la redundancia y la necesidad de alta resolución. Como regla general, todos los marcadores son bicolores (la mayoría de las veces b / w), de forma simple (la mayoría de las veces un cuadrado) y de alguna manera codifican el identificador en sí mismos. Los marcadores más famosos para la localización son Aruco, April Tag, ARToolKit.

Cualquier persona interesada en aprender más sobre ellos es un artículo interesante que también compara la fiabilidad de su detección.

Marcadores fractales
Hay momentos en los que necesitamos detectar un objeto tanto desde lejos como en blanco. Usar varios marcadores de diferentes tamaños es una forma, pero puede hacerlo de manera más astuta y usar marcadores "fractales", cuyas diferentes partes funcionan a diferentes escalas de la imagen.

docs.google.com/document/u/1/d/1SdsOTjGdu5o8gy2Ot2FDqYDS9ALgyhOBJcJHOZBR7B4/mobilebasic

En nuestro caso, tenemos muchos aspectos positivos del uso de marcadores:

  • con la posibilidad de instalar una cámara estática con un buen ángulo de visión y marcado, esto no requiere un equipo difícil de encontrar y potencialmente no es muy difícil de implementar;
  • la cámara remota puede evaluar la posición de todos los objetos en los que podemos colocar marcadores;
  • los cálculos se llevan a cabo no en el dispositivo de a bordo del robot, sino en una computadora separada (pero existe un problema de confiabilidad y demoras en la transferencia de datos);
  • La capacidad de resolver cualquier otro problema asociado con la visión.

Después de analizar los sistemas anteriores, nos decidimos por la detección de marcadores. Esto nos permitió no solo liberar nuestros odroides en robots, sino también permitirles ver toda la situación en el campo desde una vista de pájaro.

¿Cómo funciona fuera de la caja?


La "fiabilidad" de la detección de marcadores es un término relativo. Diferentes tareas requieren diferentes niveles de precisión y estabilidad. La inclusión de estos parámetros depende del sensor de video, lentes, condiciones de iluminación, etc.


En nuestro caso, con un tamaño de campo de 2x3 metros y una cámara a solo un metro por encima, es necesario utilizar una óptica de gran angular con un campo de visión de al menos 120-140 grados para garantizar la visibilidad de todo el espacio de juego, lo que afecta negativamente la detección (y su precisión) de pequeños marcadores en el extremo esquina del campo de juego, y bajo condiciones arbitrarias de iluminación hacen que esta tarea sea aún más difícil.
Como ha demostrado la práctica, incluso en condiciones normales, completamente naturales, iluminadas, pueden ocurrir definiciones erróneas de la posición del marcador.



Por lo tanto, las siguientes imágenes muestran dos cuadros consecutivos con resultados de detección de marcadores: la dirección del eje Z (azul) cambia 180 grados.




www.youtube.com/watch?v=xzG2jQfxLlY

Llevar a un estado competitivo


Cambiar el algoritmo


Para determinar con precisión la ubicación del robot en el campo, debe conocer la posición angular de la cámara, la transformación general del sistema de coordenadas y la posición de la cámara en relación con la posición del campo. Para hacer esta conversión, desarrollamos nuestro propio algoritmo. Dado que una persona cuelga el centro de control central manualmente, además de que los campos son ligeramente diferentes entre sí, entonces no es posible obtener siempre la misma posición de cámara. El desplazamiento angular de la cámara con respecto al campo tiene un efecto muy negativo en la detección de la posición de los robots. La solución fundamental es determinar varios marcadores estáticos que podemos establecer antes del partido para la calibración.

La biblioteca Aruco en opencv proporciona la capacidad de determinar la posición del marcador 6dof en relación con la cámara. Al principio intentamos usarlo, pero resultó muy inestable e inexacto. En nuestro caso, cuando se conoce la posición de la cámara, está fija, y los robots (y los marcadores asociados) se mueven en un plano que no pasa por el punto de fijación de la cámara, es racional limitarnos a la tarea de detectar la posición 3dof (z-const, x-y, + rotación alrededor un eje z) a través de la triangulación de un punto en un plano en un ángulo visible.

Se espera que una disminución en la dimensión y un aumento en la base de la triangulación (el tamaño del marcador versus la distancia desde el plano de los marcadores a la cámara) del problema a resolver reduzca el nivel de incertidumbre y ruido de los resultados de la detección.
Para hacer esto, en lugar de la función estándar

cv::aruco::estimatePoseSingleMarkers(markerCorners, 0.05, cameraMatrix, distCoeffs, rvecs, tvecs); 


que, en base a las esquinas encontradas de los marcadores, determina la posición 6dof del marcador, escribimos nuestro estimador de posición, trabajando de acuerdo con los siguientes principios:

  • La posición de la cámara 3D se conoce de antemano;
  • la altura del marcador se conoce de antemano;
  • Como resultado de la detección, se conocen píxeles (v, u) de 4 esquinas del marcador;
  • Como resultado de la calibración de la cámara, se define una matriz de cámara 4x4;
  • conociendo la 'matriz de cámara', la posición y orientación de la cámara, la posición de los ángulos de píxeles del marcador, puede obtener la proyección de la posición de los ángulos en el espacio 3D en el plano z en el que se ubican los vértices del marcador (la altura del marcador está determinada por su número);
  • haciendo el paso anterior para las 4 esquinas del marcador y promediando los datos obtenidos, es posible obtener coordenadas 3D de los vértices del marcador en el sistema de coordenadas de la cámara;
  • aplicando la transformación de la cámara SK al SK del campo de juego, se obtienen las coordenadas del marcador en el campo SK.

Resolver problemas de iluminación y rendimiento


La estabilidad y la velocidad de detección de los marcadores dependen en gran medida de las condiciones de iluminación ambiental y de la estructura de fondo; cuantos más objetos diferentes haya en el marco, más tiempo llevará el procesamiento. Dado que las reglas de iluminación y fondo de Eurobot no están reguladas de ninguna manera, pueden cambiar mucho de vez en cuando, puede haber otros campos, personas en segundo plano. En particular, se pueden esperar exposiciones adicionales de robots enemigos, flashes de cámara o focos que caen en el campo de visión de la cámara.

Para reducir la influencia de la iluminación ambiental en la estabilidad de la detección de marcadores, se desarrolló un "diseño" especial en el que se utilizaron marcadores de aruco invertidos. La parte oscura se reemplaza por una película retrorreflectante y se instala una luz de fondo LED activa directamente en la cámara. El procesamiento de imágenes se realiza en negativo, mientras que el contraste del fondo es mucho menor que el contraste de sus propios marcadores.

Aumentar el contraste del marcador le permite seleccionar efectivamente regiones de interés en el marco y buscar marcadores solo en ellos, y no en todo el marco, lo que mejora enormemente la productividad.


Comparación de las diferencias de contraste entre un marcador estándar y un marcador con una superficie reflectante

Seleccionamos hierro


Dado que las condiciones de iluminación no están definidas, y la velocidad de los robots puede ser bastante grande, desde el principio estábamos buscando una cámara con un obturador global, y no con un obturador enrollable. La diferencia es que el global recopila información sobre el brillo de los píxeles al mismo tiempo y se desplaza línea por línea, por lo que puede haber distorsiones en la forma geométrica de los objetos en movimiento.
La cámara más económica es oCam-1mgn, que utilizamos durante 2 años. Sin embargo, es en blanco y negro y tiene una resolución de solo 1Mpx, que se encuentra en el borde inferior de una resolución aceptable (el número de píxeles en la imagen, por 1 "píxel" del marcador).
Inicialmente, el detector se consideraba en la misma placa única que los robots mismos: odroid xu4, y la velocidad de trabajo era de aproximadamente 20 fps, sin embargo, el deseo de colgar funcionalidades adicionales en el centro de control central y comprender que se necesitaba una mejor cámara llevó a reemplazar la PC con un Intel más vigoroso. Nuc, y la cámara ... la cámara que todavía estamos recogiendo para la nueva temporada.

Comenzamos el proyecto


Se supone además que ya tiene configurado ROS Kinetic o Melodic.

Lo primero que debe hacer es descargar e instalar OpenCV 3, Eigen3 y el proyecto https://bitbucket.org/eurobot1718/ocam_usb_cam (para la cámara Ocam), o usar otro proyecto que tenga una estructura similar a la publicación de datos en los temas.

Clonamos el repositorio con el proyecto de detector arude: https://gitlab.com/eurobot2019/aruco_detector y gui para ello https://github.com/alexpostnikov/aruco-gui
Después de instalar los proyectos, debe calibrar la cámara y obtener la matriz de dispersión y la matriz de distorsión de la cámara, y luego envolver todo en el archivo yaml "camera_params.yml". Un ejemplo simple es el uso de un tablero de ajedrez. Enlace a la implementación en C ++, donde solo necesita recopilar y especificar los parámetros de la placa y la cámara, así como el nombre del archivo de salida.

La configuración principal está en el archivo aruco_detector_params.yml:

  • len_of_cube_markers y width_marker la longitud y el ancho de los marcadores en metros;
  • markers_height : comparación del marcador y su altura;
  • marcadores : una matriz que describe si un marcador particular pertenece a un robot específico. Indica los marcadores en sentido horario. Y en el caso de los oponentes, dado que su dirección no es importante para nosotros, el orden de los marcadores en la configuración tampoco es importante. Solo necesita especificar el código del marcador. También tenemos marcadores en la cubierta superior, sus números se resaltan por separado;
  • static_markers_ids : marcadores que se buscan durante el proceso de calibración;
  • posición de marcadores : un diccionario con el desplazamiento y la rotación de cada marcador en relación con el centro del robot;
  • no se puede tocar el umbral de brillo : esto se usa en la calibración automática inicial de la luz;
  • camera_position_yellow y un parámetro similar sirven como configuraciones predeterminadas en caso de que falle la calibración.

La matriz de transformación del sistema de coordenadas de la cámara al sistema de coordenadas del campo está en el archivo transform_from_cam_to_map.xml

Después de todas las configuraciones, finalmente necesita ejecutarlo. Las rutas al archivo con los parámetros, el lado predeterminado y la ruta al dispositivo de video se establecen en aruco_detector_debug.launch, que iniciaremos. Pero para un lanzamiento completo es mejor usar el script bash aruco.bash, que, además del detector, inicia la interfaz gráfica de usuario (127.0.0.1►000). Aquí podemos elegir el lado, comenzar la calibración y controlar el sistema. En la segunda ventana, las zonas de interés y los marcadores encontrados son visibles.



Ahora en los temas: "/ enemy_robot1 / aruco", "/ enemy_robot2 / aruco", "/ big_robot / aruco", "/ small_robot / aruco" se publicará la posición de los robots encontrados.

¡Hurra! Pudimos obtener las coordenadas de los robots. Eso es justo, como puedes ver, están equivocados. Esto se debe a que antes de usarlo es necesario calibrar la posición de la cámara con respecto al campo. Para esto es necesario

  • establecer los cubos en las esquinas del campo, mientras que es importante que estén girados por los lados especificados en la configuración
  • ajustar la inclinación de la cámara para que todo el espacio requerido caiga en el marco
  • ajustar el brillo de la luz de fondo hasta una detección confiable
  • en gui, seleccione el lado deseado y haga clic en "calibrar"
  • entonces el estado de "buscar cubos estáticos" debería cambiar a "buscar cubos"

Hacemos marcadores y TsUS


De acuerdo con las reglas, podemos colorear nuestros robots como queramos y, además, usar un lugar especial en nuestros robots y en los de otras personas, en el que puede colocar algo de hasta 10x10x8cm de tamaño. Un lugar especial se encuentra en la cubierta del robot, tiene una altura fija y una mejor visibilidad para el centro de control central, excepto cuando el robot está debajo de la cámara.


Altura y dimensiones de los faros del robot.

Por lo tanto, como los principales marcadores de nuestros robots, utilizamos paralelepípedos de 10x10x108cm pegados en 4 lados del aruco, así como marcadores adicionales en la parte superior de nuestros robots para su localización en un área compleja debajo de la cámara.

Como no podemos pegar nada a la tapa del enemigo, decidimos hacer marcadores en forma de pirámide truncada para ampliar el rango de visibilidad. Y como puede ver, el marcador se ha vuelto mucho mejor visible.



Imprimimos la base para el cubo \ pirámide en una impresora 3D para que sea lo suficientemente fuerte y tenga un montaje conveniente y confiable.



Aquí se encuentran modelos para imprimir un cubo, una pirámide y una montura de acoplamiento .

Este cubo está pegado con un reflector (usamos blanco AVERY
DENNISON V6700B de 50 mm de ancho, aunque es más caro, funciona muchas veces mejor que el chino barato), y los marcadores en sí están pegados encima. La forma más fácil de hacer esto es cortar los marcadores en el plotter, aunque puede cortarlos de papel o película en un par de horas de pacificación (un conjunto consta de 16 marcadores).

Aquí está nuestro kit del año pasado.


varias "generaciones" de nuestros marcadores

También se pueden usar como marcadores estáticos para la calibración. Para hacer esto, colóquelos en las esquinas lejanas del campo y haga clic en calibrar.

Montaje de un dispositivo de seguimiento central


Lo que se necesita:


Computadora de placa única. Estos dibujos están hechos para la ubicación de Intel NUC, pero puede pensar en colocar en el caso, por ejemplo, odroid xu4 o raspberry pi4.

oCam . En realidad la cámara, por lo que todo va. Cambiamos la lente estándar a 2.5 mm para un amplio ángulo de visión
Pantalla (wavehare 7inch HDMI LCD (B)) . Con su ayuda, se realizan la calibración y otras operaciones.

Tira de LED. Se utiliza para iluminar la superficie reflectante de los marcadores. Es mejor usar el más brillante disponible.

Batería 16.8v LiPo. Usamos 4s5200mAh. Estas son las mismas baterías que en el robot, ya que es conveniente y dura mucho tiempo.

Convertidor CC-CC reductor. Para alimentar la tira de LED. Nuc y el enrutador se alimentan directamente de la batería, porque todos los arneses de alimentación ya están en ellos.

Piezas impresas Esto, en particular, un soporte para cámara, una pantalla y esquinas para ensamblar la carcasa: https://yadi.sk/d/swUJUwxTnTVYFw

Detalles de la vivienda. En nuestro caso, era una lámina de carbono de 2 mm. Pero esta no es la mejor opción, ya que es conductora de carbono, difícil de procesar y no tan liviana como, por ejemplo, el plexiglás, quizás la opción más simple. Aunque mucho más duro. Encuentra el enlace de arriba.

Router (Zyxel keenetic extra). Tuvimos que sacarlo de la caja para que se ajustara a su tamaño y peso. Pero en el caso general, no recomendamos esto.
Muchas pequeñas cosas. Tornillos M3 * 8 ~ 40 piezas, bastidores para placas de circuito impreso 3x10 ~ 12 piezas, cables, destornilladores, wago, etc.

Asamblea


Primero debes preparar las esquinas impresas, presionando las tuercas en ellas. Es posible que haya pocos ajustes a presión y que tengan que estar ligeramente pegados o usar tuercas fundidas
A continuación, debe instalar esta parte en la base. Proporciona un posicionamiento claro del centro de control central en su lugar.



Ahora ensamblamos el soporte de la cámara, insertamos oCam allí, pegamos la luz de fondo de la tira de LED lo más cerca posible de la lente y sujetamos el módulo a la base.





Después de eso, puede instalar todas las paredes laterales, fijándolas en las esquinas descritas anteriormente. Es mejor contrarrestar los agujeros para ellos.



Ponemos una computadora de placa única y un enrutador. En nuestro caso, estos son NUC y Zyxel keenetic extra.






Y obtenemos el sistema de seguimiento ensamblado. Solo queda ajustar la inclinación de la cámara.


depuración de localización en 2018

Cual es el resultado


Entonces contamos todos los secretos que nos permiten repetir nuestro sistema con nuestras propias manos. Utilizándolo, puede hacer rápidamente y sin alteraciones su sistema para localizar el robot en el campo Eurobot. Y con alteraciones mínimas, haga un sistema de seguimiento bastante universal y confiable para algo. Sin embargo, vale la pena considerar que cuando se usa aruco 8x8, un tamaño de marcador de 10x8cm y una cámara en 1Mpx, no es particularmente posible aumentar el radio de detección, sin embargo, si tenemos limitaciones estrictas en tamaño y rendimiento, en general solo usamos equipos más interesantes.

Este año, las reglas mencionaron el uso de aruco 4x4, así como sus rangos no intersectantes para cada lado del campo. En el futuro cercano, planeamos integrar esto en nuestra solución para que en el futuro no tengamos miedo de la intersección de los números de marcador. Otra herramienta imprescindible, pero lo que aún no se ha hecho es la calibración manual en el campo.
En el próximo artículo, hablaremos sobre el nivel inferior de los robots, cómo se considera la cinemática de los robots, cómo controlamos servidores, motores y conos cuando trabajamos con freertos.

Quiero decir gracias:

Alexey Postnikov (en cuyo nombre probablemente valió la pena publicarlo todo), por lo general, para todo el código de este artículo y directamente ayuda para escribir el artículo.
Egor Alexandrov : para todos los dibujos y modelos, asistencia para escribir el artículo y 34 comas.
Tamara Sinelnikova : por ayuda para escribir el artículo.

¡Y el resto del equipo!

Quedan menos de 4 meses antes del inicio de la competencia, pero el equipo Sberbank Eurobot aún está abierto a nuevos participantes. Nuestro telegrama: https://t.me/SetUpSber

Artículos anteriores:

Lo que es común entre un revólver, lavadoras y un robot autónomo.
Propia pila de navegación. ¿Mejor que ROS?

Source: https://habr.com/ru/post/482220/


All Articles