-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathgenerateGyrError.m
137 lines (132 loc) · 4.87 KB
/
generateGyrError.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
function [ gyrError, eb, wg, er ] = generateGyrError(length, ts, imuError)
%% **************************************************************
%名称:Generate Gyroscope error
%功能:生成一组陀螺误差
%原理@ 惯性仪器测试与数据分析
%________________________________________________________________________
% 输入:
% length: 数据长度
% ts: imu输出频率
% imuError: imu误差,当然我们只会使用其中的陀螺误差部分,请注意将输入参数的
% 单位调整为与以下一致。
% Gbias: 随机常值漂移 (deg/h)
% GN :随机游走系数 (deg/sqrt(h))
% GN2: 白噪声功率谱密度 (deg/h)^2/Hz
% GfB: 白噪声带宽 (HZ)
% Gtau: 一阶马尔可夫过程的相关时间 (s)
% GR0: 一阶马尔可夫过程方差 (deg/h)^2
% *Gwg: 白噪声标准差 (deg/h),考虑到有时我们希望直接指定白噪声标准差,故
% 特地添加了这个参数,若指定了Gwg,则会忽略GN;GN2,GfB的影响。
% 输出:
% gyrError: 陀螺随机误差
% eb = 常值漂移
% wg = 白噪声
% er = 一阶马尔可夫过程,不存在imuError.Gtau 时输出为0
%_________________________________________________________________________
%作者:哈尔滨工程大学 智能科学与工程学院 张峥
%日期:2020年12月3日
% ************************************************************************
%%
% @ P155,陀螺随机漂移分为 1.随机常值漂移,2.白噪声,3.一阶马尔可夫过程。前两种
% 噪声肯必定会添加,第三种不一定。因为陀螺分为角速率输出型和角增量输出型两种,
% 因此分开考虑。角增量输出型陀螺使用随机游走系数GN;角速率输出型陀螺需已知功率
% 谱密度GN2和带宽GfB
global Gl
setGl_unit;
% 陀螺常值零偏
if isfield(imuError, 'Gbias')
Gbias = imuError.Gbias * Gl.dph; %(deg/h)
else
Gbias = 0;
disp('注意,缺少陀螺零偏参数,已默认为0!');
end
% 判断陀螺输出类型
if isfield(imuError, 'GN')
% 角增量输出型
condition = 'increment';
N = imuError.GN*Gl.dpsh; % (deg/sqrt(h))
else
if isfield(imuError, 'GN2') && isfield(imuError, 'GfB')
% 角速度输出型
condition = 'velocity';
N2 = imuError.GN2*Gl.dph^2/Gl.Hz; %(deg/h)^2/Hz
fB = imuError.GfB*Gl.Hz; %(HZ)
else
condition = 'noWhiteNoise';
disp('注意,缺少陀螺白噪声参数,已默认不添加白噪声!');
end
end
% 判断是否添加一阶马尔可夫过程噪声
if isfield(imuError, 'Gtau') && isfield(imuError, 'GR0')
ismarkov = 1;
tau = imuError.Gtau*1; % s
R0 = imuError.GR0*Gl.dph^2; % (deg/h)^2
else
disp('陀螺噪声不含一阶马尔可夫过程');
ismarkov = 0;
end
% 预分配内存
er = zeros(length, 1);
switch condition
% *** 增量输出型 ***
case 'increment' % deg
disp('陀螺误差为角增量型');
% 随机常值漂移
eb = Gbias*ts*ones(length, 1);
% 白噪声
std_wg = N*sqrt(ts); % 随机游走系数为N,输出频率为ts的情况下,白噪声的标准差
wg = std_wg*randn(length, 1);
% 一阶马尔可夫噪声
if ismarkov == 1
beta = 1/tau;
Phi = 1 - beta*ts;
qr = 2*beta*R0;
std_wr = sqrt(qr*ts);
for k = 2:length
er(k) = Phi*er(k-1) + std_wr*randn(1, 1);
end
er = er*ts;
else
er = zeros(length, 1);
end
% *** 速度输出型 ***
case 'velocity' % deg/h
disp('陀螺误差为角速度型');
% 随机常值漂移
eb = Gbias*ones(length, 1);
% 白噪声 参照@P245。一定要注意:P157中的Qk失准角的角度激励噪声方差
% 单位为deg,而角速率输出型陀螺的误差单位为(deg/h)
std_wg = sqrt(N2*fB);
wg = std_wg*randn(length, 1);
% 一阶马尔可夫噪声
if ismarkov == 1
beta = 1/tau;
Phi = 1 - beta*ts;
qr = 2*beta*R0;
std_wr = sqrt(qr*ts);
for k = 2:length
er(k) = Phi*er(k-1) + std_wr*randn(1, 1);
end
else
er = zeros(length, 1);
end
otherwise
%未指定白噪声的情况下,默认为速度输出型
disp('因未指定陀螺白噪声,已默认陀螺输出为角速度型!');
eb = Gbias*ones(length, 1);
wg = zeros(length, 1);
% 一阶马尔可夫噪声
if ismarkov == 1
beta = 1/tau;
Phi = 1 - beta*ts;
qr = 2*beta*R0;
std_wr = sqrt(qr*ts);
for k = 2:length
er(k) = Phi*er(k-1) + std_wr*randn(1, 1);
end
else
er = zeros(length, 1);
end
end
gyrError = eb + er + wg;
end