多种频率之间导航系统的精度比较方法

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_31736703/article/details/81698057

在很多时候,为了验证自己开发的组合导航系统的精度,需要将组合导航系统和更高精度或绝对精确的设备进行比较,笔者在比较过程中遇到如下问题:

1.AUV在水下航行时受水流层扰动会导致路径非设定航线,而是围绕航线左右游摆,这样一条曲线因为阶次不定很难进行拟合

2.两种传感器采集频率不同,不能直接遍历求解误差,此外其中导航系统A由于水声通信过程中出现丢包等问题,导致数据出现较多时间内的丢失,而不是简单的采集频率不同。

本文对系统A使用插值法后再进行误差计算,具体步骤如下:

1.导入数据

clc
clear
close all
data=load('');
len=length(data);

data1=load('');
len1=length(data1);

a = 2;%插值阈值
x_auv=data(:,1);
y_auv=data(:,2);

x_750=data1(:,1);
y_750=data1(:,2);

其中,a为插值区间的判定阈值,只有当前后两值大于a时,才作为区间进行插值。

2.计算插值个数

num_insert = length(x_750) - length(x_auv);%需插值的坐标个数

将两种系统采集到的所有数据量之差作为插值个数

3.计算待插值区间

num_space = 0;%区间数
%x_insert待插区间坐标
j = 1;
k = 1;
m = 1;
for i=1:1:length(x_auv)-1 
    dist(i) = sqrt((x_auv(i+1)-x_auv(i))*(x_auv(i+1)-x_auv(i))+(y_auv(i+1)-y_auv(i))*(y_auv(i+1)-y_auv(i)));%1~len
    if(dist(i) >= a) 
        num_space = num_space+1;
        x_insert(j) = x_auv(i);
        x_insert_co(m) = i;
        m = m+1;
        x_insert(j+1) = x_auv(i+1);
        y_insert(j) = y_auv(i);
        y_insert(j+1) = y_auv(i+1);
        j = j+2;
        dist_insert(k) = dist(i);%各区间距离
        k = k+1;
    end  
end

通过遍历系统A数据,保存数据中插值区间的端点

4.分配插值量

dist_sum = sum(dist_insert);%坐标间总距离和
for i=1:1:num_space
    space_insert(i) = round(dist_insert(i)/dist_sum*num_insert); %各个区间应插入的坐标数  
end

做完除数的结果非整数,用round四舍五入

5.线性插值

w = 1; 
for i=1:1:num_space
    x=[x_insert(w),x_insert(w+1)];
    y=[y_insert(w),y_insert(w+1)];
    c = (x_insert(w+1)-x_insert(w)) / (space_insert(i)+1);
    xi = x_insert(w):c:x_insert(w+1);
    yi = interp1(x, y, xi, 'linear');
    w = w+2;
    space_insert1 = [0, space_insert];
    x_auv = [x_auv(1:x_insert_co(i)+sum(space_insert1(1:i))-1), xi, x_auv(x_insert_co(i)+sum(space_insert1(1:i))+2:length(x_auv))];
    y_auv = [y_auv(1:x_insert_co(i)+sum(space_insert1(1:i))-1), yi, y_auv(x_insert_co(i)+sum(space_insert1(1:i))+2:length(y_auv))];
end

interp1()函数需要自行设置x轴插点的间隔和首尾点,在插值后得到的是插值区间中的点,需将这些坐标插入到原数组。

6.计算误差

x_error=[];
y_error=[];
for i=1:1:length(x_750) 
    DIST = sqrt((x_auv(i)-x_750(i))*(x_auv(i)-x_750(i))+(y_auv(i)-y_750(i))*(y_auv(i)-y_750(i)));
    DIST_1 = sqrt((x_auv(i)-x_750(i)-x_error(1))*(x_auv(i)-x_750(i)-x_error(1))+(y_auv(i)-y_750(i)-y_error(1))*(y_auv(i)-y_750(i)-y_error(1)));
end
MAX = max(DIST);
MIN = min(DIST);
MEAN = mean(DIST);

 

展开阅读全文

没有更多推荐了,返回首页