Bewegungskurve 'Best Fit' für ein unerreichbares Profil

7

Ich habe eine diskrete Funktion, die eine 1d-Position im Raum über die Zeit darstellt. Ich habe ein Bewegungssystem, das diese Kurve erreichen möchte, aber aufgrund von Einschränkungen hinsichtlich Ruck (3. Ableitung) und Beschleunigung (2. Ableitung) kann es die Bewegung nicht tatsächlich erreichen. Dies tritt aufgrund einer Diskontinuität in der Funktion auf, wo sie von einem flachen Signal zu einem starken Anstieg übergeht.

Ich suche nach einem Algorithmus, der die diskrete Reihe nimmt und eine neue Reihe erzeugt, die sich dem Original annähert, ohne die Obergrenzen für die Größe der zweiten und dritten Ableitung zu verletzen. Ich habe keine strenge Definition, wie ich den Fehler für die Position minimieren möchte, aber eine Standard-Summen-Mittelwert-Fehleranpassung ist wahrscheinlich vernünftig. Für die Ableitung nähere ich mich mit der standardzentrierten Differenzf(x+1)f(x1)(2Δt).

Ich habe versucht, einfach die Grenzwerte anzuwenden und so schnell wie möglich auf die Zielposition zu fahren, aber dies ist instabil (es berücksichtigt die Ruck- und Verzögerungszeit nicht richtig und überschießt daher das Ziel und schwingt). Ich habe darüber nachgedacht Anwenden eines wiederholten Tiefpassfilters, bis die Einschränkungen erfüllt sind, aber dies scheint ein bisschen wie ein Hack zu sein und ich bin nicht überzeugt, dass es mir eine sehr gute Passform geben wird. Gibt es eine Möglichkeit, einen Filter zu erstellen, der die Ableitungen des Signals spezifisch begrenzt?


Ein paar zusätzliche Hinweise:

  1. Die neue Serie muss die gleiche Länge wie die Originalserie haben. Diese Bewegung erfolgt gleichzeitig mit einer anderen Operation und die beiden sind streng synchronisiert. Es ist jedoch akzeptabel, wenn die endgültige Position innerhalb der Einschränkungen nicht erreicht werden kann. Dies bedeutet nur, dass der Parallelbetrieb zu aggressiv ist, als dass die Bewegung folgen könnte. Dies sollte in der Praxis bei ordnungsgemäßer Konfiguration nicht auftreten.

  2. Ich habe begonnen, einen iterativen Ansatz zu untersuchen, der einen Punkt identifiziert, der gegen die Einschränkungen verstößt, dann den Fehler korrigiert und das Negativ des Fehlers zwischen den beiden benachbarten Punkten aufteilt, sodass die Summe der Funktionswerte erhalten bleibt. Es berechnet dann den Fehler beim Nachbarn und überträgt den verbleibenden Fehler nach links bzw. rechts. Wenn es das Ende der Funktion erreicht und immer noch ein Fehler vorliegt, stürzt es nur bis an die Grenzen. Ich weiß nicht, ob dieser Ansatz eine solide theoretische Grundlage hat, aber ich werde experimentieren und sehen, wie er mit meinen Signalen funktioniert.


Weitere Hinweise:

Es ist sinnvoll, die Ruckfunktion (dritte Ableitung) als lineare Kombination von nicht überlappenden Schritt- und Impulsfunktionen zu approximieren. Für eine typische Eingabeserie sieht es ungefähr so ​​aus (Blau gegen Rot ist mein aktueller Filterversuch; dies dient hauptsächlich dazu, eine Vorstellung von der Form zu vermitteln):

Ruck Serie

Hier ist ein typisches Beschleunigungsprofil:

Accel-Serie

Hier ist ein typisches Geschwindigkeitsprofil (der Anstieg am Start verursacht alle Probleme; die Physik des Problems veranlasst das System, sich von Anfang an mit nahezu unendlicher Geschwindigkeit zu bewegen, aber praktische Überlegungen stehen im Weg ):

