Como hice un traje de captura de movimiento
Prólogo
En mi pequeño pueblo, estoy comprometido a resolver problemas técnicos no triviales. Así que esta vez, los organizadores de un espectáculo, en el que se suponía que la gimnasta debía actuar con su programa, decidieron agregar un poco de "relieve" a su actuación. Es decir, mostrar la silueta de una gimnasta en las pantallas, que repetiría sus movimientos e interactuaría de alguna manera con otros efectos, de modo que todo fuera interactivo. No fue posible resolver el problema "frente". Kinect claramente no pudo hacer frente a su tarea y no pudo capturar los movimientos de una persona que está al menos a 10 metros de distancia, también en la oscuridad. Entonces se decidió hacer algo "propio". Mirando hacia el futuro, diré que la presentación no tuvo lugar, pero me entusiasmó tanto la idea que continué mis experimentos como un proyecto separado, que luego se denominócorredores de impulso .Empezando
Comencé a crear prototipos del futuro dispositivo tan pronto como recibí los componentes necesarios. A saber:- Arduino UNO es un conocido controlador-diseñador, que le permite desarrollar un prototipo en poco tiempo.
- HC-06 - módulo bluetooth, servirá como un medio de comunicación inalámbrica. El módulo es muy simple, tiene una interfaz UART.
- MPU-6050 : los únicos sensores de inercia disponibles para mí en ese momento. Inmediatamente compré 2 para verificar cómo funcionan en pares, porque en el futuro es necesario usar hasta 15 sensores en un sistema. Este sensor combina un acelerómetro y un giroscopio, así como un sensor de temperatura para ajustar la salida.
Después de haber recibido todo de esta lista, ya estaba ansioso por ver el mpu en acción. En el foro oficial de Arduino, hubo varios ejemplos de uso de estos sensores, y utilicé uno de ellos. Para conectar los sensores, se utilizan 5 pines (contactos):- VCC, GND : todo está claro, el poder y la tierra. Vale la pena señalar que el voltaje de funcionamiento del sensor es 3.3v, pero a 5v se siente bien. Consumo de energía menos de 0.05Ah
- SCL, SDA - en realidad los pines a través de los cuales hay una "comunicación" con el sensor. Estos pines son responsables de la interfaz i2c. Esta interfaz implementa el cambio entre dispositivos en el mismo bus, en otras palabras, el bus es la calle y las casas en él son los dispositivos.
- INT - pin para interrupciones. Tan pronto como los datos en el sensor estén listos, el controlador principal los toma en interrupción.
Sin embargo, este ejemplo muestra solo valores "brutos" del acelerómetro en el terminal, y el código se escribió para convertirlo en ángulos familiares, y luego se implementó el Filtro Kalman, y todo esto ya ocupaba alrededor del 70% de los recursos de Arduino UNO. Sin embargo, los valores bastante suaves de los ángulos ya estaban llegando a la terminal, el dispositivo fue bastante rápido en el espacio, aunque solo un par de minutos, después de lo cual el búfer FIFO estaba lleno. Pero funcionó!
Estabilizar!
Poco a poco, la alegría del sensor de trabajo se vio ensombrecida por la duración de todo el sistema. Por mucho que no luché con el búfer FIFO, se desbordó. Vale la pena señalar que en ese momento había poca información sobre estos sensores y sistemas generalmente similares, y tuvo que recopilarse literalmente poco a poco. Habiendo decidido que el problema radica en la implementación de la interfaz i2c, comencé a buscar en esta dirección y encontré la biblioteca de usuario I2Cdev, que fue diseñada para reemplazar la biblioteca de cable estándar para arduino. Una agradable sorpresa fueron los ejemplos anidados de uso de esta biblioteca junto con mpu-6050. Después de reconstruir el proyecto en esta biblioteca, también recibí datos sin procesar y los convertí en esquinas con mi código, pero no hubo más desbordamientos. Esta fue una pequeña victoria. Más tarde, mientras estudiaba el interior de la biblioteca, encontré muchas cosas útiles. Entonces por ejemploahora usando datos de ambos sensores, y el acelerómetro y el giroscopio. El hecho es que el acelerómetro le permite determinar los ángulos de inclinación exactos del dispositivo solo en reposo hasta que actúan fuerzas externas sobre él, y el giroscopio está diseñado para compensar estas mismas fuerzas. El uso de datos de ambos sensores se hizo evidente, y aquí un filtro complementario encontró aplicación. Sin embargo, hubo un problema de deriva cero, pero más sobre eso más tarde.!
Y de nuevo un arrecife. Esta vez, el problema que se me presentó fue utilizar el segundo sensor mpu-6050. Ya di una analogía de la interfaz i2c en este artículo, donde el autobús es la calle y los dispositivos están en casa. Imagine que un paquete de datos que debe llegar a un dispositivo específico es un cartero. El cartero necesita 2 cosas: el paquete y la dirección, y cada casa tiene su propia dirección única, y los dispositivos deben tener sus propias direcciones. El problema está precisamente en la dirección del sensor mpu-6050, es uno para todos estos sensores: 0x68. Esta dirección se muestra en el controlador del sensor en la fábrica, pero no es posible encontrar el firmware y cambiar la dirección de cada sensor. Los foros extranjeros dieron una solución: conectar sensores uno tras otro, una pata del primer sensor se conecta al pin AD0 del segundo,y está disponible a 0x69, pero este método implica el uso de no más de 2 mpu e inmediatamente lo descarté.La solución fueron los transistores. La idea era colocar un par de transistores en los pines i2c frente a cada sensor y abrirlos alternativamente. El algoritmo es simple: es necesario leer los datos del quinto sensor, cerrar todas las puertas excepto el quinto (o abrirlo si es necesario) y leer, luego de manera similar obtenemos datos del resto. El resultado se puede ver en la primera foto de este artículo, y es bastante viable. De manera similar, logré conectar 4 sensores, esto no afectó la estabilidad de la mejor manera, y cuando me quedé sin transistores decidí usar microcircuitos más compactos y estables.La única foto sobreviviente de esa etapa (pido disculpas por la calidad):
Controlador de puerta
Un dispositivo que combinará estos microcircuitos y le permitirá comunicarse con muchos sensores de mpu, lo llamé controlador de puerta. Me ayudó un buen amigo que ya tenía experiencia con las placas de grabado, pero necesitaba una cualidad que mis intentos anteriores de grabado no tenían. Debido a las muchas pistas que se cruzan, se requería un tablero de dos capas, pero uno de varios niveles también encajaba como prototipo. El resultado de este trabajo fue un tablero tan inusual:Ahora queda por comprobar el dispositivo en acción. Después de haber conectado 10 sensores a la vez, en el monitor aparecieron exactamente los mismos mensajes agradables sobre una inicialización exitosa: ¡el dispositivo funciona!
Gimble Lock, Quaternions, visualización
Gimble lock, en cerradura con bisagras rusas o marcos plegables: un fenómeno desagradable en el campo de los giroscopios y, en algunos casos, la orientación en el espacio. Sin una larga explicación de este fenómeno (hay buenos videos explicativos y visuales sobre este tema), solo diré que este bloqueo con bisagras no permite que el sensor gire 360 grados. Los ejes XZ (desviaciones del plano horizontal) están limitados de aproximadamente -45 a 45 grados, y no se definen correctamente más allá de estos límites. Habiendo estudiado este tema con más detalle, resultó que la solución está bajo mi nariz. Los MPU-6050 son sensores de seis ejes, y tienen dmp a bordo. Dmp (procesador de movimiento digital) hace todo lo que escribí en el código principal para flashear el controlador principal durante tanto tiempo, e incluso filtra los valores. Además, dmp puede generar datos en forma de cuaterniones,lo que le permite evitar el bloqueo de la bisagra, así como también le permite reducir el tamaño de los paquetes reenviados. En este punto, mi amistad con los cuaterniones continuó, antes trabajé con ellos en Unity3D y tuve una idea. En términos simples, un cuaternión es un sistema de números (4 números) que describe la rotación de algo en el espacio. Recordando Unity, traté de retratar algo como esto:
Controlador
Arduino y el controlador de puerta se han justificado, pero su uso en la versión final no fue intencionado. Es hora de hacer que el controlador sea específico y personalizado para una tarea específica. Para entonces, prácticamente modifiqué el firmware para el futuro controlador, configuré dmp de la manera óptima, lo que me permitió rechazar el uso de interrupciones. Por lo tanto, cada sensor estaba conectado por cuatro pines, y no cinco, como antes. Además, no había necesidad de dos de los seis chips en el controlador de puerta. Todas estas mejoras llevaron al hecho de que la placa para el futuro dispositivo se diseñó en dos direcciones, y no se necesitaba más "over-the-top".
Vivienda
El dispositivo gradualmente tomó su forma final, y el siguiente paso fue hacer que el caso fuera lógico. La solución obvia es ordenar o recurrir a los servicios de impresión 3D. Pero todo esto es simple y poco interesante, por lo que compramos nuestra propia impresora 3D por un par de cosas. En ausencia de instrucciones, lo ensamblaron en un nivel intuitivo, pero todo funcionó. En general, el montaje, la configuración y la preparación para la impresión en sí merecen un artículo separado, pero no se trata de eso. Usando todo el material de prueba, todo lo que quedaba era esperar hasta que llegara el plástico ABS.Para la simulación, se seleccionó el programa 123D-Design. El programa es intuitivo, y cualquiera que tenga al menos un poco de experiencia en editores de gráficos 3D lo dominará rápidamente.
Luego imprimió todos los estuches, conectó los sensores al controlador a través de delgados cables de 4 clavijas, hizo montajes para los sensores, juntó todo y obtuvo un traje portátil listo para usar. Para el primer prototipo es bastante adecuado.


