美文网首页
kalman卡尔曼算法JS简单描述

kalman卡尔曼算法JS简单描述

作者: 田文健 | 来源:发表于2019-08-16 10:10 被阅读0次

    先上代码

    
    /**
     * 
     * @param {
     *  lastVal 上次的值
     *  predict 预测函数
     *  error 误差
     *  predictError 预测误差
     *  measureError 测量误差
     *  measure 测量值
     * } args 
     */
    let kalman = (args)=>{
    
        //预测值=>根据上个时刻的最优值预测
        let predict = args.predict(args.lastVal);  
    
        //新的误差=》 上次算的最优误差值平方 + 预测误差平方(指定的) 再开根号
        let error = Math.sqrt(Math.pow(args.nError, 2) + Math.pow(args.predictError, 2));
        //console.log("error:", error);
        //计算卡尔曼增益 新的误差平方 /  (新的误差平方 + 观测值误差的平方)
        let gain = Math.sqrt(Math.pow(error, 2) / (Math.pow(error, 2) + Math.pow(args.measureError, 2)));
        //console.log("gain:", gain);
        //计算最优值
        let value = predict + gain * (args.measure - predict);
        console.log("value", value);
        //为下一次计算误差值
        let nError = Math.sqrt((1 - gain) * Math.pow(error, 2));
    
        //更新参数
        args.lastVal = value;
        args.nError = nError;
    };
    
    module.exports = {
        kalman
    };
    

    测试代码

    //const sp = require('serialport')
    
    //console.log(sp)
    
    const k = require('./kalman');
    
    let data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 8, 8, 7, 5];
    
    let args = {
        lastVal: 0,
        predict: (lastVal) => {
            return lastVal + 1;
        },
        nError: 0,
        predictError: 0.5,
        measureError: 0.1,
        measure: 0.95
    };
    
    data.forEach( (val, index)=>{
        let e =  (Math.random() - 0.5) / 5;
        
        console.log("step " + index + "-----------:");
        console.log("ref:", val);
        console.log("me:", e);
    
        args.measure = val + e;
        k.kalman(args);
        //console.log("step " + index + ":", args);
    });
    

    更新
    后面再理解了一下卡尔曼。
    预测方程:
    当前预测值 = f(上个最佳估计)
    f()是一个函数,对于线性的而言 f(x) = ax1 + b,b代表了预测中的误差方差

    量测方程:
    测量值 = f(当前估计值,即量测方程中的因变量)
    f()是一个函数,对于线性的而言 f(x) = a1x + r,r代表了测量中的误差方差

    预测误差方差:
    我们还需要对误差进行预测, pk = apka + b ,即上个预测的误差 + 当前预测的误差 ,在初始化时需要事先给出一个pk。a乘了两次,是因为pk这里pk是平方误差。

    卡尔曼增益
    卡尔曼增益表示应该更倾向于观测值还是预测值。K = pk / (pk + r), 当pk小 而r大时,表示观测误差大,倾向于预测值,反之亦然。

    最佳估计
    那么就可以选最佳估计了, x = 当前估计 + K * (观测值 - a1*估计值) ,这里是和观测方程有联系,最佳估计就在观测值和预测值之间,通过预测误差的处理得到增益K,计算最佳估计。

    误差更新
    卡尔曼的精髓,将上个状态的误差计算到下个状态中,所以这里要更新pk
    pk = pk*(1-K)。

    相关文章

      网友评论

          本文标题:kalman卡尔曼算法JS简单描述

          本文链接:https://www.haomeiwen.com/subject/bxvuqctx.html