1. 程式人生 > >APM-3.5.2-EKF2筆記(未完待續)

APM-3.5.2-EKF2筆記(未完待續)

20180704:
一、EKF2.InitialiseFilter()全過程
1. 記錄開始時間,預期步長時間(_frameTimeUsec = 2500),每次融合讀取IMU次數(_framesPerPrediction = 4),確定是否記日誌(通過引數,預設不記錄)
2. 根據加速度計數量確定啟用EKF濾波器個數(num_cores),並建立濾波器
3. 初始化所有濾波器基本環境
   a.傳入前端指標
   b.設定IMU索引
   c.設定濾波器索引
   d.傳入ahrs指標
   e.初始化相應感測器的緩衝區(分配記憶體)
4. 所有濾波器基本環境初始化成功後,設定主濾波器索引為0
5. 初始化所有濾波器例項(輸入輸出變數)
   a.固定翼機型等待GPS 3D定位後開始初始化濾波器
   b.初始化能夠重用的一大堆引數
   c.初始化IMU(主迴圈間隔、讀取IMU資料、填充IMU緩衝區)
   d.讀取加速度計、磁羅盤等資料
   e.利用加速度計的讀值,初始化橫滾角和俯仰角
   f.初始化擴充套件卡爾曼濾波器輸出的24個狀態(stateStruct)
   g.讀取GPS資料,重置速度、位置資訊
   h.讀取氣壓計資料,重置高度資訊
   i.根據緯度計算地球的自旋向量
   j.初始化協方差矩陣
   k.重置輸出狀態
   l.置位濾波器初始化完成標誌
6. 清零三個結構體(yaw_reset_data、pos_reset_data、pos_down_reset_data),尚不清楚這三個結構體的用途
7. 檢查是否需要記錄特定感測器的日誌資訊
二、EKF2.UpdateFilter()全過程
1. 記錄濾波器開始時間(imuSampleTime_us)
2. 執行所有的濾波器(core[i].UpdateFilter(statePredictEnabled[i]),有個負載均衡的演算法,目前還不清楚執行機制)
   a.設定startPredictEnabled的值,1:讀取IMU資料4次後,允許卡爾曼估計(runUpdates = 1),0:讀取IMU資料8次後,允許卡爾曼估計(runUpdates = 1)
   b.獲取濾波器開始時間(imuSampleTime_ms)
   c.檢查加解鎖狀態並執行所需的檢查和濾波器模式轉換
   d.讀取IMU資料(3軸角度增量和3軸速度增量)
   e.如果緩衝區中有新的IMU資料,則執行EKF方程(runUpdates = 1)

附錄
1. EKF2協方差矩陣(P)初值
    // attitude error
    P[0][0]   = 0.1f;
    P[1][1]   = 0.1f;
    P[2][2]   = 0.1f;
    // velocities
    P[3][3]   = 0.5*0.5;
    P[4][4]   = 0.5*0.5;
    P[5][5]   = 0.7*0.7;
    // positions
    P[6][6]   = 1.0*1.0;
    P[7][7]   = 1.0*1.0;
    P[8][8]   = 3.0*3.0;
    // gyro delta angle biases
    P[9][9] = radians(2.5 * 0.0025)*radians(2.5 * 0.0025);
    P[10][10] = radians(2.5 * 0.0025)*radians(2.5 * 0.0025);
    P[11][11] = radians(2.5 * 0.0025)*radians(2.5 * 0.0025);
    // gyro scale factor biases
    P[12][12] = 0.001*0.001;
    P[13][13] = 0.001*0.001;
    P[14][14] = 0.001*0.001;
    // Z delta velocity bias
    P[15][15] = (0.5 * 0.0025) * (0.5 * 0.0025);
    // earth magnetic field
    P[16][16] = 0.0f;
    P[17][17] = 0.0f;
    P[18][18] = 0.0f;
    // body magnetic field
    P[19][19] = 0.0f;
    P[20][20] = 0.0f;
    P[21][21] = 0.0f;
    // wind velocities
    P[22][22] = 0.0f;
    P[23][23] = 0.0f;

    // optical flow ground height covariance
    Popt = 0.25f;

注:radians(),將角度轉換為弧度。