glvs; nn = 2;ts = 0.1; nts = nn*ts;% 子样数和采样时间 att0 = [0; 0; 30]*arcdeg; qnb0 = a2qua(att0); vn0 = [0;0;0]; pos0 = [34*arcdeg; 108*arcdeg; 100]; qnb = qnb0; vn = vn0; pos = pos0;% 姿态、速度和位置初始化 eth = earth(pos, vn); wm = qmulv(qconj(qnb),eth.wnie)*ts: vm = qmulv(qconj(qnb),-eth.gn)*ts wm = repmat(wm', nn, 1); vm = repmat(vm', nn, 1); % 仿真静态IMU数据 phi = [0.1; 0.2; 3]*arcmin: qnb = qaddphi(qnb, phi) % 失准角 eb =[0.01;0.015;0.02]*dph; web = [0.001;0.001;0.001]*dpsh; % 陀螺常值零偏,角度随机游走 系数 db = [80;90;100]*ug; wdb = [1;1;1]*ugpsHz; % 加速度计常值偏值,速度随机游走系数 Qk = diag([web; wdb; zeros(9,1)])/2*nts; rk = [[0.1;0.1;0.1];[[10;10]/Re;10]] Rk = diag(rk)/2; "zv([6n*[001:001:001] 'udpx[L'0:L'0:L'0] :[ol:ad/[0l:0l]] :[L:L:L] :Bapoyex[0L:L'0:L'0]])be!p = 0d Hk = [zeros(6,3),eye(6),zeros(6)] kf = kfinit(Qk, Rk, P0, zeros(15), Hk); % kf滤波器初始化 len = fix(3600/ts) % 仿真时长 kf = kfupdate(kf) if mod(t,1)<nts gps = [vn0; pos0] + rk.*randn(6,1); % GPS速度位置仿真 kf = kfupdate(kf, [vn;pos]-gps, 'M'); vn(3) = vn(3)- kf.Xk(6); Kt.XK(6) = O % 反馈 end avp(kk,:) = [qq2phi(qnb,qnb0); vn; pos; t]'; xkpk(kk,:) = [kf.Xk; diag(kf.Pk); t]; kk = kk+1; if mod(t,100)<nts disp(fix(t)); end % 显示进度 end avp(kk:end,:) = []; xkpk(kk:end,:) = []: tt = avp(:,end); % 状态真值与估计效果对比佟 mysubplot(321, tt, [avp(:,1:2),xkpk(:,1:2)]/arcmin, '\phi_E,\phi_N /\prime'); mysubplot(322, tt, [avp(:,3),xkpk(:,3)]/arcmin, '\phi_U /\prime'); mysubplot(323, tt, [avp(:,4:6),xkpk(:,4:6)], '\deltav /n /m/s'); mysubplot(324,t,ideltapos(avp(:7:9)),[xkpk(:,7),xkpk(:,8).*cos(avp(:,7))]*Re,xkpk(:,9)],\DeltaP m'); mysubplot(325, tt, xkpk(:,10:12)/dph, '\epsilon /\circ/h'); mysubplot(326, t, xkpk(:,13:15)/ug, '\nabla / ug'); % 均方差收敛佟 pk = sqrt(xkpk(:,16:end-1)) mysubplot(321, tt, pk(:,1:2)/arcmin, '\phi_E,\phi_N /\prime'); mysubplot(322, tt, pk(:,3)/arcmin, '\phi_U /\prime'): mysubplot(323, tt, pk(:,4:6), '\deltav in / m/s'); mysubplot(324, t, [[pk(:,7),pk(:,8)*cos(avp(1,7))]*Re,pk(:,9)], \DeltaP /m'); mysubplot(325, tt, pk(:,10:12)/dph, '\epsilon /\circ/h'); mysubplot(326, tt, pk(:,13:15)/ua, "\nabla / ua'):
时间: 2024-04-17 17:27:22 浏览: 11
这段代码是一个姿态和导航的仿真,主要包括以下几个步骤:
1. 定义了一些变量和常数,如子样数和采样时间。
2. 初始化姿态、速度和位置。
3. 生成静态IMU数据。
4. 设置失准角。
5. 定义陀螺常值零偏和角度随机游走系数,以及加速度计常值偏值和速度随机游走系数。
6. 计算状态方程和观测方程的噪声协方差矩阵。
7. 初始化卡尔曼滤波器。
8. 定义仿真时长。
9. 在循环中更新卡尔曼滤波器,并进行GPS速度和位置的仿真。
10. 保存状态真值与估计效果对比的结果。
11. 保存均方差收敛的结果。
最后,代码通过绘图显示了姿态、速度、位置等参数的变化情况,并展示了均方差的收敛情况。
相关问题
glvs; nn = 2;ts = 0.1; nts = nn*ts;% 子样数和采样时间 att0 = [0; 0; 30]*arcdeg; qnb0 = a2qua(att0); vn0 = [0;0;0]; pos0 = [34*arcdeg; 108*arcdeg; 100]; qnb = qnb0; vn = vn0; pos = pos0;% 姿态、速度和位置初始化 eth = earth(pos, vn); wm = qmulv(qconj(qnb),eth.wnie)*ts: vm = qmulv(qconj(qnb),-eth.gn)*ts wm = repmat(wm', nn, 1); vm = repmat(vm', nn, 1); % 仿真静态IMU数据 phi = [0.1; 0.2; 3]*arcmin: qnb = qaddphi(qnb, phi) % 失准角 eb =[0.01;0.015;0.02]*dph; web = [0.001;0.001;0.001]*dpsh; % 陀螺常值零偏,角度随机游走 系数 db = [80;90;100]*ug; wdb = [1;1;1]*ugpsHz; % 加速度计常值偏值,速度随机游走系数 Qk = diag([web; wdb; zeros(9,1)])/2*nts; rk = [[0.1;0.1;0.1];[[10;10]/Re;10]] Rk = diag(rk)/2; "zv([6n*[001:001:001] 'udpx[L'0:L'0:L'0] :[ol:ad/[0l:0l]] :[L:L:L] :Bapoyex[0L:L'0:L'0]])be!p = 0d Hk = [zeros(6,3),eye(6),zeros(6)] kf = kfinit(Qk, Rk, P0, zeros(15), Hk); % kf滤波器初始化 len = fix(3600/ts) % 仿真时长
这段代码是一个惯性导航系统的仿真代码。它使用了CSDN开发的一些函数和库来进行模拟。主要包括以下几个部分:
1. 初始化部分:设置了子样数和采样时间,初始的姿态、速度和位置。还初始化了一些常数和参数。
2. 仿真IMU数据部分:根据姿态和地球参数,生成了静态IMU数据。
3. 失准角部分:添加了一些失准角。
4. 零偏和随机游走部分:设置了陀螺零偏和加速度计常值偏值,并给它们添加了一些随机游走的效果。
5. 噪声部分:设置了测量噪声的参数。
6. KF滤波器初始化部分:根据设置的噪声参数,初始化了一个KF滤波器。
7. 仿真时长部分:根据采样时间计算了仿真的时长。
以上是对代码的简要介绍,具体的功能和实现细节可能需要进一步了解代码的上下文和具体实现。
% Ballistic missile trajectory & SINS/GPS simulation glvs ts = 0.01; %% trajectory simulation % stage 1: 1/4 circle T = 60; t = (0:ts:T)'; afadot2 = 2*pi/2/T^2; afa = 1/2*afadot2*t.^2; r = 60000; y = r-r*cos(afa); z = r*sin(afa); pitch = pi/2-afa; tt = t; % stage 2: leveling constant acceleration v = (y(end)-y(end-1))/ts; T = 120; t = (ts:ts:T)'; a = -2; y = [y; y(end)+v*t+1/2*a*t.^2]; z = [z; z(end)+t*0]; pitch = [pitch; t*0]; tt = [tt; tt(end)+t]; % stage 3: leveling constant velocity v = (y(end)-y(end-1))/ts; T = 120; t = (ts:ts:T)'; a = -0; y = [y; y(end)+v*t+1/2*a*t.^2]; z = [z; z(end)+t*0]; pitch = [pitch; t*0]; tt = [tt; tt(end)+t]; myfig, plot(y, z, '-'); xygo('front/m','up/m'); %% imu,avp,gps dxyz = [y*0,y,z,tt]; dxyz(:,1:3) = ar1filt(dxyz(:,1:3), 100); pos = dxyz2pos(dxyz); ap = [pitch, zeros(length(pos),2), pos]; [imu, avp0, avp] = ap2imu(ap); imuplot(imu); gps = gpssimu(avp(1:100:end, :), 0.1, 10, 1,0,0, 0); %% sins/gps imuerr = imuerrset(0.15, 100, 0.001, 10); davp = avperrset([1;1;3]*3, [1;1;1], [1;1;3]*100); imu1 = imuadderr(imu,imuerr); ins = insinit(avpadderr(avp0,davp), ts); ins.nts=ts; avp1 = sinsgps(imu1, gps, ins, davp, imuerr); avpcmpplot(avp, avp1(:,[1:9,end]), 'phi');帮我注释代码
以下是对代码的注释:
```matlab
% Ballistic missile trajectory & SINS/GPS simulation
glvs ts = 0.01; % 设置时间步长
%% 轨迹模拟
% 阶段1:1/4圆形轨迹
T = 60; % 转弯时间
t = (0:ts:T)'; % 时间向量
afadot2 = 2*pi/2/T^2; % 角速度
afa = 1/2*afadot2*t.^2; % 角度
r = 60000; % 距离
y = r-r*cos(afa); % y坐标
z = r*sin(afa); % z坐标
pitch = pi/2-afa; % pitch角
tt = t;
% 阶段2:匀加速直线运动
v = (y(end)-y(end-1))/ts; % 初始速度
T = 120; % 时间
t = (ts:ts:T)'; % 时间向量
a = -2; % 加速度
y = [y; y(end)+v*t+1/2*a*t.^2]; % y坐标
z = [z; z(end)+t*0]; % z坐标
pitch = [pitch; t*0]; % pitch角
tt = [tt; tt(end)+t];
% 阶段3:匀速直线运动
v = (y(end)-y(end-1))/ts; % 初始速度
T = 120; % 时间
t = (ts:ts:T)'; % 时间向量
a = -0; % 加速度
y = [y; y(end)+v*t+1/2*a*t.^2]; % y坐标
z = [z; z(end)+t*0]; % z坐标
pitch = [pitch; t*0]; % pitch角
tt = [tt; tt(end)+t];
% 绘制轨迹图
myfig, plot(y, z, '-');
xygo('front/m','up/m');
%% IMU、AVP和GPS
% 计算位置
dxyz = [y*0,y,z,tt];
dxyz(:,1:3) = ar1filt(dxyz(:,1:3), 100);
pos = dxyz2pos(dxyz);
% 计算姿态
ap = [pitch, zeros(length(pos),2), pos];
[imu, avp0, avp] = ap2imu(ap);
% 绘制IMU图
imuplot(imu);
% 生成GPS数据
gps = gpssimu(avp(1:100:end, :), 0.1, 10, 1,0,0, 0);
%% SINS/GPS
% 设置IMU误差和姿态误差
imuerr = imuerrset(0.15, 100, 0.001, 10);
davp = avperrset([1;1;3]*3, [1;1;1], [1;1;3]*100);
% 添加IMU误差
imu1 = imuadderr(imu,imuerr);
% 初始化INS
ins = insinit(avpadderr(avp0,davp), ts);
ins.nts=ts;
% 进行SINS/GPS解算
avp1 = sinsgps(imu1, gps, ins, davp, imuerr);
% 绘制姿态角度对比曲线
avpcmpplot(avp, avp1(:,[1:9,end]), 'phi');
```