Velocity-Serie

Für diejenigen, die interessiert sind, ist hier die durch Tabulatoren getrennte Rohdatenreihe, aus der die zentralen Differenzableitungen angenähert wurden, um die obigen Diagramme zu erzeugen:

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
quelle
Willkommen bei DSP.SE. Interessante Frage.
Jason R
Wie wäre es mit einer Variante eines PID-Reglers?
Jim Clay
@ Jim, das könnte funktionieren, aber es scheint ein bisschen kompliziert für die Aufgabe zu sein und würde eine Optimierung erfordern, damit sie gut funktioniert. Ich bin mir auch nicht sicher, ob es viel besser wäre als ein einfacher wiederholter Tiefpassfilter.
Dan Bryant
1
Ich frage mich, ob es das Richtige sein könnte, wenn Sie das in dieser Frage / Antwort beschriebene System verwenden und in der Kalman-Filterschleife den Ruck und die Beschleunigung so einschränken, wie Sie es möchten. Ich habe jetzt keine Zeit zum Spielen; Es wird das Wochenende sein, bevor ich eine Chance habe ... Der Modellstatus muss erhöht werden, um den Ruck sowie die Einschränkungen zu berücksichtigen.
Peter K.

Antworten:

1

Dies ist nur eine Idee. Ich weiß nicht, ob es funktionieren wird. Bei der kubischen Spline-Interpolation wird eine Kurve durch stückweise kubische Polynome konstruiert

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

Die Koeffizienten für die jth kubisch (das erstreckt sich von der jth zum (j+1)thPunkt) werden gefunden, indem die ersten Ableitungen direkt an den Knoten angegeben werden und auch angegeben wird, dass die Kurve durch die Punkte verlaufen muss. Ich bin kein Experte in diesem Bereich, aber es geht ungefähr so

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

Wenn Sie diese Idee jetzt für Ihr Problem verwenden, könnten Sie sie vielleicht verwenden 5th Polynome auf diesem Formular bestellen

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

und verwenden Sie die Einschränkungen für die Derivate zweiter und dritter Ordnung wie diese

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

Bearbeiten: Aus der diskreten Funktion, die die 1d-Position im Raum über die Zeit darstellt, werden die acc- und jerk-Werte berechnet (ist das in Ihrem Fall möglich?). Wenn sie einen Maximalwert überschreiten, sind sie auf diesen Maximalwert gesättigt. Anschließend erstellen Sie eine kontinuierliche 1D-Positionsfunktion, die zu den von Ihnen angegebenen Zeiten die Werte acc und ruck aufweist. Dann wird diese Kurve zu den interessierenden Zeiten ausgewertet und dadurch haben Sie eine neue diskrete Funktion, die die 1d-Position im Raum über die Zeit darstellt, jedoch mit den gewünschten acc- und jerk-Werten. Ich weiß nicht, ob das sinnvoller ist. Es erfordert einige Anstrengungen, um zu testen, ob es funktioniert. Wenn Sie es versuchen möchten, empfehle ich Ihnen, nach kubischer Spline-Interpolation zu suchen, um zu erfahren, wie es mit Position und Geschwindigkeit funktioniert. Verwenden Sie dann die gleichen Prinzipien, aber nur auf acc und ruckeln.

Niaren
quelle
Ist die Absicht, eine stückweise stetige Funktion zu berechnen, die zur diskreten Reihe passt? Wenn ja, haben Sie eine Idee, wie Sie die Ruck- / Beschleunigungsbegrenzungsoperation an den Polynomen durchführen können? Wenn ja, kann ich die kontinuierliche Funktion erneut abtasten, aber es ist mir unklar, wie ich die Polynomkoeffizienten modifizieren würde, um die gewünschten maximalen Grenzwertbeschränkungen zu erreichen.
Dan Bryant