本人也是新学习组合导航,有问题请指出,大家一起学习!
东北天IMU与北东地IMU输出对比
手头正好有两个不同坐标系的IMU,想通过对比输出来学习二者有什么不同,当然,我也不清楚是不是同一坐标系IMU输出方向都是一致的,所以这里只能作为一个参考。
东北天(ENU)
![](https://img-blog.csdnimg.cn/direct/eb94a623a40c40609c5c7666bcf349c4.png)
方向:x轴指向东,y轴指向北,z轴指向天;
加速度:沿轴方向做加速运动,加速度>0;静止不动时,z轴加速度=+g;
角速度:各轴按右手定则方向旋转,角速度>0;
欧拉角:欧拉角增加方向与角速度>0方向一致。
北东地(NED)
![](https://img-blog.csdnimg.cn/direct/ff33d3f079564cbe9b8abdd1ad6df90c.png)
方向:x轴指向北,y轴指向东,z轴指向地;
加速度:沿轴方向做加速运动,加速度>0;静止不动时,z轴加速度=-g;
角速度:各轴按右手定则方向旋转,角速度>0;
欧拉角:欧拉角增加方向与角速度>0方向一致。
由输出结果可知,二者的加速度在沿轴向>0;角速度>0方向和欧拉角增长的方向均满足右手定则。
NED转换到ENU
根据上位机提供的角度旋转,可以通过如下方式将NED转换到ENU
![](https://img-blog.csdnimg.cn/direct/2ac669ecc8af49c5a927933793683355.png)
在严恭敏老师的PSINS代码中,有相关转换方式,根据咱们的需求,将dirstr设置为’FRD’,
wvm0为IMU数据:[wx,wy,wz,ax,ay,az]。
也就是分别交换x,y轴角速度和加速度,z轴不变。
function [wvm, Dir] = imurfu(wvm0, dirstr)
% In PSINS toolbox, Right-Front-Up orientations are selected as body
% frame axes X-Y-Z respectively. Call this function when the user's
% SIMU outputs does not follow the above convention.
%
% Prototype: [wvm, Dir] = imurfu(wvm0, dirstr)
% Inputs: wvm0 - the user's raw SIMU data
% dirstr - raw SIMU X-Y-Z orientations including three characters,
% the orientation abbreviations are:
% 'U': Upper; 'D': Down; 'R': Right; 'L': Left;
% 'F': Front; 'B': Back; 'E': East; 'W': West; 'N': North;
% 'S': South.
% Outputs: wvm - SIMU data with X-Y-Z pointing to R-F-U respectively,
% i.e. wvm(:,1:6) = wvm0(:,1:6)*blkdiag(Dir',Dir').
% Dir - see above, or Dir==Cnb, wm=Cnb*wm0.
%
% Example:
% [wvm1, Dir] = imurfu([], 'flu')
% wvm2 = [1 2 3 1 2 3]*blkdiag(Dir',Dir')
%
% See also imuidx, wierfu, imurot, imuresample, insupdate, trjsimu, attrfu.
% Copyright(c) 2009-2014, by Gongmin Yan, All rights reserved.
% Northwestern Polytechnical University, Xi An, P.R.China
% 02/06/2009
if isempty(wvm0), wvm0 = [1,2,3, 1,2,3]; end
wvm = wvm0; Dir = zeros(3);
clm = size(wvm, 2);
for k=1:3
if upper(dirstr(k))=='X', return; end % do nothing
switch(upper(dirstr(k)))
case {'R','E'}
wvm(:,1) = wvm0(:,k); if clm>=6, wvm(:,4) = wvm0(:,k+3); end
Dir(:,k) = [1; 0; 0];
case {'L','W'}
wvm(:,1) = -wvm0(:,k); if clm>=6, wvm(:,4) = -wvm0(:,k+3); end
Dir(:,k) = [-1; 0; 0];
case {'F','N'}
wvm(:,2) = wvm0(:,k); if clm>=6, wvm(:,5) = wvm0(:,k+3); end
Dir(:,k) = [0; 1; 0];
case {'B','S'}
wvm(:,2) = -wvm0(:,k); if clm>=6, wvm(:,5) = -wvm0(:,k+3); end
Dir(:,k) = [0; -1; 0];
case {'U'}
wvm(:,3) = wvm0(:,k); if clm>=6, wvm(:,6) = wvm0(:,k+3); end
Dir(:,k) = [0; 0; 1];
case {'D'}
wvm(:,3) = -wvm0(:,k); if clm>=6, wvm(:,6) = -wvm0(:,k+3); end
Dir(:,k) = [0; 0; -1];
otherwise
error('Orientation character string error !');
end
end
if(norm(cross(Dir(:,1),Dir(:,2))-Dir(:,3))~=0)
error('Not right hand frame !');
end