xuang
2023/04/10阅读:24主题:雁栖湖
周报
Part1
周报
1主要工作内容:算法理解与调试
-
坡度估计算法 -
RLS -
KALMAN
-
-
质量估计算法 -
质量与坡度联合估计算法
2坡度估计算法调试
高皓明师兄RLS模型
对皓明师兄的估计算法模型进行学习和更改,理清RLS质量估计算法的逻辑,以及具体模型结构与细节,具体的算法结构如下表:
RLS模型结结构
模块名称 | 模块用途 |
---|---|
Rawdata | 数据输入与预处理 |
Transform | 坐标系转换 |
EnalbeSignal | 初始化使能 |
Initialization | 数据初始化 |
RLS | 递推最小二乘法坡度估计 |
MassEstimation | 质量估计 |
Rawdata模块
对从IMU传感器上采集的数据、从CAN总线采集的数据进行输入,得到三轴的平动加速度、Y轴的角加速度、车辆自身的加速度、发动机的扭矩、变速箱的挡位信息、车速等算法所需的数据,离线仿真的时候,用时钟加查表的方式读取从实车CAN上采集的数据和IMU传感器的信息进行调试。
Transform模块
TCU(或传感器)的安装位置方向与车辆坐标系的位置垂直或者重合,可能存在一定的夹角。因此传感器测量得到的加速度或者角速度需要经过坐标系变换后才能使用,基于加速度和角速度的数学变换公式,搭建加速度和角速度的坐标变换模块
EnableSignal模块
初始化模块与主处理模块的调度逻辑如图所示。其中初始化时间为InitTime,当TCU上电并运行的时间小于InitTime时,使能输出信号为真。当TCU上电并运行的时间大于InitTime时,使能输出信号为假。
Initialization模块
初始化模块中,计算重力加速度g与角速度的零飘值。上电后的初始化时间内车辆处于静止状态。因此在该状态下,加速度三轴的平方和后开根号理论上等于重力加速度g,后续程序中使用的重力加速度采用该值。由于角速度传感器普遍存在零飘,因此在上电初始化时间段内计算角速度输出的平均值,并将该值作为角速度传感器的零飘。
RLS模块算法逻辑有问题需要更改
模块结构
该模块利用RLS递推最小二乘法的结合动力学估计融合的方式对坡度进行估计,并通过模糊逻辑控制器动态调节融合系数达到准确估计的目的。
RLS算法修改调试

-
x轴中的加速度没有剔除掉车辆自身加速度 -
没有反正弦,可以采用ax/az尝试
动力学估计算法修改调试
利用驱动力减去行驶阻力计算制动力,导致最终输出驱动力不准确,可以考虑去掉制动力的影响。
constant
C_tStandstillMax_uw = 60;%单位:s
C_mF_uw = 14000;%单位:kg
C_mFestRatioStart_uw = 1.3;
C_FmFestMax_uw = 0.8;
C_filterFres_sw = 0.05;
C_vFzRefSmall_sw = 2;%单位:m/s
C_vFzRefLarge_sw = 10;%单位:m/s
C_ayToLarge_sw = 3;%单位:m/s2
C_fuzzyTreshold_sw = 0.2;
C_axFromKroll_sl = 0.014*9.81;
C_mFmax_uw = 35000;%单位:kg
C_FdivideA_sw = 1;
C_deltamF_uw = 0.1;
C_filtermF_sw = 0.02;
C_mFupBooster_sw = 1.2;
C_FresFSmall_sw = 8000;%单位:N
C_FresFLarge_sw = 16000;%单位:N
C_mFdownBooster_sw = 1;
C_mFoverwrite_uw = 0;%单位:N
C_DeltaFresSmall_sw = 150;%单位:N
C_DeltaFresLarge_sw = 350;%单位:N
C_dFresFSmall_sw = 15;%单位:N
C_dFresFLarge_sw = 40;%单位:N
C_GammaOp1_sw = 1;%单位:m/s
C_axToSmall_sw = 0.3;%单位:m/s2
C_axToLarge_sw = 1 + 0;%单位:m/s2
C_ModifyFuzzyInBraking_sw = 0;
C_ModifyFuzzyInMSR_sw = 0;
C_filterSinGamma_sw = 0.2;
C_mFroughOffset_sw = 0;%单位:kg
C_gSinGammaDeadZone_sl = 0.1;%单位:m/s2
C_vStandstill_sw = 0.5;%单位:m/s
C_deltamFmax_uw = 1000;%单位:kg
C_vFzRefM1_sw = 2;%单位:m/s
C_vFzRefM2_sw = 10;%单位:m/s
% 初始值
% l_mFfuzzyFilt_sw = 0;
% l_filtermF_sw = 0;
% l_deltamFmax_uw = 0;
% l_FresFK1_sw = 0;
% l_mFrough_uw = 0;
% l_axEff_sl = 0;
钱师兄卓品估计算法
卓品坡度估计算法添加了大量的逻辑判断,模式切换与工况识别功能,功能更多,适应性相较于RLS模型更强,估计精度更高,近段时间对改算法进行了拆解学习,计划在卓品坡度估计算法的基础上嵌入质量估计算法。
算法结构如下:
模块名称 | 模块用途 |
---|---|
RawSignal | 数据输入与预处理 |
Transform | 坐标系转换 |
EnalbeSignal | 初始化使能 |
Initialization | 数据初始化 |
MainKalmanFilter1 | 卡尔曼滤波估计算法 |
除MainKalmanFilter1模块外,其他模块与上述对应模块基本相似,在此不做过多重复,详细分析该估计算法的核心思想
总体框图 算法分为以下几个部分
模块名称 | 模块用途 |
---|---|
AngleInteg | 角速度积分 |
State | 车辆状态估计 |
AxProcess | 纵向加速度处理 |
GyProcess | 俯仰角速度处理 |
Fusion | 算法融合 |
PostProcessing | 度计算结果后处理 |
AngleInteg模块