Software
Debido a algunas circunstancias, pospuse Unity3D "para más tarde", los plazos se estaban agotando y tuve que escribir rápidamente un programa para su visualización. He estado trabajando con el motor gráfico Xors3D durante mucho tiempo (tal vez alguien lo sabe) y esta vez no me decepcionó. Sin embargo, después de que valió la pena, no volví a Unity, sino que seguí desarrollando el entorno visual para el disfraz en este motor en particular.
Lista de características actuales:- Visualización: el programa muestra el modelo de una persona, que en tiempo real repite todos los movimientos de una persona en un traje
- Calibración automática: le permite calibrar su traje al instante en cualquier momento
- Posicionamiento: el modelo también se mueve en el espacio como una persona, puede agacharse, caminar, etc.
- Grabación / reproducción: todos los movimientos se pueden grabar y reproducir.
- Modo de vista en primera persona: se proporciona salida de imagen para oculus rift y otros cascos de realidad virtual.
- Interactividad: una persona con traje puede afectar el mundo virtual. Patear pelotas, abrir puertas, torcer un carrusel, etc. (motor físico)
Conclusión
Por el momento, el proyecto tiene 1 prototipo totalmente funcional, autónomo, portátil e inalámbrico y todo el software necesario. Me llevó 8 meses desarrollar este disfraz (2 de los cuales descansé, un total de 6), pero para mí esta es toda una era. Durante el proyecto, aumenté mis habilidades, probé e hice mucho de lo que tenía poco conocimiento antes, pude ganar un poco.Cuando comencé, solo había un interés en "¿cómo funciona?" y la existencia de tales disfraces que aún no conocía. Sin embargo, durante el período de desarrollo, al menos 3 de estos proyectos llegaron a sitios de crowdfunding, y quería desarrollar de alguna manera el impulso como un proyecto comercial, pero es extremadamente difícil expresarme cuando estoy en el territorio Trans-Baikal. Ahora no hay suficiente motivación para sentarse para un segundo prototipo, ya inalámbrico y basado en sensores de 9 ejes, por lo que lo más probable es que este proyecto siga siendo para mí una experiencia enorme y útil. En este artículo quería resumir todo el trabajo realizado, aunque no se muestra aquí y el 20% de él. No todos estarán interesados en toneladas de código y horas de soldadura, impresión 3D, mucha prueba y error, mucho material usado, pero intentaré responder a esas preguntas en los comentarios.Source: https://habr.com/ru/post/es392353/
All Articles