solaESKF_EIGEN

Dependencies:   mbed LPS25HB_I2C LSM9DS1 PIDcontroller LoopTicker GPSUBX_UART_Eigen SBUS_without_mainfile MedianFilter Eigen UsaPack solaESKF_Eigen Vector3 CalibrateMagneto FastPWM

run.cpp

Committer:
NaotoMorita
Date:
22 months ago
Revision:
144:b3a713b4f1c4
Parent:
143:53808e4e684c

File content as of revision 144:b3a713b4f1c4:

#include "global.hpp"

void run()
{
    preflightCalibration();
    
    setEskfCov();
    
    MatrixXf Rgps(5,5);
    setDiag(Rgps,1.5f);
    Rgps(2,2) = 0.1f;
    Rgps(3,3) = 0.1f;
    Rgps(4,4) = 0.1f;
    
    MatrixXf Rwhole = MatrixXf::Zero(9,9);
    Rwhole(0,0) = 1.5f;
    Rwhole(1,1) = 1.5f;
    Rwhole(2,2) = 0.1f;
    Rwhole(3,3) = 0.1f;
    Rwhole(4,4) = 0.1f;
    Rwhole(5,5) = 5000.0f;
    Rwhole(6,6) = 5000.0f;
    Rwhole(7,7) = 5000.0f;
    Rwhole(8,8) = 0.007f;
    
    MatrixXf Rimu = MatrixXf::Zero(5,5);
    Rimu(0,0) = 0.1f;
    Rimu(1,1) = 5000.0f;
    Rimu(2,2) = 5000.0f;
    Rimu(3,3) = 5000.0f;
    Rimu(4,4) = 0.007f;
    
    
    _t.start();

    preflightCheck();
    wait(1.0f);
    //usaPack通信開始 制御ループのアタッチ
    pc.Subscribe(0000, &(vp));
    LoopTicker PIDtick;
    PIDtick.attach(calcServoOut,PID_dt);
    
    float tgps = _t.read();
    float theading = _t.read();
    float tstart = _t.read();
    while(1)
    {
        float tstart = _t.read();
        //センサの値を取得
        if(hilFlag == true){
            getHilIMUval();
        }else{
            getIMUval();
        }
        //ekfの更新
        eskf.updateNominal(acc, gyro, att_dt);
        eskf.updateErrState(acc, gyro, att_dt);

        if(hilFlag == true){
            if(tstart-tgps>0.2f){
                getHilGPSval();
                tgps = _t.read();
                gpsUpdateFlag = true;
            }else{
                gpsUpdateFlag = false;
            }
        }else{
            if(userButton.read()==1)
            {
                gpsLlh0Fixed = false;
            };  
            getGPSval();
        }
        
        float heading = std::atan2(-mag(1),mag(0));
        Vector3f dynacc = eskf.calcDynAcc(acc);
        dynaccnorm2 = dynacc.squaredNorm();
        if(dynaccnorm2 > 0.16f){
            Rimu(1,1) = 1.1f;
            Rimu(2,2) = 1.1f;
            Rimu(3,3) = 1.1f;
        }else{
            Rimu(1,1) = 100.1f;
            Rimu(2,2) = 100.1f;
            Rimu(3,3) = 100.1f;
        }
        eskf.updateIMU(palt,acc,heading, Rimu); 
        
        PIDtick.loop(); 
        
        //制御時間を計測
        float tend = _t.read();
        att_dt = (tend-tstart);
    }
}