zoukankan      html  css  js  c++  java
  • IMU | 惯导模块指标参数与标定


    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)
    	{
    
    	}
    }
    
  • 相关阅读:
    跨域问题----CORS
    java设计模式--简单工厂模式
    vue+java后台通信报403,cors解决跨域问题(该贴说的不是很清楚,不过大概如此,可再去网上查相关内容)
    CMake实践(2)
    CMake实践(1)
    Centos6.5下编译安装ACE6.0
    回调函数的应用误区4(c/s OK版本回调小程序)
    回调函数的应用误区3(大彻大悟的回调小程序,例子的解释相当给力)
    回调函数的应用误区2(与原理相悖的回调函数)
    回调函数的应用误区1(原汁原味的函数指针应用)
  • 原文地址:https://www.cnblogs.com/CristL/p/13864293.html
Copyright © 2011-2022 走看看