Curva de movimento 'melhor ajuste' para um perfil inatingível

7

Eu tenho uma função discreta que representa uma posição 1d no espaço ao longo do tempo. Eu tenho um sistema de movimento que gostaria de obter essa curva, mas, devido a restrições no empurrão (terceira derivada) e aceleração (segunda derivada), ele não pode realmente alcançar o movimento. Isso ocorre devido a uma descontinuidade na função, onde passa de um sinal plano para um aumento acentuado.

Estou procurando um algoritmo que pegue as séries discretas e produza uma nova série que se aproxime do original, sem violar os limites superiores da magnitude da segunda e terceira derivadas. Não tenho uma definição estrita de como gostaria de minimizar o erro para a posição, mas um ajuste de erro quadrático médio de soma padrão é provavelmente razoável. Para a derivada, estou aproximando usando a diferença centralizada padrãof(x+1)f(x1)(2Δt).

Tentei simplesmente aplicar os limites e dirigir em direção à posição do alvo o mais rápido possível, mas isso é instável (não considera adequadamente o tempo de repuxar e desacelerar e, portanto, ultrapassa o alvo e oscila). aplicando um filtro passa-baixas repetido até que as restrições sejam atendidas, mas isso parece um hack e não estou convencido de que isso me dará um ajuste muito bom. Existe alguma maneira de criar um filtro que limite especificamente as derivadas do sinal?


Algumas notas adicionais:

  1. A nova série deve ter o mesmo comprimento que a série original. Esse movimento ocorre ao mesmo tempo que outra operação e os dois são estritamente sincronizados. É aceitável, no entanto, se não conseguir atingir a posição final dentro das restrições; isso significa apenas que a operação paralela é muito agressiva para o movimento seguir. Isso não deve ocorrer, na prática, quando configurado corretamente.

  2. Comecei a investigar uma abordagem iterativa que identifica um ponto que viola as restrições, depois ajusta o erro e divide o negativo do erro entre os dois pontos vizinhos, para que a soma dos valores da função seja preservada. Ele calcula o erro no vizinho e transfere o erro restante para a esquerda ou direita, respectivamente. Se atingir o final da função e ainda houver erro, ele apenas atinge os limites. Não sei se essa abordagem tem algum fundamento teórico sólido, mas vou experimentar e ver como ela se comporta com meus sinais.


Mais notas:

É razoável aproximar a função de empurrão (terceira derivada) como uma combinação linear de funções de impulso e impulso não sobrepostas. Para uma série de entradas típica, é algo parecido com isto (o azul vs. o vermelho é minha tentativa atual de filtrar; isso é principalmente apenas para transmitir uma idéia da forma):

Jerk Series

Aqui está um perfil típico de aceleração:

Accel Series

Aqui está um perfil de velocidade típico (a subida no início é o que causa todo o problema; a física do problema faz o sistema preferir começar a se mover quase a uma velocidade infinita desde o início, mas considerações práticas impedem ):

Velocity Series

Para aqueles interessados, aqui está a série de dados brutos, delimitados por tabulações, a partir dos quais as derivadas da diferença central foram aproximadas para produzir os gráficos acima:

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
fonte
Bem-vindo ao DSP.SE. Pergunta interessante.
Jason R
Que tal alguma variante de um controlador PID?
Jim Clay
@ Jim, isso pode funcionar, mas parece um pouco complicado para a tarefa e exigiria ajuste para que ela funcionasse bem. Também não tenho certeza de que seria muito melhor do que um simples filtro passa-baixas repetido.
Dan Bryant
11
Gostaria de saber se pegar o sistema descrito nesta pergunta / resposta e, no loop do filtro Kalman, forçar o jerk e a aceleração a serem restringidos como você deseja pode fazer a coisa certa. Não tenho tempo para jogar agora; será o fim de semana antes que eu tenha uma chance ... o estado do modelo precisará ser aumentado para incluir o empurrão, bem como as restrições.
Peter K.

Respostas:

1

Isto é apenas uma idéia. Não sei se vai funcionar. Na interpolação de splines cúbicos, uma curva é construída por polinômios cúbicos em partes

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

Os coeficientes para a jth cúbico (que se estende do jth ao (j+1)thponto) são encontrados especificando diretamente as primeiras derivadas nos nós e também especificando que a curva deve passar pelos pontos. Eu não estou nem perto de um especialista nisso, mas é algo como isto

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

Agora, usando essa idéia para o seu problema, talvez você possa usar 5th ordenar polinômios neste formulário

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

e use as restrições nos derivativos de segunda e terceira ordem como este

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

Edit: A partir da função discreta que representa a 1ª posição no espaço ao longo do tempo, os valores acc e jerk são calculados (isso é viável no seu caso?). Se eles excederem algum valor máximo, serão saturados para esse valor máximo. Então você constrói uma função de posição 1D contínua que possui os valores acc e jerk nos horários especificados. Então, essa curva é avaliada nos momentos de interesse e, assim, você tem uma nova função discreta que representa a 1ª posição no espaço ao longo do tempo, mas com os valores desejados de acc e jerk. Não sei se isso faz mais sentido. É preciso algum esforço para testar se funciona. Se você quiser experimentá-lo, sugiro que você pesquise interpolação de spline cúbico para aprender como ele funciona com posição e velocidade. Em seguida, use os mesmos princípios, mas apenas de acordo e empurrão.

niaren
fonte
A intenção disso é calcular uma função contínua por partes que se encaixe na série discreta? Em caso afirmativo, você tem uma idéia de como executar a operação de limitação de empurrão / aceleração nos polinômios? Nesse caso, posso voltar a amostrar a partir da função contínua, mas não está claro para mim como eu modificaria os coeficientes polinomiais para alcançar as restrições de limite máximo desejadas.
Dan Bryant