Curva de movimiento 'Mejor ajuste' para un perfil inalcanzable

7

Tengo una función discreta que representa una posición 1d en el espacio a lo largo del tiempo. Tengo un sistema de movimiento que me gustaría lograr esta curva, pero, debido a restricciones en el tirón (tercera derivada) y la aceleración (segunda derivada), no puede lograr el movimiento. Esto ocurre debido a una discontinuidad en la función, donde pasa de una señal plana a un aumento brusco.

Estoy buscando un algoritmo que tome las series discretas y produzca una nueva serie que se aproxime al original, sin violar los límites superiores de la magnitud de las derivadas segunda y tercera. No tengo una definición estricta de cómo me gustaría minimizar el error para la posición, pero un ajuste de error de media cuadrática de suma estándar es probablemente razonable. Para la derivada, me estoy aproximando usando la diferencia centrada estándar .f(x+1)f(x1)(2Δt)

He intentado simplemente aplicar los límites y conducir hacia la posición de destino lo más rápido posible, pero esto es inestable (no considera adecuadamente el tiempo de tirón y desaceleración y, por lo tanto, supera el objetivo y oscila). He considerado aplicando un filtro de paso bajo repetido hasta que se cumplan las restricciones, pero esto parece un truco y no estoy convencido de que me vaya a encajar muy bien. ¿Hay alguna forma de crear un filtro que limite específicamente las derivadas de la señal?


Algunas notas adicionales:

  1. La nueva serie debe tener la misma longitud que la serie original. Este movimiento ocurre al mismo tiempo que otra operación y las dos están estrictamente sincronizadas. Sin embargo, es aceptable si no puede alcanzar la posición final dentro de las restricciones; esto solo significa que la operación en paralelo es demasiado agresiva para que el movimiento siga. Esto no debería ocurrir, en la práctica, cuando se configura correctamente.

  2. Comencé a investigar un enfoque iterativo que identifica un punto que viola las restricciones, luego ajusta el error y divide el negativo del error entre los dos puntos vecinos, de modo que se conserve la suma de los valores de la función. Luego calcula el error en el vecino y transfiere el error restante a la izquierda o derecha, respectivamente. Si llega al final de la función y todavía hay un error, simplemente llega al límite. No sé si este enfoque tiene una base teórica sólida, pero experimentaré y veré cómo funciona con mis señales.


Más notas:

Es razonable aproximar la función jerk (tercera derivada) como una combinación lineal de pasos no superpuestos y funciones de impulso. Para una serie de entrada típica, se ve más o menos así (el azul frente al rojo es mi intento actual de filtrado; esto es principalmente para transmitir una idea de la forma):

Jerk Series

Aquí hay un perfil de aceleración típico:

Serie Accel

Aquí hay un perfil de velocidad típico (la subida al comienzo es la que causa todos los problemas; la física del problema hace que el sistema prefiera comenzar a moverse a una velocidad cercana al infinito desde el primer momento, pero las consideraciones prácticas se interponen en el camino ):

Serie de velocidad

Para aquellos que estén interesados, aquí está la serie de datos sin delimitar tabuladores a partir de los cuales se aproximaron los derivados de diferencia central para producir los gráficos anteriores:

x   4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.5 4.510544858 4.529570168 4.548595479 4.567620789 4.5866461   4.60567141  4.624696721 4.643722031 4.662747342 4.681772652 4.700797963 4.719823273 4.738848584 4.757873894 4.776899204 4.795924515 4.814949825 4.833975136 4.853000446 4.872025757 4.891051067 4.910076378 4.929101688 4.948126999 4.967152309 4.98617762  5.00520293  5.024228241 5.043253551 5.062278862 5.081304172 5.100329483 5.119354793 5.138380104 5.157405414 5.176430725 5.195456035 5.214481346 5.233506656 5.252531967 5.271557277 5.290582588 5.309607898 5.328633209 5.347658519 5.36668383  5.38570914  5.404734451 5.423759761 5.442785072 5.461810382 5.480714657 5.497626044 5.514537431 5.531448818 5.548360206 5.565271593 5.58218298  5.599094367 5.616005754 5.632917141 5.649828528 5.666739915 5.683651302 5.700562689 5.717474077 5.734385464 5.751296851 5.768208238 5.785119625 5.802031012 5.818942399 5.835853786 5.852765173 5.869676561 5.886587948 5.903499335 5.920410722 5.937322109 5.954233496 5.971144883 5.98805627  6.004967657 6.021879044 6.038790432 6.055701819 6.072613206 6.089524593 6.10643598  6.123347367 6.140258754 6.157170141 6.174081528 6.190992916 6.207904303 6.22481569  6.241727077 6.258638464 6.275549851 6.292461238 6.309372625 6.326284012 6.343195399 6.360106787 6.377018174 6.393929561 6.410840948 6.427752335 6.444663722 6.461575109 6.478486496 6.495397883 6.512309271 6.529220658 6.546132045 6.563043432 6.579954819 6.596866206 6.613777593 6.63068898  6.647600367 6.664511754 6.681423142 6.698334529 6.715245916 6.732157303 6.74906869  6.765980077 6.782891464 6.79783353  6.807698506 6.817563482 6.827428457 6.837293433 6.847158409 6.857023385 6.866888361 6.876753336 6.886618312 6.896483288 6.906348264 6.91621324  6.926078215 6.935943191 6.945808167 6.955673143 6.965538119 6.975403095 6.98526807  6.995133046 7.004998022 7.014862998 7.024727974 7.034592949 7.044457925 7.054322901 7.064187877 7.074052853 7.083917828 7.093782804 7.10364778  7.113512756 7.123377732 7.133242707 7.143107683 7.152972659 7.162837635 7.172702611 7.182567587 7.192432562 7.202297538 7.212162514 7.22202749  7.231892466 7.241757441 7.251622417 7.261487393 7.271352369 7.281217345 7.29108232  7.300947296 7.310812272 7.320677248 7.330542224 7.3404072   7.350272175 7.360137151 7.370002127 7.379867103 7.389732079 7.399597054 7.40946203  7.419327006 7.429191982 7.439056958 7.448921933 7.45668417  7.46311785  7.46955153  7.47598521  7.48241889  7.488852569 7.495286249 7.501719929 7.508153609 7.514587289 7.521020969 7.527454649 7.533888329 7.540322008 7.546755688 7.553189368 7.559623048 7.566056728 7.572490408 7.578924088 7.585357768 7.591791447 7.598225127 7.604658807 7.611092487 7.617471594 7.622952136 7.628432678 7.63391322  7.639393762 7.644874304 7.650354846 7.655835389 7.661315931 7.666796473 7.672277015 7.677757557 7.683238099 7.688718641 7.694199183 7.699679725 7.705160268 7.71064081  7.716121352 7.721601894 7.727082436 7.732562978 7.73804352  7.743524062 7.749004605 7.754485147 7.759965689 7.765446231 7.770926773 7.776407315 7.781828236 7.786267475 7.790706714 7.795145953 7.799585192 7.804024432 7.808463671 7.81290291  7.817342149 7.821781388 7.826220627 7.830659866 7.835099105 7.839538344 7.843977584 7.848416823 7.852856062 7.857295301 7.86173454  7.866173779 7.870613018 7.875052257 7.879491497 7.883930736 7.888369975 7.892809214 7.897248453 7.901687692 7.906126931 7.91056617  7.915005409 7.919444649 7.923883888 7.928323127 7.932762366 7.937201605 7.941640844 7.946080083 7.950519322 7.954958561 7.959397801 7.96383704  7.968276279 7.972715518 7.977154757 7.980384921 7.982851165 7.985317409 7.987783653 7.990249897 7.992716141 7.995182385 7.997648629 8.000114873 8.002581117 8.005047361 8.007513605 8.009979849 8.012446092 8.014912336 8.01737858  8.019844824 8.022311068 8.024777312 8.027243556 8.0297098   8.032176044 8.034642288 8.037108532 8.039574776 8.04204102  8.044507264 8.046973508 8.049439752 8.051905996 8.05437224  8.056838484 8.059304728 8.061633119 8.063606114 8.065579109 8.067552105 8.0695251   8.071498095 8.07347109  8.075444085 8.07741708  8.079390076 8.081363071 8.083336066 8.085309061 8.087282056 8.089255051 8.091228046 8.093201042 8.09410447  8.094332124 8.094559777 8.09478743  8.095015084 8.095242737 8.09547039  8.095698043 8.095925697 8.09615335  8.096381003 8.096608657 8.09683631  8.097063963 8.097291616 8.09751927  8.097746923 8.097974576 8.09820223  8.098429883 8.098657536 8.098885189 8.099112843 8.099340496 8.099568149 8.099795803 8.100023456 8.100251109 8.100478762 8.100706416 8.100934069 8.101161722 8.101389376 8.101617029 8.101844682 8.102072336 8.102299989 8.102527642 8.102755295 8.102982949 8.103210602 8.103438255 8.103665909 8.103893562 8.104121215 8.104348868 8.104576522 8.104804175 8.105031828 8.105259482 8.105487135 8.105714788 8.105942441 8.106170095 8.106397748 8.106625401 8.106853055 8.107080708 8.107308361 8.107536014 8.107763668 8.107991321 8.108218974 8.108446628 8.108674183 8.108899792 8.109120089 8.109331659 8.109531087 8.109714959 8.10987986  8.110022376 8.110139158 8.11022965  8.110297009 8.110344649 8.110375986 8.110394434 8.110403409 8.110406324 8.110406324
Dan Bryant
fuente
Bienvenido a DSP.SE. Interesante pregunta.
Jason R
¿Qué tal alguna variante de un controlador PID?
Jim Clay
@ Jim, eso podría funcionar, pero parece un poco complicado para la tarea y requeriría un ajuste para que funcione bien. Tampoco estoy seguro de que sea mucho mejor que un simple filtro de paso bajo repetido.
Dan Bryant
1
Me pregunto si tomar el sistema descrito en esta pregunta / respuesta y, en el bucle de filtro de Kalman, forzar el tirón y la aceleración a limitarse como lo desea, podría hacer lo correcto. No tengo tiempo para jugar ahora; Será el fin de semana antes de que tenga la oportunidad ... el estado del modelo deberá incrementarse para incluir el imbécil, así como las limitaciones.
Peter K.

