Cámaras de visión artificial para entusiastas. ¿Cómo usar la cámara para la navegación fuera de línea?

Hicimos una cámara para detectar AprilTag y ArTag con mROS. Conéctese a través de Uart o Ethernet.



Probamos JeVois y OpenMV, apreciamos los pros y los contras, y montamos nuestra cámara.



Busque etiquetas visuales y la orientación del robot en función de los datos. Estamos desarrollando un robot para recoger pelotas de golf en el campo de prácticas . Ahora, en el mundo, solo una compañía vende un robot para resolver este problema. El mercado es muy prometedor, nos animó a convertir el proyecto de bricolaje en una startup tecnológica.

Al usar GPS sin RTK para navegar por el robot, es difícil lograr la precisión necesaria para buscar correctamente una base y estacionamiento. Usando Real Time Kinematic, tendré problemas al acercarme a los edificios. Probamos varias opciones y decidimos hacer nuestra propia cámara para buscar una marca visual en la entrada de la base.

Parte del desarrollo del robot fue su estacionamiento en la estación de acoplamiento para descargar el compartimento de bolas y cargar las baterías. Durante mucho tiempo pensamos en cómo estacionarlo, acordamos que el robot encontraría un objeto óptico brillante y lo seguiría.

Las etiquetas AprilTag o ArTag fueron elegidas como el objetivo, dependiendo de cómo se mostraran en el campo. Porque no sufrimos el síndrome NIH : ha comenzado la búsqueda de cámaras de visión artificial con soporte para estos marcadores y con soporte para guiones directamente en la cámara.

First JeVois


De lo que se encontró rápidamente: JeVois , desarrollado por el laboratorio de la Universidad del Sur de California. Desafortunadamente, tuve que hacer un pedido a Rusia a través de Amazon, no había revendedores internos y aparentemente no habrá ninguno, aparentemente el marketing y las ventas son llevados a cabo por los propios desarrolladores (nos sorprendió bastante cuando tuvimos que cambiar de Jevois a Jevois inc para comprar una cámara y luego busque un enlace al directorio: seleccione la cámara en algún lugar en el medio de 10-12 posiciones).



Las primeras ejecuciones en la computadora fueron bastante alentadoras, en general, todo salió de la caja y parecía bastante interesante. Sin embargo, después de las pruebas de conexión a la placa de control, se pusieron de manifiesto cuatro problemas graves:

Los 60-90 FPS indicados en los materiales publicitarios son para resoluciones de 160x120 o 320x240, lo que no es en absoluto adecuado para el estacionamiento; la captura aún es deseable desde una distancia de al menos 5 metros. Y para que un cuadrado caiga en el grano 160x120 de 6-8 metros, debe hacerlo al menos de medio metro de tamaño y al acercarse, primero cierra completamente el marco y luego deja de detectarlo.

Consumo de 800 mA, mientras que la alimentación es solo a través de cables USB con mini USB, que pueden soportar esta corriente sin mucha caída de voltaje. Resultó ser muy difícil encontrar un cable con una longitud de al menos medio metro con tales características: se seleccionaron unas 15 opciones y, de todos modos, el resultado no fue muy satisfactorio.

La cámara está ciega por la noche o parpadea durante el día. El equilibrio automático funciona más allá del bien y del mal.

La cámara es enfriada por un ventilador. El ventilador es muy pequeño, la velocidad es alta: ruido de alta frecuencia o simplemente un chirrido.

El robot chirriante es lo último que queríamos hacer.

Escribir el código de ejecución dentro de la cámara es un entretenimiento separado: instalar el entorno es un asunto bastante confuso, y ensamblar y cargar en la tarjeta SD lleva al menos 2-5 minutos. Sí, no hay flash: todo está en la tarjeta SD.

Conclusión: una cámara para jugar con entusiastas en interiores y con buena iluminación. Al mismo tiempo, sería deseable que los entusiastas fueran estudiantes: la interfaz, la documentación y los métodos de trabajo con la cámara me recordaron vívidamente el trabajo de laboratorio de los estudiantes, donde casi no se prestó atención a la conveniencia de trabajar con el sistema y otros excesos. Esto se trata de módulos C ++, por supuesto. Los scripts de Python se pueden editar a través de Jevois Inventor, pero el FPS también es significativamente más bajo. Fuera de las instalaciones, la cámara ni siquiera sobrevivió a dos lluvias, y el ventilador obstruyó la tierra en el campo con velocidad espacial.

El resultado: no es adecuado para su uso en el robot, pero se ha demostrado la posibilidad fundamental de estacionamiento.

OpenMV 3 y todas sus variantes




En el momento de la primera búsqueda, simplemente no estaba disponible: había una campaña en Kickstarter .

Después de jugar lo suficiente con JeVois y tirar 100 dólares a la basura, se encontró un vendedor con acciones y se compraron 2 piezas.

En general, las impresiones son extremadamente agradables: una interfaz extraordinariamente pensada en el IDE de OpenMV, una compilación transparente de Python, es conveniente ver el algoritmo funcionar y depurarlo. Sin embargo, hubo problemas aquí:

  • La resolución puede ser cualquiera, pero AprilTag solo se puede buscar en un área de no más de 200x200 píxeles. Volvemos al problema del grano, etc. El desarrollador recomendó primero extraer blobs, luego mirar los códigos en ellos. Pero en algo que no sea un fondo liso (idealmente una pared blanca) esto no funciona, la hierba verde y el sol brillante contra el fondo convierten todo en gachas. Además, el FPS se reduce a un máximo de 5.
  • Sensor Omnivision barato + óptica barata = imagen jabonosa. Visualmente, esto no es muy notable cuando se ve una transmisión de video, pero cuando se ven cuadros individuales es claramente visible.
  • No hay cortina IR, pero hay iluminación IR. [WHAAAAT?]
  • No hay protección contra el entorno externo. En absoluto



El script fue depurado en esta cámara, se realizaron varias docenas de estacionamientos. Sin embargo, después de que el robot rodó de Moscú a San Petersburgo y regresó, la cámara dejó de encenderse: el regulador de potencia se apagó. La acción obvia fue el empaque y la estabilización de potencia. Y aquí se descubrió lo más interesante: el caso con la IP correcta para esta cámara simplemente no se pudo encontrar, o eran cajas con cubiertas transparentes, sin montajes internos y entradas / salidas de cable apretadas. Como resultado de la búsqueda, se encontraron una gran cantidad de cámaras de vigilancia chinas baratas con los casos correctos. La cámara fue comprada y destripada, una segunda copia de OpenMV estaba en lugar del tablero, todo funcionó.
Pero la tarde y la noche se convirtieron en un obstáculo casi insuperable: no hay cortina de infrarrojos.

Resultados: la cámara es MUY conveniente para la creación de prototipos, los recursos son limitados, no hay protección contra el entorno externo (la segunda cámara fue a un congelador industrial y no sobrevivió -30). No bueno

Y luego se volvió muy interesante para nosotros qué tipo de tableros obtuvimos de las cámaras chinas

Clones HiSilicon


En una inspección más cercana, resultó que la placa tiene un ARM de 2 núcleos, procesador DSP, cortina IR, iluminación IR, un sensor decente de Sony, la placa está cubierta con un compuesto protector + carcasa para la calle. Justo lo que necesita: queda por recopilar software.

Inside resultó ser un clon de Linux bastante funcional de HiSilicon + u-boot.
Tuve que descargar el SDK de los recursos chinos y tratar con ensamblajes. En principio, no se encontró nada terrible en el camino, excepto que era necesario arreglar varios archivos dentro del SDK: la distribución de Linux en la que el SDK iba a ser bastante antiguo, y algunos archivos de encabezado han cambiado desde entonces. Bueno, tuve que cambiar el shell de zsh a bash. Omitiré los detalles; para bien, este debería ser un artículo separado.

Estos recursos ayudaron:

Analizando, conectando a la cámara

Ejemplo de diagrama de ensamblaje de software

Entonces todo salió de acuerdo con el conocido esquema:



La mayor parte del tiempo que tardé en obtener la imagen del sensor, terminé el resto en solo 4 horas, simplemente transfiriendo el algoritmo depurado de Python a C ++.
Trabajar con el sensor tomó aproximadamente una semana y media. Por supuesto, no hay / dev / video0 en estos dispositivos, hardware casi desnudo con trabajo directo con memoria y puertos.
Debemos decir de inmediato que las muestras del SDK funcionan sin modificación solo en los paneles de depuración para estos SDK, de lo contrario, se requieren muchas ediciones menores. Por extraño que parezca, el problema principal es determinar qué sensor está en la cámara, porque los chinos escriben uno en la descripción, otro está marcado en la pizarra, el tercer modelo se inicializa en el software. Como ejemplo, la cámara tiene un sensor IMX323 en la descripción, la placa está marcada SC2235, cuando se inicia en scripts de inicio, comienza como AR130, y el software de la cámara lo inicializa como SC2235P.

Las razones de todo esto son bastante simples: para el usuario final, que IMX323, que SC2235 son todos iguales, la imagen es muy similar. El kernel y rootfs con scripts int se ensamblaron desde el SDK con cambios mínimos y no se molestaron con un script de inicialización separado para cada modelo, solo los parámetros de inicio correctos, y el nombre se dejó como estaba. En el software para trabajar con la cámara, la segunda pieza de inicialización del DSP con el sensor ya se lanzó y el modelo exacto de la cámara ya es crítico allí, por lo tanto, los registros ya tienen el modelo exacto: SC2235P. P: esto es importante, es un sensor diferente en términos de características, que incluso funciona con una frecuencia de bus ligeramente diferente y una resolución diferente en comparación con SC2235.

La segunda parte de la búsqueda son las hojas de datos de los sensores, que en general no lo son. Por lo tanto, tuve que reconstruir el módulo hi_i2c con la impresión en el registro a través de printk y reemplazarlo en el volcado eliminado de la cámara, escribir el amortiguador de configuración DSP del procesador de video y eliminar las configuraciones de la cámara en funcionamiento, y varias veces para ver los controladores del proyecto DafangSoftware. En detalle, esto dibuja 3-4 artículos separados, que tengo la intención de escribir después de NG.

Al final, todo resultó incluso mejor de lo esperado: trabajo seguro para capturar AprilTag desde 6 metros incluso en la oscuridad casi completa, 25-12 fps, controlador de control de estacionamiento PID, etc.
El resultado: es lo máximo para trabajar en el campo, se han tenido en cuenta muchas cosas para protegerse contra las condiciones externas. Lo único que no pudo verificarse completamente fue el trabajo en el sol brillante, el clima desde octubre se ha deteriorado.

Idea para el desarrollo


Y aquí tuvimos una idea: tenemos en nuestras manos un análogo de OpenMV con características de hardware y producción en masa mucho mejores. Queda por llevar el trabajo con la cámara al nivel OpenMV, a micropython allí, hacer un IDE conveniente y verificar dos veces cómo funcionarán los scripts actuales de OpenMV. Además, mRos está completamente portado allí, y esto inmediatamente expande el uso de tales cámaras para sistemas ROS.

Como resultado, planeamos entregar análogos de OpenMV en marzo y mROS en mayo.

Para reducir el precio de personalizar la cámara, estamos listos para ofrecérselo. Complete el formulario y nos pondremos en contacto con usted cuando estemos listos para ordenar el primer lote.

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


All Articles