- LiFePO4 Speicher Test         
Ergebnis 1 bis 8 von 8

Thema: Kalman für Anfänger

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332

    Kalman für Anfänger

    Hallo Zusammen,
    derzeit versuche ich mich an einem kalman Filter.
    Ich beginne mit einer einfachen Implementation und habe
    mir aus diesem Grunde eine kleine Excel Tabelle erstellt,
    wo ich die entsprechenden Werte eingeben kann.

    Hierbei will ich zuerst meine Temperatursensoren KTY81-110 von
    der "simplen" Mittelwertberechnung auf einen Kalman Filter umsetzen.
    Mit Floating Point Mathematik scheint das laut Tabelle schon ganz
    gut zu klappen. Die genauen Parameter habe ich noch nicht gefunden (Optimiert).
    Nur soll die Routine im Atmega8 nicht auf Float Mathematik arbeiten,
    sondern auf Fix Point Mathematik. Und hier habe ich meine ersten Problem.
    Meine Routine arbeitet nicht so wie ich es gerne hätte.

    Floating Point Mathe
    Code:
    Public Sub CalculateSheet2Formular()
    Dim nNoise As Double
    Dim nEstimation As Double
    Dim nLastEstimation As Double
    Dim nPresition As Double
    Dim nLastPresition As Double
    Dim nKalmanKoeffizent As Double
    Dim nValue As Double
    Dim nADC As Long
    Dim nTemperatur As Long
    Dim objWorkbork As Workbook
    Dim i As Integer
        Set objWorkbork = ThisWorkbook
        nNoise = 0.2
        nLastEstimation = 0
        nPresition = 1
        For i = 2 To 22
            
            nADC = CDbl(objWorkbork.Sheets(2).Cells(i, 1).Value)
            nADC = nADC * 64             ' (<< 7) in ASM
            nTemperatur = 82 + nADC
            nTemperatur = nTemperatur / 101
            nTemperatur = nTemperatur - 150
            
            objWorkbork.Sheets(2).Cells(i, 2).Value = nTemperatur
            nValue = nTemperatur
            nLastPresition = nPresition
            nKalmanKoeffizent = nPresition / (nPresition + nNoise)
            
            nEstimation = nLastEstimation + nKalmanKoeffizent * (nValue - nLastEstimation)
            nPresition = (1 - nKalmanKoeffizent) * nPresition
            nLastEstimation = nEstimation
            
            objWorkbork.Sheets(2).Cells(i, 3).Value = nKalmanKoeffizent
            objWorkbork.Sheets(2).Cells(i, 4).Value = nPresition
            
            objWorkbork.Sheets(2).Cells(i, 5).Value = i - 1
            objWorkbork.Sheets(2).Cells(i, 6).Value = nEstimation
        Next i
    
    End Sub
    Fix Point Mathe (Versuch der schief ging)
    Code:
    Public Sub CalculateSheet3Formular()
    Dim nNoise As Long
    Dim nEstimation As Long
    Dim nLastEstimation As Long
    Dim nPresition As Long
    Dim nLastPresition As Long
    Dim nKalmanKoeffizent As Long
    Dim nValue As Long
    Dim nADC As Long
    Dim nTemperatur As Long
    Dim objWorkbork As Workbook
    Dim i As Integer
        Set objWorkbork = ThisWorkbook
        nNoise = 2
        nLastEstimation = 10
        nPresition = 16
        For i = 2 To 22
            
            nADC = CDbl(objWorkbork.Sheets(3).Cells(i, 1).Value)
            nADC = nADC * 64             ' (<< 7) in ASM
            nTemperatur = 82 + nADC
            nTemperatur = nTemperatur / 101
            nTemperatur = nTemperatur - 150
            
            objWorkbork.Sheets(3).Cells(i, 2).Value = nTemperatur
            nValue = nTemperatur
            nLastPresition = nPresition
            nKalmanKoeffizent = nPresition * 100 / (nPresition + nNoise)
            
            nEstimation = nLastEstimation + (nKalmanKoeffizent * (nValue - nLastEstimation) / 100)
            nPresition = (100 - nKalmanKoeffizent) * nPresition
            nLastEstimation = nEstimation
            
            objWorkbork.Sheets(3).Cells(i, 3).Value = nKalmanKoeffizent
            objWorkbork.Sheets(3).Cells(i, 4).Value = nPresition
            
            objWorkbork.Sheets(3).Cells(i, 5).Value = i - 1
            objWorkbork.Sheets(3).Cells(i, 6).Value = nEstimation
        Next i
    
    End Sub
    Hat jemand eine Hilfestellung ?
    Wie ist generell der beste Ansatz eine Floating Point Mathe in Fix Point zu wandeln.
    Ich dachte bis jetzt immer, da Ansatz wäre den Zahlenbereich nach oben zu schieben,
    die Berechnungen durchzuführen und danach den Bereich wieder anpassen.
    Viele Gruess
    R.
    Angehängte Dateien Angehängte Dateien
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Das was du in Sheet 2 ausrechnest, kannst du im Sheet 3 ohne Fließkomma so ausrechnen.
    (Beachte den Faktor 1024, um den jeder Wert zu groß ist.)

    Code:
    Public Sub CalculateSheet3Formular()
    Dim nNoise As Long
    Dim nEstimation As Long
    Dim nLastEstimation As Long
    Dim nPresition As Long
    Dim nLastPresition As Long
    Dim nKalmanKoeffizent As Long
    Dim nADC As Long
    Dim nTemperatur As Long
    Dim objWorkbork As Workbook
    Dim FAKTOR As Long
    Dim i As Integer
        
        Set objWorkbork = ThisWorkbook
        
        FAKTOR = 1024   'am besten Potenz von 2 als Faktor (hier: 2^10)
        nNoise = 2 * FAKTOR / 10    ' enspricht 0,2 * FAKTOR
        nLastEstimation = 0
        nPresition = 1 * FAKTOR
    
        For i = 2 To 22
            
            nADC = objWorkbork.Sheets(3).Cells(i, 1).Value
            nADC = nADC * FAKTOR * 64
            
            nTemperatur = 82 * FAKTOR + nADC
            nTemperatur = nTemperatur / 101
            nTemperatur = nTemperatur - (150 * FAKTOR)
            
            objWorkbork.Sheets(3).Cells(i, 2).Value = nTemperatur
    
            nLastPresition = nPresition
            nKalmanKoeffizent = nPresition * FAKTOR / (nPresition + nNoise)
            
            nEstimation = (nLastEstimation * FAKTOR + nKalmanKoeffizent * (nTemperatur - nLastEstimation)) / FAKTOR
            nPresition = ((FAKTOR - nKalmanKoeffizent) * nPresition) / FAKTOR
            nLastEstimation = nEstimation
            
            objWorkbork.Sheets(3).Cells(i, 3).Value = nKalmanKoeffizent
            objWorkbork.Sheets(3).Cells(i, 4).Value = nPresition
            
            objWorkbork.Sheets(3).Cells(i, 5).Value = i - 1
            objWorkbork.Sheets(3).Cells(i, 6).Value = nEstimation
            
            ' Zu Vergleichszwecken Tabelle mit rückgewandelten Werten:
            
            objWorkbork.Sheets(3).Cells(i, 8).Value = CDbl(objWorkbork.Sheets(3).Cells(i, 3).Value) / FAKTOR
            objWorkbork.Sheets(3).Cells(i, 9).Value = CDbl(objWorkbork.Sheets(3).Cells(i, 4).Value) / FAKTOR
            
            objWorkbork.Sheets(3).Cells(i, 10).Value = CDbl(objWorkbork.Sheets(3).Cells(i, 5).Value) / FAKTOR
            objWorkbork.Sheets(3).Cells(i, 11).Value = CDbl(objWorkbork.Sheets(3).Cells(i, 6).Value) / FAKTOR
            
        Next i
    
    
    End Sub
    Geändert von Sisor (03.11.2014 um 16:48 Uhr)

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    jetzt verstehe ich meinen Fehler. Ich habe hier bei nicht den eigentlich Messwert nach "oben" verschoben und alle damit resultierende Werte/Vergleiche.
    Daher hat der ganze Spass dann nicht funktioniert. Auch der Trick ein Vielfaches von Zwei zu nehmen, was mir später das umrechen in C das Leben
    einfacher macht ( << -Operator), ist ein guter Hinweis.

    Gibt es eine Webseite, welches sowas nochmal genau beschreibt oder google-Stichwort.

    Vielen Dank für die Hilfe.

    R.
    Kaum macht man es richtig, schon funktioniert's ...

  4. #4
    HaWe
    Gast
    hallo,
    ist zwar OT - aber ich Suche einen Kalman für meinen Arduino Mega (ggf Due),
    und zwar um mehrere Sensoren zu fusionieren (einen nach dem anderen ntl...).
    Mit Excel kenne ich mich nun gar nicht aus -
    kennst du sowas wie eine Anleitung "Kalman für Dummies" , die man einfach in Sketch schrittweise umsetzen kann ?
    Geändert von HaWe (04.11.2014 um 16:50 Uhr)

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hallo,

    die oben gezeigte Funktion ist ein einfacher Kalman Filter. Was Sketch angeht, bin ich Ahnungslos. Ich schreibe in C/C++.

    Vielleicht hilft ja diese Seite:

    http://bilgin.esme.org/BitsBytes/Kal...orDummies.aspx

    Das Beispiel am Ende habe ich in der Excel-Tabelle auf dem ersten Sheet dargestellt.

    Hier musst Du Dir nur die Macros ansehen, siehe auch Thread.

    Gruss R.
    Kaum macht man es richtig, schon funktioniert's ...

  6. #6
    HaWe
    Gast
    hey, danke!
    ja, das ist wirklich gut!

    Sketch ist übrigens C/C++, ein Stück einfacher sogar in der Handhabung was die Klassen- und Linker-Geschichten angeht (geht automatisch).

    In den Dummie-Artikel werd ich mich mal gleich einlesen - danke nochmal! 8-)

Ähnliche Themen

  1. RP6 Von Anfänger für Anfänger
    Von littles im Forum Robby RP6
    Antworten: 8
    Letzter Beitrag: 08.07.2011, 11:07
  2. ST LPR530AL + Kalman Filter
    Von Pepade im Forum Sensoren / Sensorik
    Antworten: 3
    Letzter Beitrag: 23.04.2010, 08:29
  3. Kalman Filter für BASCOM
    Von harry1 im Forum Sensoren / Sensorik
    Antworten: 30
    Letzter Beitrag: 29.10.2009, 00:22
  4. CRP5: meine Erweiterung (vom Anfänger für Anfänger)
    Von loewenzahn im Forum Robby CCRP5
    Antworten: 11
    Letzter Beitrag: 21.03.2007, 19:37
  5. Kalman-Filter - wie/wo/was ?
    Von Crazy Harry im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 02.02.2006, 11:23

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress