前言
2022年国赛B题是关于无人机定位的抽象模型,总体难度不大。接下来简单介绍一下第一题第一小问的程序实现,当时国赛仓促,写的比较简略,仅供参考。
背景介绍
无源定位
第一个关键词是无源定位,无源定位可以理解为需要通过计算才能求解出具体位置,位置不能直接测出。具备隐蔽性,一般不需要电磁波的发射。
无源定位有三种普遍的方法:交叉测向定位法,时差定位法和开普勒定位法,交叉测向法是通过多个基站接收信号,获得信号方位的角度,根据欧式几何来计算对应距离的一种方式,本题采用的方式与之类似。时差定位法和开普勒定位法,一个是根据信号传播的时差,一个是根据开普勒效应,发射信号和接收信号的物体具有相对速度时,接收到的信号的频率会发生变化。
交叉测向和纯方位定位
传统的交叉测向定位,是用两个基站接收运动物体的信号,接收到的信号是方位角,建立三角形,通过两个角,基站间的距离来计算基站和运动物体之间的距离。
本题中用到的纯方位定位,是被测无人机接收两架及两架以上基准无人机的信号,获得信号的角度差,通过位置分布关系和欧式几何计算距离。
问题重述
题目要求
问题重述
已知无人机编队的相对位置(即距离),位置有偏差的无人机接收三个基准无人机信号夹角,试建立一个模型,输入角度和相对位置信息可以计算出距离,确定有偏差无人机的位置。
建模思路
误差范围
题干中(本文章未载入题干的图片)无人机飞行的相对位置保持不变,因此可以确定最大误差范围:
设半径是R,圆周上9架无人机均匀分布,角度为40°。可以计算出最大偏差半径为Rsin20°。
同时任意圆周无人机任意两点之间的弦长也可以计算:2Rsin(n20°),(n为间隔数)。
定位模型
如何通过角度来计算呢?因为相对位置保持不变,基准无人机编号已知,可以判断相对位置,根据相对位置关系来判断某信号是某无人机发射的。
可以设置一个数组,储存位置编号,输入基准无人机的编号和待测无人机的编号,可以返回出三架基准无人机的相对位置关系(左,中,右)。本文代码为了简单,直接固定了基准无人机,判断过程也直接给出。当然,稍微修改一下就可以通用了;
具体计算公式是用余弦定理给出来的。未知量是接收无人机和三架发射无人机之间的距离,x,y,z三个变量。已知量是三个角度alpha,beta,gama(对应任意两条信号的夹角),以及基准无人机之间的相对距离L1,L2,L3。
分别建立3个方程,对应的是3个三角形和余弦公式(接收无人机和两个圆周上的无人机,接收无人机和圆周上的一个无人机和圆心的无人机)
3个变量,3个方程,可以求出解。
编程思路
偏差位置
设置偏差位置,需要先建立坐标系,建立以圆心的极坐标系,可以表示出基准位置的坐标。同时相对于标准位置的偏差圆,半径设置为0-Rsin20°的随机值,相对于标准位置的角度随机,即可生成偏差位置的坐标。
相对位置信息
储存编号信息,输入3架基准无人机的编号和接收无人机的编号可以返回相对位置关系。
校准集和非校准集
这里可以玩的花一些,设置校准集和未校准集,随机从校准集里面选择两个作为圆周上基准的无人机,随机从未校准集中选取接收无人机。属于炫技操作,可以尝试一下,我没写。
定位求解距离
编写定位模型的函数,输入角度值,和相对位置关系,用符号变量syms建立方程组,用solve求解可行解。
筛选可行解
因为solve求解出的是所有的解析解,包含复数解和不满足题目要求的解,因此需要排除。
求解基准位置
定位嘛,终极目标是计算出基准位置距离自己的距离和方向,即确定基准位置和现在的位置。这个我没写,可以练练手,求解一下基准位置相对于圆心无人机信号的夹角,以及距离。
代码
废话不多说,代码来啦
主函数question1_1.m
clc;clear;
%基准位置的点坐标,为了便于计算,圆半径R假设为1
angle = 2*pi/9.*(0:8);R = 1;
xi = R.*cos(angle);yi = R.*sin(angle);
%相对位置保持不变,可以确定对于接收无人机的其他无人机的相对位置关系
queue = zeros(9);sign = [1:9,1:9];
for i = 1:9
queue(i,:) = [sign(i+1:i+4),0,sign(i+5:i+8)];
end
%选取两个位置的无人机作为接收无人机
BaseSet = [1,2];NonBaseSet = 3:9;
fprintf('选择FY00,FY01,FY02作为基准发射无人机。\n');
fprintf('--------------------------------------- \n');
x0 = 0;y0 = 0;x1 = xi(1);y1 = yi(1);x2 = xi(2);y2 = yi(2);L = 2*R*sin(pi/9);
%对未校准的无人机设置随机偏差
%偏差半径
r = R*sin(pi/9);
%偏差坐标
% x = rand()*r*cos(rand()*2*pi)+xi(n);
% y = rand()*r*sin(rand()*2*pi)+yi(n);
%校准过程
for n = 3:9
fprintf(['校准FY0',num2str(n),'无人机:\n']);
xm = rand()*r*cos(rand()*2*pi)+xi(n);
ym = rand()*r*sin(rand()*2*pi)+yi(n);
%判断相对位置关系
queue1 = queue(n,:);n1 = find(queue1==1);n2 = find(queue1==2);
if((n1<5)&&(n2<5))
flag = [3,1,2];
elseif((n1>5)&&(n2>5))
flag = [1,2,3];
elseif((n1<5)&&(n2>5))
flag = [2,1,3];
elseif((n1>5)&&(n2<5))
flag = 0;
end
%计算角度
[beta1,beta2,beta3] = Calangle(xm,ym,x0,y0,x1,y1,x2,y2);
fprintf('beta1 = %f,beta2 = %f,beta3 = %f(角度制)\n', ...
rad2deg(beta1),rad2deg(beta2),rad2deg(beta3));
%计算与基准发射无人机的距离
%x对应与FY0,y对应FY1,z对应FY2
[x,y,Z] = resolve1(beta1,beta2,beta3,R,L,n);
fprintf('x = %fR,y = %fR,z= %fR\n',x,y,Z);
%计算接收无人机的极坐标
theta = resolve2(flag,x,y,R);p = x;
fprintf('theta = %f,p = %f(角度制)\n',rad2deg(theta),p);
%计算准确率
xx = p.*cos(theta);yy = p.*sin(theta);
unaccurate = mean([abs((xx-xm)/xm),abs((yy-ym)/ym)]);
fprintf(['准确率为: %.2f','%%','\n'],(1-unaccurate)*100);
fprintf(['FY0',num2str(n),'无人机已校准。\n']);
fprintf('--------------------------------------- \n');
end
生成夹角函数Calangle.m
function [beta1,beta2,beta3] = Calangle(xm,ym,x0,y0,x1,y1,x2,y2)
t1 = (y1-ym)/(x1-xm);t2 = (y2-ym)/(x2-xm);t3 = (ym-y0)/(xm-x0);
tan1 = abs((t1-t3)/(1+t1*t3));tan2 = abs((t2-t3)/(1+t2*t3));
tan3 = abs((t1-t2)/(1+t1*t2));
beta1 = atan(tan1);beta2 = atan(tan2);beta3 = atan(tan3);
计算与发射无人机的距离resolve1.m
function [x,y,z] = resolve1(beta1,beta2,beta3,R,L,n)
if(n>5)
l1 = 2*sin((10-n)*pi/9);
if(n>6)
l2 = 2*sin((11-n)*pi/9);
else
l2 = 2*sin((n-2)*pi/9);
end
else
l1 = 2*sin((n-1)*pi/9);
l2 = 2*sin((n-2)*pi/9);
end
syms x y z
eqns = [2*x*y*cos(beta1) == x^2+y^2-R^2,2*z*x*cos(beta2) == x^2+z^2-R^2, ...
2*z*y*cos(beta3) == z^2+y^2-L^2];
vars = [x,y,z];assume([x,y,z]>0);
sol = solve(eqns,vars,'IgnoreAnalyticConstraints',true,'ReturnConditions',true);
x = round(double(vpa(sol.x)),6);y = round(double(vpa(sol.y)),6);
z = round(double(vpa(sol.z)),6);
x = real(x);y = real(y);z = real(z);
col = [find(x<R*(1-sin(pi/9)));find(x>R*(1+sin(pi/9)))];
x(col) = [];y(col) = [];z(col) = [];
col = [find(y<(l1-R*sin(pi/9)));find(y>(l1+R*sin(pi/9)))];
x(col) = [];y(col) = [];z(col) = [];
col = [find(z<(l2-R*sin(pi/9)));find(z>(l2+R*sin(pi/9)))];
x(col) = [];y(col) = [];z(col) = [];
计算接收无人机相对与圆心极坐标的函数resolve2.m
function theta = resolve2(flag,x,y,R)
if(flag(1)>flag(2))
flag = -1;
else
flag = 1;
end
cosm = round((x.^2+R.^2-y.^2),6)/round((2.*x*R),6);
theta = flag.*acos(cosm);
运行结果
选择FY00,FY01,FY02作为基准发射无人机。
---------------------------------------
校准FY03无人机:
beta1 = 54.551826,beta2 = 71.317809,beta3 = 16.765983(角度制)
x = 1.044028R,y = 1.131464R,z= 0.482215R
theta = 67.181254,p = 1.044028(角度制)
准确率为: 100.00%
FY03无人机已校准。
---------------------------------------
校准FY04无人机:
beta1 = 36.564478,beta2 = 58.744293,beta3 = 22.179815(角度制)
x = 0.898470R,y = 1.566338R,z= 1.106549R
theta = 111.075167,p = 0.898470(角度制)
准确率为: 100.00%
FY04无人机已校准。
---------------------------------------
校准FY05无人机:
beta1 = 16.586498,beta2 = 40.803525,beta3 = 24.217027(角度制)
x = 0.703476R,y = 1.653833R,z= 1.420575R
theta = 151.828740,p = 0.703476(角度制)
准确率为: 100.00%
FY05无人机已校准。
---------------------------------------
校准FY06无人机:
beta1 = 2.562204,beta2 = 14.979231,beta3 = 17.541435(角度制)
x = 1.272246R,y = 2.269355R,z= 2.173401R
theta = -174.176871,p = 1.272246(角度制)
准确率为: 100.00%
FY06无人机已校准。
---------------------------------------
校准FY07无人机:
beta1 = 33.918911,beta2 = 14.002529,beta3 = 19.916382(角度制)
x = 1.006883R,y = 1.662772R,z= 1.946832R
theta = -111.896531,p = 1.006883(角度制)
准确率为: 100.00%
FY07无人机已校准。
---------------------------------------
校准FY08无人机:
beta1 = 48.476312,beta2 = 31.689534,beta3 = 16.786779(角度制)
x = 1.169586R,y = 1.258303R,z= 1.784202R
theta = -70.401922,p = 1.169586(角度制)
准确率为: 100.00%
FY08无人机已校准。
---------------------------------------
校准FY09无人机:
beta1 = 82.843083,beta2 = 57.542577,beta3 = 25.300506(角度制)
x = 0.915448R,y = 0.532339R,z= 1.126376R
theta = -31.883348,p = 0.915448(角度制)
准确率为: 100.00%
FY09无人机已校准。
---------------------------------------
B题其他问的思路浅析
还记得去年第一次了解建模的时候,从网络上搜索相关国赛思路太难了,基本上搜不出来。所以,来年了解数模的学弟学妹们或许会如同我一开始的迷茫,因此这里给出其他题目的思路。助力一下~
第一题第二问
第一问发射无人机都在基准位置,且编号已知,即相对关系已知;第二问的话,发射无人机的编号未知,所以涉及到怎样判断圆心无人机和圆周无人机相对位置关系的问题。(核心)
怎么判断,思路可太多了~可以先基准无人机之间定位,确定基准无人机之间的相对位置关系;或者用接收无人机和基准无人机定位,建立三角形求出唯一解。
确定需要几个发射无人机,可以确定相对位置,求出唯一解。
第一题第三问
第三问,所有的发射无人机位置都不基准,编号未规定。(除了圆心的无人机和圆周的一架无人机)
可以用暴力破解的方法,用不基准的无人机当做基准来依次给其他无人机校准,校准之后的无人机再对其他无人机校准...存在随机性,主要是吸收态:一旦某一个无人机基准了,就可以把其他的都校准,同时所有的无人机都处于基准位置,就不会调整了。
也可以用别的思路。比如说,先用已确定的两架无人机对一个无人机进行校准,然后再依次校准。
第二题
锥形等距编队的定位方式。首先第一题的编队位置不会出现三点共线的问题,锥形编队是存在三点共线的,所以只能讨论不共线的定位模型。
用中心的三角形3的顶点作为基准无人机,来校准最近的非共线的顶点,就又构造了3各三角形,依次校准,需要6次,而且定位模型都一样。文章来源:https://www.toymoban.com/news/detail-460144.html
结束
数学建模并不是很难,分析问题,建立模型,编写程序这些才是重要的能力,希望把数学建模当做是检验自己能力的测试,而不是定向研究套路取得高分的考试。最后,希望大家多了解了解看似枯燥其实特别精彩的数学和编程。瑞思拜~文章来源地址https://www.toymoban.com/news/detail-460144.html
到了这里,关于2022数模国赛B题无人机第一题第一小问的简单编程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!