-
角速度积分模块主要基于俯仰角速度Gy、横摆角速度Gz、纵向车速VehVelocity进行综合处理,得到积分总线Integ_Bus与GyGz影响系数GyGzCorrCoff,其中输入的原始信号均来自原始信号总线。 -
角速度积分模块主要计算得到俯仰角速度在短时间内的积分值,这里计算了三种时间窗内的积分结果,分别为200ms、500ms、1000ms
State模块
该模块主要根据原始输入信号以及坡度估算结果,积分总线对车辆的不同运动状态进行判断,得到表征不同状态的标志位,包括道路坡度恒定标志位,正在坡度增加(例如抬头上坡过程)的标志位,正在坡度减小(例如从上坡到下坡的过渡过程)的标志位,以及正在转向标志位。正在加速状态标志位、减速状态标志位、车速平稳标志位、静止停车标志位、减速停车状态标志位、车辆运动状态标志位、加速起步状态标志位、加速停车或加速起步瞬态状态标志位。
StateJudgment车辆运动状态判断标志位(基于角速度积分)
角速度短时积分可衡量车辆短时的俯仰角、横摆角变化情况。虽然单纯的角速度积分存在角度误差,但在时间较短的情况下,可用来判断车辆的运动状态。判断的基本思想为基于短时的角速度积分,并与设定的门限值做比较。将比较结果经过延迟确认模块后输出,以防止状态标志位由于毛刺等信号干扰误判的情况
adjudication上下坡与坡道恒定标志位相互校验模块
当正在坡度增加、正在坡度减小、以及坡道恒定标志经过大小比较得到之后,为了防止三个状态标志位发生冲突,例如正在坡度增加标志位与正在坡度减小标志位均为True,而与两者工况不可能同时存在的常识向矛盾时。加入标志位逻辑校验模块,如图所示。当正在坡度增加或者正在坡度减小标志位为True时,坡度恒定标志位为零
车辆运动状态判断标志位(基于车速)
正在加速状态标志位、减速状态标志位、车速平稳标志位、静止停车标志位、减速停车状态标志位、车辆运动状态标志位、加速起步状态标志位、加速停车或加速起步瞬态状态标志位均基于车速的变化判断,且不同状态之间存在相互影响,因此将上述标志位判断放置在一个逻辑中,如图所示。 其中车速平稳标志位取决于车辆加速度与设定的门限值比较,以及一定长度内的车速时间窗的最大值与最小值的相差大小,如图所示。为避免车速较小时的误判情况,同时要求车速大于一定值,该车速标定量Velocity_MoveSmoothV。车辆加速和减速标志位判断取决于当前测量加速度大小,当加速度大于一定门限值或者小于一定的负门限值后则使能。其中判断车辆加速标志位和减速标志位的加速度门限标定量分别为VehAcc_Acc和VehAcc_Dec。
AxProcess纵向加速度处理模块
纵向加速度处理分为加速度主处理与加速度动态斜率上下门限值计算两大模块,如下图所示。其中加速度主处理模块根据加速度动态斜率上下门限值计算模块输出的加速度上下门限值,对原始的加速度进行斜率限制,同时还针对加速度进行灵活选择等处理
Gy俯仰角速度处理模块
对Gy角速度进行修正需要一定的触发条件。其触发条件为判断Gy与Gz的积分是否满足相互影响系数的倍数关系。另外还需要在车辆处于转向状态下使能该判断。判断车辆处于转向状态的逻辑为Gz短时积分值大于一定角度,该角度为可标定量SteerAngleThres。当车辆在转向状态下的Gy和Gz积分量满足该关系时,可认为Gy修正逻辑成立,即可对Gy进行修正衰弱处理。当不满足该关系时选择原始Gy信号。
Fusion加速度与角速度信号融合模块
利用卡尔曼滤波数据融合的思想,对通过加速度与角速度处理算法得到的坡度信号进行数据融合,并通过动太调节卡尔曼融合系数的方式,得到最终的估计坡度。
PostProcessing坡度估计计算结果后处理
对估计算法输出的坡度与角度信号值进行最终处理,即对坡度计算结果进行选择与滤波输出,得到坡度值与角度值。
Constant
clear;
simulation = 0;
version = 724;
%% 模型输入信号
add_EQSC_Signal('Accel_X_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('Accel_Y_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('Accel_Z_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('Gyro_X_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('Gyro_Y_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('Gyro_Z_val_data','int16','ImportedExtern',0,'');
add_EQSC_Signal('ipdd_v_vehicleSpeed_kph','single','ImportedExtern',0,'');
add_EQSC_Signal('EWTS5G_lld_gyro_scale_sel_C','uint16','ImportedExtern',0,'');
add_EQSC_Signal('TS1_CurrentGear','uint8','ImportedExtern',0,'');
%% 模型测量信号
add_EQSC_Signal('ax_corr','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('ax_corr_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('ax_filter','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('axErr','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('axFilter','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('AxGrad_LL','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('AxGrad_LU','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('axGradLimit','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('ay_corr_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('az_corr_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('g','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('GradMargin','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Gy1000ms_Modify','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Gy1000ms_Out','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Gy1000ms_Raw','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gy_bias','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gy_modify','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gyro_scale','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gyro_X_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gyro_Y_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gyro_Z_input','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('gyro_Y_modify','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('kalman_Angle','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('kalman_Est','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('kalman_K','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('kalman_Mea','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('RampConstant_b','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Slope_Integ','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Slope_Kalman','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Slope_Result','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Slope_Z','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Slope_ZAx','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('ZAx_Angle','single','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Straight_b','int8','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Uphilling_b','int8','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('Downhilling_b','int8','MEMSEC_OEM_MES (Custom)',0,'');
add_EQSC_Signal('version_num','single','MEMSEC_OEM_MES (Custom)',0,''); % 软件版本号
%% 关键开关配置量
add_EQSC_Param('VehAccCompensation_b','boolean','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('GyBiasOff_b','boolean','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('GzGyCompensation_b','boolean','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('AngleZAx_b','boolean','MEMSEC_OEM_CAL (Custom)',0,'');
%% 标定参数
add_EQSC_Param('accX_sign','int8','MEMSEC_OEM_CAL (Custom)',-1,'');
add_EQSC_Param('accY_sign','int8','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('accZ_sign','single','MEMSEC_OEM_CAL (Custom)',0.8,'');
add_EQSC_Param('angle_corr_X','single','MEMSEC_OEM_CAL (Custom)',0,'');
add_EQSC_Param('angle_corr_Y','single','MEMSEC_OEM_CAL (Custom)',0,'');
add_EQSC_Param('angle_corr_Z','single','MEMSEC_OEM_CAL (Custom)',0,'');
add_EQSC_Param('AngleRampConstThres','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('AxGradLowerLimit','single','MEMSEC_OEM_CAL (Custom)',-0.15,'');
add_EQSC_Param('AxGradLowerLimitErr','single','MEMSEC_OEM_CAL (Custom)',-1e-05,'');
add_EQSC_Param('AxGradLowerLimitMd','single','MEMSEC_OEM_CAL (Custom)',-0.001,'');
add_EQSC_Param('AxGradUpperLimit','single','MEMSEC_OEM_CAL (Custom)',0.15,'');
add_EQSC_Param('AxGradUpperLimitErr','single','MEMSEC_OEM_CAL (Custom)',1e-05,'');
add_EQSC_Param('AxGradUpperLimitMd','single','MEMSEC_OEM_CAL (Custom)',0.001,'');
add_EQSC_Param('AxLowerLimit','single','MEMSEC_OEM_CAL (Custom)',-0.2,'');
add_EQSC_Param('AxMutation','single','MEMSEC_OEM_CAL (Custom)',0.05,'');
add_EQSC_Param('AxUpperLimit','single','MEMSEC_OEM_CAL (Custom)',0.2,'');
add_EQSC_Param('AyGradUpperlimit','single','MEMSEC_OEM_CAL (Custom)',0.001,'');
add_EQSC_Param('AyGradLowerlimit','single','MEMSEC_OEM_CAL (Custom)',-0.001,'');
add_EQSC_Param('AyUpperLimit','single','MEMSEC_OEM_CAL (Custom)',0.1,'');
add_EQSC_Param('AzGradUpperlimit','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('AzGradLowerlimit','single','MEMSEC_OEM_CAL (Custom)',-1,'');
add_EQSC_Param('AzLowerLimit','single','MEMSEC_OEM_CAL (Custom)',0.707,'');
add_EQSC_Param('AzUpperLimit','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('Coff_Gy1000msFilter','single','MEMSEC_OEM_CAL (Custom)',0.9,'');
add_EQSC_Param('DeltaAx','single','MEMSEC_OEM_CAL (Custom)',0.05,'');
add_EQSC_Param('DeltG','single','MEMSEC_OEM_CAL (Custom)',0.05,'');
add_EQSC_Param('DeltSinSinFlter','single','MEMSEC_OEM_CAL (Custom)',3,'');
add_EQSC_Param('dt','single','MEMSEC_OEM_CAL (Custom)',0.01,'');
add_EQSC_Param('GradMargin_L','single','MEMSEC_OEM_CAL (Custom)',-0.05,'');
add_EQSC_Param('GradMargin_M','single','MEMSEC_OEM_CAL (Custom)',-0.02,'');
add_EQSC_Param('GradMargin_S','single','MEMSEC_OEM_CAL (Custom)',-0.01,'');
add_EQSC_Param('AxGrLimDown','single','MEMSEC_OEM_CAL (Custom)',-0.2,'');
add_EQSC_Param('AxGrLimUp','single','MEMSEC_OEM_CAL (Custom)',0.2,'');
add_EQSC_Param('AxAngleRawFilterDelay','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('Gy1000msModifyDelay','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('Gy1000msRampConstThres','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('GyGzCorrCoff','single','MEMSEC_OEM_CAL (Custom)',0.07,'');
add_EQSC_Param('gyModifyDamping','single','MEMSEC_OEM_CAL (Custom)',0.2,'');
add_EQSC_Param('gyroX_sign','int8','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('gyroY_sign','int8','MEMSEC_OEM_CAL (Custom)',-1,'');
add_EQSC_Param('gyroZ_sign','int8','MEMSEC_OEM_CAL (Custom)',-1,'');
add_EQSC_Param('Gz1000msGyModifyThres','single','MEMSEC_OEM_CAL (Custom)',2,'');
add_EQSC_Param('Gz1000msStraightThres','single','MEMSEC_OEM_CAL (Custom)',4,'');
add_EQSC_Param('IncR','single','MEMSEC_OEM_CAL (Custom)',15,'');
add_EQSC_Param('InitialTime','single','MEMSEC_OEM_CAL (Custom)',0.5,'');
add_EQSC_Param('SteerAngleHighThres','single','MEMSEC_OEM_CAL (Custom)',5,'');
add_EQSC_Param('SteerAngleThres','single','MEMSEC_OEM_CAL (Custom)',2,'');
add_EQSC_Param('Zerodrift','single','MEMSEC_OEM_CAL (Custom)',0.3,'');
add_EQSC_Param('StoppingVelocity','single','MEMSEC_OEM_CAL (Custom)',0.5,'');
add_EQSC_Param('MovingVelocity','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('alpha','single','MEMSEC_OEM_CAL (Custom)',0.8,'');
add_EQSC_Param('AccFlagDelay','single','MEMSEC_OEM_CAL (Custom)',0.2,'sec');
add_EQSC_Param('DecFlagDelay','single','MEMSEC_OEM_CAL (Custom)',0.2,'sec');
add_EQSC_Param('StatWidth','single','MEMSEC_OEM_CAL (Custom)',0.5000,'');
% add_EQSC_Param('Velocity_StandStill','single','MEMSEC_OEM_CAL (Custom)',0.5,'');
add_EQSC_Param('VehAcc_Acc','single','MEMSEC_OEM_CAL (Custom)',0.02,'');
add_EQSC_Param('VehAcc_Dec','single','MEMSEC_OEM_CAL (Custom)',-0.02,'');
add_EQSC_Param('Velocity_DiffSmoothV','single','MEMSEC_OEM_CAL (Custom)',0.1,'');
add_EQSC_Param('Velocity_DiffSmoothAx','single','MEMSEC_OEM_CAL (Custom)',0.02,'');
add_EQSC_Param('Velocity_MoveSmoothV','single','MEMSEC_OEM_CAL (Custom)',2.5,'');
add_EQSC_Param('Coff_ZAxKalman','single','MEMSEC_OEM_CAL (Custom)',0.995,'');
add_EQSC_Param('Gy1000msDownhilling','single','MEMSEC_OEM_CAL (Custom)',-0.5,'deg');
add_EQSC_Param('Gy1000msUphilling','single','MEMSEC_OEM_CAL (Custom)',0.5,'deg');
add_EQSC_Param('AxErr_AxLimitReset','single','MEMSEC_OEM_CAL (Custom)',0.1,'');
% GyGzCorrCoffCalc
add_EQSC_Param('GyGzCorrCoff_GzLow','single','MEMSEC_OEM_CAL (Custom)',2,'');
add_EQSC_Param('GyGzCorrCoff_GzHigh','single','MEMSEC_OEM_CAL (Custom)',10,'');
add_EQSC_Param('UpOrDownhillingDelay','single','MEMSEC_OEM_CAL (Custom)',1,'');
add_EQSC_Param('StateEnabledDelay','single','MEMSEC_OEM_CAL (Custom)',0.2,'');
add_EQSC_Param('TurningStateEnabledDelay','single','MEMSEC_OEM_CAL (Custom)',3,'');
EQ_CfgModAndSetStorageClass;
if simulation == 1
% load('updown.mat');
% load('turning.mat');
% load('accdec_slope0.mat')
% load('turnAndSlope.mat');
% load('R_updown.mat');
% load('up.mat');
% load('sloptest.mat');
% load('turing.mat');
% load('up_dwn_slop.mat');
% load('downslop.mat');
% load('pinglu_sloperr0.mat');
% load('pinglu_slop.mat');
% load('test0721_1.mat');
% load('pinglu_zuo.mat');
% load('pinglu_zuo_2.mat');
% load('test0721_1.mat');
% load('test0721_3.mat');
% load('test0721_4.mat');
% load('test0721_5.mat');
% load('zuo_1.mat');
% load('tcu2_ping_zuo.mat');
% load('zuoshangxia.mat');
% load('youshang.mat');
% load('youxia.mat');
% load('up_no_stopping.mat');
% load('down_no_stopping.mat');
% load('down_zero.mat');
% load('up_zero.mat');
% load('down_little_est.mat');
% load('down_12.mat');
load('down_error.mat');
% load('down_little_error.mat');
% load('stop_and_dec.mat');
data_input_mat;
end
3质量估计算法
目前正在分析质量估计算法的模型逻辑与模型细节,理清楚算法后将尝试将该质量估计算法与卓品坡度估计算法融合,进行联合估计
作者介绍