Primero, necesitamos definir óptimo . Como no dice lo que considera óptimo, la mayoría de las personas elige una expresión cuadrática. Por ejemplo, suponga que sus ángulos comunes actuales están dados por el vector . Podemos considerar minimizar el movimiento requerido: con un error → x = → α - → α s t a r t , puede definir una función de costo J = → x T Q → x para alguna matrizα⃗ X⃗ = α⃗ - α⃗ s t a r tJ= x⃗ TQx⃗ . Normalmente usamos una matriz diagonal, pero cualquier matriz positiva definida.Q
En un ejemplo simplificado con dos ángulos de unión, si la unión tuviera un motor más barato (quizás más cerca del efector final), podríamos tener una función de costo deuna
, es decir. El movimiento de la articulación b es dos veces más costoso que la articulación a .J= [ xunaXsi] [ 10 00 02] [ xunaXsi]siuna
Ahora, la ecuación cinemática es una fórmula matricial, y en notación Denavit-Hartenberg podría ser:
, donde el lado derecho representa la posición ( x , y , z ) y la orientación (actualmente establecida como rotación cero), dada la ángulos articulares∏ Tyo= ⎡⎣⎢⎢⎢10 00 00 00 010 00 00 00 010 0Xyz1⎤⎦⎥⎥⎥( x , y, z)
Como no nos importa la orientación, y solo la posición, podemos truncar las primeras 3 columnas de la última matriz de transformación y la última fila de la primera matriz de transformación. Podemos expresar de manera equivalente esta fórmula como:
⎡⎣⎢10 00 00 010 00 00 010 00 00 0⎤⎦⎥∏ Tyo⎡⎣⎢⎢⎢0 00 00 01⎤⎦⎥⎥⎥= ⎡⎣⎢Xyz⎤⎦⎥
Multiplicando el lado izquierdo, obtenemos tres ecuaciones. Si los parámetros fueran lineales, sería fácil de resolver. Este es el caso si todos los actuadores son actuadores lineales. En este caso, el problema es en realidad un programa cuadrático . Podemos reorganizar el lado izquierdo para obtener la ecuación:
, para alguna matrizKX⃗ = ⎡⎣⎢Xyz⎤⎦⎥ .K
Un programa cuadrático es un problema que se puede expresar en la forma:
Minimizar J= 12X⃗ TQ x⃗ + c⃗ TX⃗
Sujeto a , E → x = → dA x⃗ ≤ b⃗ miX⃗ = d⃗
Para resolver esto, hay una serie de algoritmos que puede usar, por ejemplo, punto interior, conjunto activo, .... Simplemente encuentre una biblioteca adecuada y la resolverá por usted.
Un sistema no lineal de ecuaciones es más difícil de resolver. Esto se llama programación no lineal , pero es lo que tiene si tiene uniones giratorias.
Esencialmente, en lugar de ecuaciones matriciales, tiene funciones no lineales.
Minimice sujeto a → h ( x ) = 0 , → g ( x ) ≤ 0 (reorganice si es necesario para que el RHS de las restricciones sea cero)F( x )h⃗ ( x ) = 0sol⃗ ( x ) ≤ 0
Los algoritmos utilizados para resolver esto son aún más complejos, pero incluyen algoritmos reflexivos de punto interior, programación cuadrática secuencial (SQP), conjunto activo y región de confianza. Obviamente, la explicación de cómo funcionan estos algoritmos es muy extensa, y la dejaré fuera del alcance de esta respuesta. Baste decir que la cantidad de contenido en los algoritmos utilizados para la programación cuadrática podría ser un curso completo en sí mismo.
Debería encontrar una biblioteca para resolver el problema, llevaría mucho tiempo codificar una implementación eficiente, y las implementaciones eficientes pueden manejar 100 (o más) variables a la vez. Por ejemplo, si usa MATLAB, entonces hay documentación sobre cómo usar la función fmincon de Optimization Toolbox.
Para resolverlo en línea, es posible que desee C ++ u otra implementación nativa, por ejemplo, NLopt. Tenga en cuenta que esto puede no ser algo que un microcontrolador pueda resolver rápidamente, y muchas bibliotecas pueden tener otras dependencias que no son fáciles de usar en un microcontrolador (ya que están destinadas a una computadora).
Si no le preocupa la eficiencia y solo quiere algo que pueda codificar usted mismo, entonces suponiendo que haya una función que pueda llamar para resolver el problema cinemático inverso , simplemente puede hacer un método de descenso de gradiente. Por ejemplo, eligiendo arbitrariamente una orientación inicial aleatoria, resuelva el problema inverso y luego verifique la función de costo. Luego puede usar el análisis de perturbaciones para verificar cómo debe variar la orientación. Por ejemplo, si verifica orientaciones similares alrededor de su orientación actual (es decir, 8 puntos en una cuadrícula cúbica), puede obtener una aproximación de segundo orden de cómo varía la función de costo en cada dirección.
Usando la aproximación de segundo orden (conocida como matriz de Hesse, ya que es multivariada - tridimensional para orientación), puede encontrar el cruce por cero del gradiente de la función de costo (es decir, los mínimos locales pronosticados).
Con la nueva orientación prevista, simplemente vuelva a pasarla por el solucionador inverso y repita hasta que la precisión sea suficiente.
Tenga en cuenta que esto probablemente no será tan eficiente, porque el problema cinemático inverso en sí mismo debe resolverse de forma iterativa (por lo que está utilizando repetidamente una función que a su vez lleva un tiempo resolver). Además, el código involucrado puede ser menor que un algoritmo de optimización completo, pero sigue siendo bastante sustancial y no es una inversión de tiempo insignificante.
Usando cualquiera de los métodos (resolviendo formalmente como un programa no lineal o usando iterativamente usando una función para resolver el problema inverso), la solución puede no ser óptima si hay múltiples mínimos locales. En este caso, puede intentar encontrar los mínimos globales utilizando varios enfoques. Incluso con un solucionador de programación no lineal, se espera que lo siembres con valores iniciales (por ejemplo, ángulos de unión). Puede ejecutar repetidamente cualquiera de los métodos con la semilla generada de varias maneras:
- reinicio aleatorio (se genera aleatoriamente)
- basado en cuadrícula
u otros métodos personalizados.
Sin embargo, tenga en cuenta que si hay muchos mínimos, no hay una buena manera de garantizar que encontrará los mínimos globales. Solo puedes mejorar tus posibilidades.