A continuación describo algunos métodos en detalle. No respondo directamente a la pregunta de “recursos” o al punto de “practicidad”, pero debería haber suficiente información aquí para resolver esa parte.
- Solución algebraica directa
- Jacobian inversa
- Algoritmo de mínimos cuadrados amortiguados / Levenberg-Marquardt (inverso jacobiano modificado para ser estable cerca de las singularidades)
- Transposición jacobiana (enfoque de Steven Jorgensen; técnicamente, un enfoque de pendiente de gradiente; el trabajo virtual solo sirve para transmitir alguna intuición física)
- Cota de coordenadas conjugadas (CCD)
- Métodos de gradiente de conjugación
- Optimización directa (la mayoría de los métodos descritos aquí son algoritmos de optimización, pero enmarcados algebraicamente. Algunos problemas, especialmente en gráficos computacionales, se pueden encuadrar usando LP)
- Aprendizaje automático basado en enfoques; Geoffrey Hinton / UTronto / ANN tiene algunas referencias sobre esto, aunque pueden ser específicas de problemas de animación / CGI. El mismo problema de todos modos.
Así que veamos algunas derivaciones descriptivas de alto nivel aquí mientras reconocemos la pluralidad de formas de hacer sonar al gato. Me estoy saltando muchas constantes y factores de escala / cambio para mantener la simplicidad. Soy un formalista y no me gusta interpretar las cosas “físicamente”, así que simplemente siga las matemáticas, que son en su mayoría sustituciones simples, álgebra y eliminación.
Deja que FK sea descrito por
[math] x = f (q) [/ math]
donde [math] x [/ math] es la posición del efector final y [math] q [/ math] son parámetros conjuntos. IK se describe entonces como
[math] f ^ {- 1} (x) = q, [/ math]
- ¿Cuál es el mejor recurso para aprender Angular.js?
- ¿Puede recomendar algún curso de redacción y libros que valga la pena comprar para un principiante?
- ¿Qué hacen las personas en trabajos de finanzas (MBA)? ¿Cuáles son los recursos para estudiar finanzas (libros / cursos en línea)?
- ¿Cuáles son algunos de los mejores recursos para aprender MSBI (SSIS, SSRS, SSAS)?
- Quiero empezar a estudiar las matemáticas detrás de la relatividad general. ¿Dónde empiezo? ¿Cuáles son algunos buenos libros?
donde [math] f ^ {- 1} [/ math] es una función no lineal. La técnica más fácil e intuitiva es resolverla a mano (tediosa y propensa a errores, no generalizable), esto se llama solución algebraica / analítica directa . Pero podría no ser la mejor técnica debido a las restricciones h / w (complejidad de cómputo, implementación en un punto fijo …).
Los otros enfoques son numéricos. (Consulte el tutorial de Nikolaus Correll [Advanced Robotics # 4: cinemática inversa] para obtener más detalles sobre los mínimos cuadrados amortiguados y los enfoques jacobianos inversos).
El primer paso es linealizar [math] f (q) [/ math] y ajustarlo a las descripciones de álgebra lineal. Eso se hace usando el jacobiano (puede ver al jacobiano como la extensión multidimensional de la expansión de la serie de Taylor de primer orden). El jacobiano puede interpretarse para describir el cambio local en la posición del efector final y todos los cambios en los parámetros conjuntos. Por lo general, se calcula fuera de línea, pero a veces en línea (proyecto GOLEM) y muchos enfoques para implementar esto también.
De todos modos, después de la linealización [math] f (q) [/ math] se convierte en [math] J q [/ math] y, en efecto,
[math] \ delta x \ approx J \ delta q. [/ math]
Tenga en cuenta que esto es equivalente a las velocidades conjuntas / de efector final ([math] \ delta x [/ math] también puede considerarse error en la posición actual). Así que el problema de IK linealizado ahora se puede replantear como un problema de inversión de matriz,
[math] \ delta q = J ^ {- 1} \ delta x [/ math]
Tenga en cuenta que el jacobiano generalmente no es una matriz cuadrada (normalmente [math] 6 \ times n [/ math]). Por lo tanto, necesita un inverso generalizado (el pseudoinverso , que es único). La forma en que inviertes esto es:
[math] J \ delta q = \ delta x [/ math]
[math] J ^ TJ \ delta q = J ^ T \ delta x [/ math]
[math] (J ^ TJ) ^ {- 1} J ^ TJ \ delta q = (J ^ TJ) ^ {- 1} J ^ T \ delta x [/ math]
[math] \ delta q = (J ^ TJ) ^ {- 1} J ^ T \ delta x [/ math]
[math] \ delta q = J ^ + \ delta x [/ math]
donde [math] J ^ + [/ math] es el pseudoinverse ([math] J ^ T (JJ ^ T) ^ {- 1} [/ math] es una representación equivalente; considere la inversa de derecha / izquierda ). Esta es la técnica inversa jacobiana (equivalente al método de Newton para sistemas no lineales).
[Para comprender por qué esto tiene sentido, debería leer un poco sobre el análisis de regresión, la estimación de mínimos cuadrados, la proyección vectorial y algunas estadísticas; no es difícil, solo toma un tiempo internalizar todos los detalles importantes. Esta es una forma formal y bien conocida de resolver ecuaciones algebraicas lineales. El punto a tener en cuenta es que el pseudoinverso es una estimación de mínimos cuadrados de [math] \ delta q [/ math] que minimiza el error en los sistemas cartesianos ([math] L ^ 2 [/ math] space)]
Lo que pasa con los pseudoinversos es que, aunque son numéricamente precisos, tienen un uso intensivo de cómputo (se pueden implementar utilizando operaciones de fila simples, pero aún así lleva tiempo) y sufren de inestabilidad numérica (pérdida de rango en configuraciones singulares).
Hay varios enfoques para evitar los problemas con pseudo-inversos. Déjame hablar de Damped Least Squares a continuación. Una nota rápida sobre la descomposición del valor singular es útil. Los pseudoinversos se pueden calcular usando SVD,
[math] J = U \ Sigma V ^ T, [/ math]
entonces,
[math] J ^ + = V \ Sigma ^ + U ^ T. [/ math]
Si [math] \ sigma_ {ii} (\ neq 0) [/ math] son los valores singulares distintos de cero de [math] \ Sigma [/ math], entonces [math] \ Sigma ^ + _ {i, i} = 1 / \ sigma_ {ii} [/ math], lo que significa que obtener [math] \ Sigma ^ + [/ math] de [math] \ Sigma [/ math] es fácil. La inestabilidad de pseudoinverso ocurre cuando [math] \ sigma_ {ii} [/ math] tiende a cero.
Cuando usamos el método pseudoinverso, minimizamos la métrica [math] || J \ delta q – \ delta x || ^ 2 [/ math] y [math] \ delta q_i \ propto 1 / \ sigma_ {ii} [/ mates]. Entonces, si pudiéramos encontrar algo que diera [math] \ delta q_i \ propto 1 / (\ sigma_ {ii} + c) [/ math] donde [math] c [/ math] es una pequeña constante, entonces tener una situación en la que el pseudoinverso sea estable. La interpretación física sería que en vez de minimizar [math] || J \ delta q – \ delta x || ^ 2 [/ math], estamos minimizando [math] || J \ delta q – \ delta x || ^ 2 + \ lambda ^ 2 || \ delta q || ^ 2, [/ math]
el cual puede ser reescrito como
[math] \ bigg | \ bigg | \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] \ delta q – \ left [\ begin {matrix} \ delta x \\ 0 \ end {matrix} \ right] \ bigg | \ bigg |. [/ math]
Podemos repetir lo que hicimos antes para resolver esta ecuación.
[math] \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] \ delta q = \ left [\ begin {matrix} \ delta x \\ 0 \ end {matrix} \ right ],[/mates]
[math] \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] ^ T \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] \ delta q = \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] ^ T \ left [\ begin {matrix} \ delta x \\ 0 \ end {matrix} \ right], [/mates]
[math] \ left [J ^ T \, \, \, \, \, \ lambda I \ right] \ left [\ begin {matrix} J \\ \ lambda I \ end {matrix} \ right] \ delta q = \ left [J ^ T \, \, \, \, \, \, \ lambda I \ right] \ left [\ begin {matrix} \ delta x \\ 0 \ end {matrix} \ right], [/ math]
[math] (J ^ T J + \ lambda ^ 2 I) \ delta q = J ^ T \ delta x, [/ math]
[math] \ delta q = (J ^ TJ + \ lambda ^ 2 I) ^ {- 1} J ^ T \ delta x, [/ math]
[math] \ delta q = J ^ T (JJ ^ T + \ lambda ^ 2 I) ^ {- 1} \ delta x. [/ math]
Si ahora sustituimos a la SVD por [math] J [/ math], obtenemos
[math] \ delta q = \ left [V \ Sigma ^ TU ^ T \ right] \ left [U (\ Sigma \ Sigma ^ T + \ lambda ^ 2 I) U ^ T \ right] ^ {- 1} \ delta x [/ math]
[math] \ delta q = \ left [V \ Sigma ^ T (\ Sigma \ Sigma ^ T + \ lambda ^ 2 I) U ^ T \ right] ^ {- 1} \ delta x [/ math]
Debe tener en cuenta que [math] \ Sigma ^ T (\ Sigma \ Sigma ^ T + \ lambda ^ 2 I) [/ math] lleva a los valores [math] \ delta q_i \ propto \ sigma_ {ii} / (\ sigma ^ 2_ {ii} + \ lambda ^ 2) [/ math]. Básicamente, eso indica que los mínimos cuadrados atenuados evitan problemas de singularidad (pero seleccionar [math] \ lambda [/ math] también es un desafío: los valores grandes conducen a una convergencia más lenta). Tenga en cuenta que al igual que la técnica inversa jacobiana, esto también es un num. Técnica de optimización.
Un inconveniente de estas técnicas es que son muy pesadas.
Para evitar esto, podemos usar el método de transposición jacobiano (descrito en la respuesta de SJJ). SJJ defiende el uso de la transposición jacobiana utilizando el principio de trabajo virtual , el trabajo realizado por fuerzas y pares es el mismo (yo personalmente no compro esa interpretación, principalmente porque no lo entiendo, así que no intentaré convencerte a ti tampoco, pero te presento la idea básica aquí:
[math] F ^ T \ delta x = \ tau ^ T \ delta q, [/ math]
[math] F ^ TJ \ delta q = \ tau ^ T \ delta q, [/ math]
[math] F ^ TJ = \ tau ^ T, [/ math]
[math] (F ^ TJ) ^ T = (\ tau ^ T) ^ T, [/ math]
[math] \ tau = J ^ T F. [/ math]
Ahora, asumiendo [math] \ tau \ propto \ delta q / \ delta t [/ math] y [math] F \ propto \ delta x [/ math], obtenemos,
[math] \ dot {q} = J ^ T \ delta x, [/ math]
el cual puede ser reescrito como,
[math] \ delta q = h J ^ T \ delta x, [/ math]
donde [math] h [/ math] es solo un paso de tiempo. Este es el método de transposición jacobiano . Pero no compro argumentos de trabajo virtual. Lo que sí compro es que este método representa un tipo de pendiente de gradiente, el método de pendiente más pronunciada . Esto funciona porque el error estimado de esta actualización,
[math] \ delta \ hat {x} = J \ delta q = h JJ ^ T \ delta x, [/ math]
reducirá el error real, [math] \ delta x [/ math] por [math] h [/ math], desde el producto interno de los dos (Buss, 2009),
[math] \ langle \ delta x, \ delta x \ rangle> \ langle \ delta \ hat {x}, \ delta x \ rangle = h \ langle JJ ^ T \ delta x, \ delta x \ rangle [/ math]
[math] = h \ langle J ^ T \ delta x, J ^ T \ delta x \ rangle \ geq 0. [/ math]
Si tiene [math] T [/ math] disponible para moverse de una orientación a la siguiente, elija [math] h [/ math] de manera que [math] h = \ lfloor T / n \ rfloor [/ math] donde [math ] n [/ math] es el número de iteraciones / actualizaciones. [math] n [/ math] debe ser proporcional a la magnitud de la diferencia entre las orientaciones inicial / final.
El método de transposición no tiene problemas con las singularidades (más estable, y la matemática se ejecuta más rápido). Pero al ser una aproximación, no converge tan rápido como la inversa jacobiana. Se pueden usar definiciones más sofisticadas para [math] h [/ math] para hacer las cosas más rápido.
Vamos a discutir el método de descenso de coordenadas cíclicas para problemas de IK a continuación. En realidad, es intuitivamente simple: resuelve los problemas de 1DOF IK desde la unión al suelo hasta la unión del efector final, minimizando el error, [math] \ delta x [/ math] en cada paso. Lo bueno es que es simple y rápido (soluciones analíticas de trigonometría IK) y no sufre fluctuaciones en configuraciones singulares. También permite implementar posturas intermedias específicas y comportamientos preferenciales. El problema es que no es suave, y puede terminar con configuraciones incómodas. Este es un enfoque comercial popular cuando se trata de entornos inciertos.
Existen muchos otros tipos de técnicas de IK que funcionan al definir una función de costo / objetivo, restricciones y utilizan enfoques numéricos para minimizar el error final.
Algunos enfoques pueden ser impulsados por el aprendizaje automático. Por ejemplo, puede generar un cuerpo de postura de brazo antromórfico examinando videos de brazos humanos que se estiran para agarrar objetos. Luego, asocia una probabilidad con cada postura conjunta y la mide sobre el cuerpo. Por lo tanto, dadas las opciones de posturas múltiples, puede optimizar las posturas conjuntas para que coincidan con las de mayor probabilidad basadas en el conjunto de datos antromórficos.
Pero la diversión no termina aquí. Todo lo que hemos discutido hasta ahora es la parte de la cinemática: excelente para CGI, pero no tanto para máquinas reales. Debe tener en cuenta la dinámica del actuador, el ancho de banda de procesamiento / interfaz, la fricción, las métricas de error y los filtros de suavizado, entre otros. Por ejemplo, imagine un reloj de 80 MHz, se necesitan unos 100 ciclos para calcular los valores de math.h
flotante. math.h
acos
/ cacos
; si usa tipos fijos, pierde el beneficio de la precisión y se ve obligado a usar trucos de filtro / DAC para evitar el jitter; Si utiliza técnicas de aproximación, necesita un compensador / filtro de error antes de hablar con el conductor del motor. Sus motores (cargas inductivas) tendrán una latencia de respuesta asociada a ellos y aunque sus instrucciones para todos los actuadores lleguen instantáneamente, algunos motores tardarán más tiempo en reaccionar (los motores de hombro / codo / base) sobre los demás (actuadores de muñeca / herramienta más pequeños ).
Así que una advertencia final antes de que creas que esto es lo rápido que funciona IK en máquinas reales, no. Esta es una buena teoría y orientación, y muy buena para la animación, pero inútil en los volúmenes de la industria y las operaciones de campo. Los sistemas de producción están optimizados a mano con una combinación de circuitos de señales mixtas (circuitos analógicos y digitales), series de expresiones aproximadas para filtros y matemáticas, con compensadores de errores en cascada. Esto es principalmente diseño específico de IP. Si usa más de 300 DMIPS DSP en ventas de menos de 100 skus / año premium, está desperdiciando dinero. De hecho, algunos de los mejores sistemas son radhard / millspec 883 a <10 MIPS. Debería dejar de hablar ahora.