Respuestas:

1

Esto es solo una idea. No sé si funcionará. En la interpolación spline cúbica, una curva se construye mediante polinomios cúbicos por partes

P(x)=a+bx+cx2+dx3

Los coeficientes para el cúbico (que se extiende desde el hasta el punto) se encuentran especificando directamente las primeras derivadas en los nodos y también especificando que la curva debe pasar por los puntos. No estoy cerca de un experto en esto, pero va más o menos asíjthjth(j+1)th

Pj(xj)=Pj1(xj)Pj(xj+1)=Pj+1(xj+1)Pj(xj)=Pj1(xj)Pj(xj+1)=Pj+1(xj+1)

Ahora, usando esta idea para su problema, tal vez podría usar polinomios de orden en este formulario5th

P(x)=x2(a+bx+cx2+dx3)

y use las restricciones en las derivadas de segundo y tercer orden como esta

Pj(xj)=Pj1(xj)Pj(xj+1)=Pj+1(xj+1)Pj(xj)=Pj1(xj)Pj(xj+1)=Pj+1(xj+1)

Editar: a partir de la función discreta que representa la posición 1d en el espacio a lo largo del tiempo, se calculan los valores acc y jerk (¿es eso factible en su caso?). Si exceden algún valor máximo, están saturados a ese valor máximo. Luego construye una función de posición 1D continua que tiene los valores acc y jerk en los momentos que especificó. Luego, esta curva se evalúa en los momentos de interés y, por lo tanto, tiene una nueva función discreta que representa la posición 1d en el espacio a lo largo del tiempo pero con los valores acc y jerk deseados. No sé si esto tiene más sentido. Se necesita un poco de esfuerzo para probar si funciona. Si desea probarlo, le sugiero que busque la interpolación spline cúbica para aprender cómo funciona con la posición y la velocidad. Luego use los mismos principios pero solo en acc y jerk.

niaren
fuente
¿Es la intención de esto calcular una función continua por partes que se ajuste a la serie discreta? Si es así, ¿tiene una idea de cómo realizar la operación de limitación jerk / accel en los polinomios? Si es así, puedo volver a muestrear desde la función continua, pero no me queda claro cómo modificaría los coeficientes polinómicos para lograr las restricciones límite máximas deseadas.
Dan Bryant