IMU | 慣導模組指標引數與標定
阿新 • • 發佈:2020-10-23
IMU原始資料
- 加計 3axis 原始資料,單位 m/s2
- 陀螺 3axis 原始資料,單位 deg/s
原始資料質量引數
- 加計/陀螺:
- 3個軸的零偏、零偏穩定性、零偏重複性、標度因數非線性度、隨機遊走係數、噪聲標準差、正交耦合引數,溫補關係曲線等;
X專案中分別標定了 常值零偏、標度因數、安裝偏差角
共涉及到加計的 3個常值零偏、陀螺的3個常值零偏、陀螺的3個標度因數、兩個安裝偏差角;
- 溫度補償實現:
實現方式1: 採集大量資料,建立溫度與質量引數的數學模型,儲存數學模型係數,供溫補使用; 實現方式2: 採集大量資料,以5度為步進,使用不同的溫度點進行標定,形成溫補引數列表進行儲存;
IMU模組(例項)
高精度數字慣性測量單元PA-IMU-03D系列(IMU PA-IMU-03D系列慣性測量單元是小型化、高性價比的測量元件,用於動態測量、定位和導航中,可給出空間所需的角速率和加速度引數,PA-IMU-03D採用密封設計,數字濾波,A/D轉換,溫度補償,起始誤差和軸向偏差的補償,具備了中等精度光纖陀螺產品的測量精度,最終經過串列埠輸出一組慣性測量資料。它可廣泛用於汽車電子、飛行器制導與控制、姿態參考系統、平臺穩定、機器人、天線穩定、與GPS組合、通用航空等系統—)
此款PA-IMU-03D光纖 IMU 由三個單軸開環光纖陀螺儀及三個石英加速度計組合而成:
啟動時間 ≤5s 工作溫度 -40℃~60℃ 儲存溫度 -50℃~70℃ 量程 ±200°/s (各種量程可選擇) 零偏重複性 ≤0.3°/h 零偏穩定性 ≤0.3°/h 標度因數非線性度 ≤200ppm 標度因數重複性 ≤200ppm 頻寬 ≥300Hz 隨機遊走係數 ≤0.05°/h 型別 石英加速度計 量程 ±10g (各種量程可選擇) 偏值 ≤1mg 偏值月綜合誤差 <5×10-5g(1σ) 偏值溫度係數 ≤50ug/℃ 標度因數月綜合誤差 <80ppm(1σ) 標度因數溫度係數 <80ppm/℃
組合定位模組初始化
組合定位過程中對IMU/GNSS等模組進行初始化,主要針對質量引數進行估計
【停車判斷】
- 空曠環境:
可以依賴GPS、輪速輔助做停車判斷,動態GPS測速精度達到mm級別,通過GPS、輪速判斷停車比單純依靠IMU判斷要準確; - 遮擋環境:
如果有輪速可以輔助做停車判斷,則優先使用輪速做判斷;
【初始化策略】
- 靜態初始化:
指的是進行姿態(水平角)、位置、速度、航向初始值獲取的過程;
IMU初始化:除了上面提到的姿態(水平角)的初始化外,還有固定零偏、噪聲的估計(這兩個值在車輛非靜止模式下比較難測出)
- 動態初始化:
指的是跑車過程中通過GPS訊號對IMU模組的相對安裝位置進行估計,包括安裝偏差角等,完成自對準操作;
【初始化現狀】
車輛執行過程中,重啟裝置,保持車輛動態不停車,車輛不能完成靜態初始化;
【存在問題】
IMU未實現靜態初始化,則不能有效的對IMU固定零偏、噪聲進行估計,所以該狀態在無輪速的遮擋環境下容易出現推算異常的問題(出錯概率完全取決於IMU的可靠程度)
初始化方案和使用者的實際使用場景、客戶的需求相關,追求便利的一定程度上會損失估計精度;
IMU模組引數定義程式碼參考
/**
* @GNSS_INS.h
* @berif: GNSS_INS variable define.
*/
#ifndef _GNSS_INS_H
#define _GNSS_INS_H
/* It's valid in 2037 years. */
typedef struct { /* time struct */
long int time; /* time (s) expressed by standard time_t */
double sec; /* fraction of second under 1 s */
} gtime_t;
namespace libGNSS_INS
{
typedef struct
{
gtime_t time; //second
double latitude;//deg
double longitude;//deg
double altitude;//m
double heading;//deg
double std_latitude;
double std_longitude;
double std_altitude;
int position_status;//fixed float single...
int heading_status;
}GNSS_Data;
typedef struct
{
gtime_t time;
double gyro[3]; //deg/s
double accel[3];//m/s2
}IMU_Data;
typedef struct
{
gtime_t time;
double latitude; //deg
double longitude;//deg
double altitude;//m
double heading;
double roll;//deg
double pitch;
double yaw;
double std_latitude;
double std_longitude;
double std_altitude;
double std_heading;
//define the velocity or not.
double std_roll;
double std_pitch;
double std_yaw;
int position_status;//fixed float single...
int heading_status;
}GNSSINS_Data;
typedef struct
{
//Algorithm define some error status
int accel_error;
int gyro_error;
int time_error;
int arm_error;
}Error_Flag;
typedef struct
{
double X;
double Y;
double Z;
double estimate_X;
double estimate_Y;
double estimate_Z;
//define the rotation installation deviation angle.
//define the vehicle arm lever.
//define output position coordinate.
}Antenna_Arm;
typedef struct
{
//Output Rate HZ
double Output_Rate;
//Output Sample Rate (max)
double OutputSample_Rate;
//Accel. Range
double Accel_Range;
//Accel. In-Run Bias Stability (typ) g
double AccelBias_Stability;
//Accelerometer Velocity Random Walk (typ) (m/s)/rthr
double AccelVelocity_RandomWalk[3];
//Noise Density (typ) g/rtHz
double AccelNoise_Density;
//Accelerometer Output Total Noise (typ) g
double Accel_TotalNoise;
//0G Offset Tempco (typ) ppm/擄C
double Accel_Tempco;
//Accelerometer Non-Linearity (typ) % FSR
double Accel_NonLinearity;
//Accelerometer Axis to Axis Alignment (typ)
double AccelAxistoAxis_Alignment;
//Calibrated Temp Range
double Accel_CalibratedTemperatureRange;
//Gyro Input Range +/- (min) deg/s
double GyroInput_Range;
//Gyro In-Run Bias Stability (typ) deg/hr
double GyroBias_Stability[3];
//Gyro Angular Random Walk (typ) deg/rthr
double GyroAngular_RandomWalk[3];
//Gyro Noise Density (typ) (deg/s)/rtHz
double GyroNoise_Density;
//Gyro Linear G (typ) (deg/s)/g
double GyroLinear_G;
//Gyro Axis to Axis Alignment (typ) deg
double GyroAxistoAxis_Alignment;
//Gyro Bias Repeatability
double GyroBias_Repeatability;
}IMU_Model;
class GNSS_INS
{
public:
GNSS_INS();
~GNSS_INS() = default;
int SetIMUPar(IMU_Model *imu_par);
void SetAntenna_Arm(Antenna_Arm arm);
/**/
int Calibration(GNSS_Data *gnss_data, IMU_Data *imu_data, Error_Flag* flag);
int Init(GNSS_Data *gnss_data, IMU_Data *imu_data, Error_Flag* flag);
void GetAntenna_Arm(Antenna_Arm* arm);
// GNSS_Data 1/5HZ
// IMU_Data 100/200 HZ
// GNSSINS_Data depend on IMU_Data
int Integration(GNSS_Data *gnss_data, IMU_Data *imu_data, GNSSINS_Data *integrate_result,Error_Flag* flag);
private:
//arm Parameters
Antenna_Arm antenna_arm_;
//IMU_Model
IMU_Model imumode_;
//Algorithm add some variable
double last_time_,cur_time_,dt_;
};
}
#endif
/**
* @GNSS_INS.c
* @berif: GNSS_INS function define.
*/
#include <string.h>
#include "GNSS_INS.h"
namespace libGNSS_INS
{
int GNSS_INS::Init(IMU_Model *init_par)
{
memcpy((unsigned char *)(&imumode_),init_par,sizeof(IMU_Model));
return 0;
}
void GNSS_INS::GetAntenna_Arm(Antenna_Arm* arm)
{
memcpy((unsigned char *)(arm),&Antenna_Arm_,sizeof(Antenna_Arm));
}
void GNSS_INS::SetAntenna_Arm(Antenna_Arm arm)
{
memcpy((unsigned char *)(&Antenna_Arm_),&arm,sizeof(Antenna_Arm));
}
void GNSS_INS::SetCalibrationFlag(bool flag)
{
calibrationFlag_ = flag;
}
int Integration(GNSS_Data *gnss_data, IMU_Data *imu_data, GNSSINS_Data *integrate_result,Error_Flag* flag)
{
}
}