-
        

Ergebnis 1 bis 7 von 7

Thema: Daten auf Plausibilitt berprfen...

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beitrge
    1.269

    Daten auf Plausibilitt berprfen...

    Anzeige

    Hallo!
    Ich werte mit nem mega32 einen RC-Empfnger aus. Bei einigen Stickkombinationen und wildem Rumgerhre springt einer der ausgelesenen Werte manchmal. Ich denke, dass ich an der Auswertung selber nichts verbessern kann, deswegen wrde ich gerne die ausgelesenen Werte auf ihre Richtigkeit hin berprfen und falsche Werte rausschmeissen.
    Das Ganze sollte natrlich mglichst wenig Rechenzeit in Anspruch nehmen. Einfach einen starken Tiefpass einprogrammieren kann ich auch nicht, dann wird die Reaktion auf die Knppel zu langsam.

    Bisher mache ich es so:
    sempf(i) ist das Signal aus dem Empfnger fr die 4 Kanle, das Signal geht von -37 bis +37

    Code:
    'wenn neues signal mehr als 50 vom alten signal abweicht, dann altes signal halten.
    For I = 1 To 4
     If Sempf(i) > Aempfh(i) Or Sempf(i) < Aempfl(i) Then     'wenn ausserhalb der Grenzen
       Sempf(i) = Aempf(i)     'neuer Wert = alter wert
     End If
     Aempf(i) = Sempf(i)       'alter wert = neuer Wert
     Aempfh(i) = Sempf(i) + 50    'obere Grenze
     Aempfl(i) = Sempf(i) - 50     'untere Grenze
    Next
    Mit dem Code wird also berprft, ob der neue Wert sich um mehr als "50" vom alten Wert unterscheidet. Falls das so ist wird der alte Wert weiterverwendet.
    Dadurch ergeben sich einige Probleme. Wenn ich die Sticks ganz schnell bewege, dann werden die neuen Werte nicht mehr akzeptiert. Und zwar werden die so lange nicht akzeptiert, bis ich den Stick wieder da hin bewegt habe wo die schnelle Bewegung gestartet wurde.
    Gibt es elegantere Methoden um "Ausreisser" zu detektieren und auszusortieren? Zur Not muss ich doch einen Tiefpass nehmen.......
    Vielen Dank fr eure Tipps!

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    sdlich der Alpen
    Beitrge
    1.708
    Hallo William,

    wenn du immer mit dem letzten plausiblen Wert vergleichst, must du bei einem zu heftigen beabsichtigten Sprung wieder zurck.

    Ich wrde aber nicht mit dem letzten plausiblen Wert vergleichen, sondern mit einem gleitenden Mittelwert. In die Berechnung des gleitenden Mittelwerts gehen plausible wie unplausible Werte ein. Je nach Dimensionierung der Parameter, knnen dann 1, 2, oder 3 Ausreisser ignoriert werden, aber danach, eben beim 2, 3, oder 4 Wert wird der extreme Wert akzeptiert.

    Braucht wenig Rechenzeit und Speicher. Starke Sprnge werden mit Verzgerung angenommen, aber das ist der Preis frs Aussortieren der Ausreisser. Mssige Vernderungen werdne ohne Verzgerung durchgereicht.

    hoffe, das ntzt bei deiner Fragestellung und grsse,
    Hannes

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beitrge
    1.269
    Hi Hannes,
    also so eine Art stdev-test: Wenn neuer Wert grer als alter Wert + 3*stdev der letzten 10 Werte, dann nicht akzeptieren. Knnte ganz gut klappen. Allerdings werde ich wohl kaum die Standardabweichung schnell genug berechnen knnen, vielleicht nehme ich den Median oder das arithmetische Mittel +- x wie von dir vorgeschlagen. Das werde ich mal testen :-D
    Gute idee!

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von vohopri
    Registriert seit
    11.09.2004
    Ort
    sdlich der Alpen
    Beitrge
    1.708
    Hi,

    ja Standardabweichung kostet natrlich.

    Gleitender Mittelwert geht ja annhernd auch so (k.A. wie das Verfahren heisst, du kennst es wahrscheinlich ohnehin):

    Neuer-MW = (Alter-MW * (N - 1) + Aktueller-Messwert) / N

    N ist konstant, je grsser es gewhlt wird, umso trger folgt der gleitende Mittelwert. Das Schne ist, man braucht keinen Messwert speichern.

    Analog knnte man aber auch eine gleitende Standardabweichung nherungsweise berechnen, denn in der Rechenformel habe ich nur den Mittelwert und das Mittel der quadrierten Werte drin. Da braucht es nach obigem Schema auch keine gespeicherten Werte.

    Das Wurzelziehen wird man sich klarerweise auch sparen und stattdessen den quadriertem Messwert mit der Varianz vergleichen. Quadrierte Werte fallen ohnehin an.

    grsse,
    Hannes

  5. #5
    Erfahrener Benutzer Robotik Visionr
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beitrge
    7.942
    Die Standardabweichung braucht man auch nicht jedesmal neu berechenen. Das ist eine konstante Schranke ab der man die Werte als schlecht ansieht. In Echtzeit mu man nur den Mittelwert der letzten 2-4 Werte berechenen. Bei zu vielen Werten hat man das Problem, das man auch relativ alte Werte nutzt und dann Probleme hat wenn man den Stick schnell bewegt.

    Die erste Verbesserung wre es den Vergleich nicht mit dem letzten akzeptierten Wert, sondern mit dem letzten empfangenen Wert zu machen. Das fhrt dann allerdings dazu, das nach einem Ausreier noch ein Wert verworfen wird. So schlimm sollte das aber nicht sein, denn man wrde ohnehin nichts wesentlich anders akzeptieren.

    Dafr werden 2 annhernd gleiche Werte immer akzeptiert.

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von Willa
    Registriert seit
    26.10.2006
    Ort
    Bremen
    Alter
    37
    Beitrge
    1.269
    Danke euch beiden :-D !
    Es funktioniert sehr schn, ich kann richtig beobachten wie fehlerhafte Werte aussortiert werden und sich nicht auf den Rest des Programms auswirken.
    Code:
    For I = 1 To 5
    Mittelwertempf(i) = Mittelwertempf(i) * 3
    Mittelwertempf(i) = Mittelwertempf(i) + Empf(i)
    Shift Mittelwertempf(i) , Right , 2
    Aempfh(i) = Mittelwertempf(i) + 12
    Aempfl(i) = Mittelwertempf(i) - 12
    If Empf(i) > Aempfh(i) Or Empf(i) < Aempfl(i) Then
       Empf(i) = Mittelwertempf(i)
       'Print "kaputt: " ; i
    End If
    Next
    Ich nehme nur den mittelwert der letzten vier Messungen, das reicht anscheinend, denn die Fehler scheinen einzeln zu kommen. Mein Programm verlangsamt sich dadurch von 431Hz auf 410Hz. Das ist durchaus akzeptabel.

    p.s.: Bei Bascom gibt es nichts wie
    if wert1 > (wert2 + 10) then...
    oder?

  7. #7
    Erfahrener Benutzer Robotik Visionr
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beitrge
    7.942
    Soweit ich weiss geht das bei Bascom nicht mehr als eine Rechenoperation zu machen one das Ergebnis wieder in einer Variablen zu speichern.

    Diese Einschrnkung war fr mich Grund genug auf C zu wechseln.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •