syms R x y Ox Oy R1 rmax
theta = [0:2*pi/9:2*pi];
x_paint = 100*cos(theta);
y_paint = 100*sin(theta);
plot(x_paint,y_paint)
hold on
n = 20;%迭代次数
signal1Y = 0;%记录额外一信号仅有一解的次数
signal2Y = 0;%记录额外二信号仅有一解的次数
signalgY = 0;%需要大于两个额外信号的次数
point1 = zeros(10,2);%记录找到的点集,用以判断相似性
point2 = zeros(10,2);
for k=1:n
syms R x y Ox Oy R1 rmax
count1 = 0; %记录额外一信号时求得解个数
count2 = 0;%记录额外二信号时求得解个数
R = 100 ;%假设理想圆半径为100m
rmax =10 ;%最大偏移量
%随机取发生偏移的点
n1 = randi([2,5]);%只考虑上方偏移,下方同理,
%在允许范围内取一偏移位置
alpha1 = 2*pi*rand();
r1 = rmax*rand(); %偏移位置距离原完美点距离
xn1 = R*cos((2*pi/9)*(n1-1));%偏移前所在完美位置
yn1 = R*sin((2*pi/9)*(n1-1));
t = (0:pi/100:2*pi);
xt = xn1 + rmax*cos(t);
yt = yn1 +rmax*sin(t);
plot(x1,y1);
hold on
%偏移后的坐标
x1 = xn1+r1*cos(alpha1);
y1 = yn1+r1*sin(alpha1);
scatter(x1,y1);
hold on
%根据偏移坐标与F0,F1确定∠F0FkF1
%即确定一圆,该圆可认为由F0,F1,与∠F0FkF1得出
F1 = Ox^2+Oy^2 - R1^2;
F2 = (Ox-R)^2 + Oy^2 - R1^2;
F3 = (Ox - x1)^2+(Oy - y1)^2 - R1^2;
F=[F1;F2;F3];
[Ox,Oy,R1] = solve(F,[Ox;Oy;R1]);%解搜索弧圆心,搜索弧半径
Ox = double(Ox(1));Oy = double(Oy(1));R1 = abs(double(R1(1)));%有俩一样的解
%绘制偏离范围圆与搜索弧相交
thetan = [0:pi/100:2*pi];
x11 = xn1+rmax*cos(thetan);
y11 = yn1+rmax*sin(thetan);
plot(x11,y11);
hold on
x22 = Ox+R1*cos(thetan);
y22 = Oy+R1*sin(thetan);
plot(x22,y22);
hold on
%求该圆与偏离圆交点,得到角度,确定搜索弧
F1 = (x - xn1)^2 + (y - yn1)^2 - rmax^2; %偏离范围圆
F2 = (x - Ox)^2 + (y - Oy)^2 - R1^2;
[x2,y2] = solve([F1;F2],[x,y]);
x2 = double(x2); y2 = double(y2); %搜索弧两端点
x_d = xn1 - Ox;
y_d = yn1 - Oy;
dir_0 = [x_d,y_d];%搜索弧圆心圆心指向原完美点方向向量,其为搜索范围的中心
dir_theta0 = atan(y_d/x_d);%搜索弧的中心角
if dir_theta0<0
dir_theta0 = dir_theta0+pi; %转换到钝角
elseif dir_theta0>0 && x_d<0
dir_theta0 = dir_theta0+pi;
end
%根据中心角上下偏离的角
dir_theta = acos(dot(dir_0/norm(dir_0),[x2(1)-Ox,y2(1)-Oy]/norm([x2(1)-Ox,y2(1)-Oy])));
%先随机取一个额外发射点
n2 = randi([2,9]);
while n2 == n1 %保证与n1不同
n2 = randi([2,9]);
end
dir_1 = [R*cos((2*pi/9)*(n2-1))-x1,R*sin((2*pi/9)*(n2-1))-y1];%偏移点指向发射点的方向向量
theta1 = acos(dot(dir_1/norm(dir_1),[-x1,-y1]/norm([-x1,-y1]))); %额外测量的一个夹角,与遍历搜索弧的方向夹角保持为此
if R*cos((2*pi/9)*(n2-1)) - x1 >0%确定搜寻射线方向(射线需要方向)
dir_s = 1;
else
dir_s = -1;
end
delta = [dir_theta0-dir_theta:pi/10000:dir_theta0+dir_theta];%在搜索弧上遍历
z_deltax = Ox+R1*cos(delta);
z_deltay = Oy+R1*sin(delta);
plot(z_deltax,z_deltay); %绘制搜索弧
hold on
count1 = 0;
for theta = delta%根据方向,选择需要判断左侧的点或右侧的点
x_theta = Ox+R1*cos(theta);y_theta = Oy+R1*sin(theta);
if dir_s>0
for i = 2:9
xi = R*cos(2*pi/9*(i-1));yi = R*sin(2*pi/9*(i-1));
if xi>=x_theta && i ~= n1 %若方向为正 该发射源需要在搜索点右侧
%if (Oy+R1*sin(theta)-y_s1)/(Ox+R1*cos(theta)-x_s1) - (R*sin(2*pi/9*i) - y_s1)/(R*cos(2*pi/9*i) - x_s1)<10e-4 %三点共线
if abs(acos(dot([x_theta,y_theta]/norm([x_theta,y_theta]),[x_theta-xi,y_theta-yi]/norm([x_theta-xi,y_theta-yi]))) - theta1) <10e-4 %发射点与当前遍历点满足搜索条件
if count1==0
point1(count1+1,:) =[x_theta,y_theta];
count1 = count1+1;
else
if abs(point1(count1,1) - x_theta)<1
continue
else
point1(count1+1,:)=[x_theta,y_theta];
count1 = count1+1;
end
end
end
end
end
elseif dir_s<0
for i = 2:9
xi = R*cos(2*pi/9*(i-1));yi = R*sin(2*pi/9*(i-1));
if xi<=x_theta && i ~= n1
%if (Oy+R1*sin(theta)-y_s1)/(Ox+R1*cos(theta)-x_s1) - (R*sin(2*pi/9*i) - y_s1)/(R*cos(2*pi/9*i) - x_s1)<10e-4
if abs(acos(dot([x_theta,y_theta]/norm([x_theta,y_theta]),[x_theta-xi,y_theta-yi]/norm([x_theta-xi,y_theta-yi]))) - theta1) <10e-4 %发射点与当前遍历点满足搜索条件
if count1==0
point1(count1+1,:) =[x_theta,y_theta];
count1 = count1+1;
elseif abs(point1(count1,1) - x_theta)<1
continue
else
point1(count1+1,:)=[x_theta,y_theta];
count1 = count1+1;
end
end
end
end
end
end
%只存在一个额外信号时,有几种情况
if count1 == 1
signal1Y = signal1Y+1; %只有一解 一个额外信号可定位
elseif count1 == 0
signalgY =signalgY+1;
elseif count1>1 %不能定位,再加1个额外信号
n3 = randi([2,9]);
while n3 == n1 || n3 == n2 %保证与n1,n2不同
n3 = randi([2,9]);
end
dir_2 = [R*cos((2*pi/9)*(n3-1))-x1,R*sin((2*pi/9)*(n3-1))-y1];%偏移点指向发射点的方向向量
theta2 = acos(dot(dir_2/norm(dir_2),[-x1,-y1]/norm([-x1,-y1]))); %额外测量的一个夹角,与遍历搜索弧的方向夹角保持为此
if R*cos((2*pi/9)*(n3-1)) - x1 >0%确定搜寻射线方向(射线需要方向)
dir_s2 = 1;
else
dir_s2 = -1;
end
delta = [dir_theta0-dir_theta:pi/10000:dir_theta0+dir_theta];%在搜索弧上遍历
count2 = 0; %记录这一次有几种情况
for theta = delta%根据方向,选择需要判断左侧的点或右侧的点,如果共线说明找到一种情况
x_theta = Ox+R1*cos(theta);y_theta = Oy+R1*sin(theta);
if dir_s>0
for i = 2:9
xi = R*cos(2*pi/9*(i-1));yi = R*sin(2*pi/9*(i-1));
if xi>=x_theta && i ~= n1
if abs(acos(dot([x_theta,y_theta]/norm([x_theta,y_theta]),[x_theta-xi,y_theta-yi]/norm([x_theta-xi,y_theta-yi]))) - theta1) <10e-4%第一个发射点与当前遍历点满足搜索条件
if dir_s2>0
for j = 2:9
xj = R*cos(2*pi/9*(j-1));yj = R*sin(2*pi/9*(j-1));
if xj>=x_theta && j ~= n1
if abs(acos(dot([x_theta,y_theta]/norm([x_theta,y_theta]),[x_theta-xj,y_theta-yj]/norm([x_theta-xj,y_theta-yj]))) - theta2 )<10e-4
if count2==0
point2(count2+1,:) =[x_theta,y_theta];
count2 = count2+1;
elseif a
2022数模国赛B题-无人机纯方位无源定位matlab代码实现
需积分: 0 190 浏览量
更新于2023-07-31
28
收藏 144KB ZIP 举报
内容概要:
用于求解2022数模国赛B题——无人机纯方位无源定位的matlab代码,以及进行说明的部分图片。
代码:所有的 源程序代码
GetRound.m 与 GetPoint.m 为问题 1.1 中模型进行圆的求解与定位程序,其中
GetRound.m 是用于求解两圆圆心坐标的程序,GetPoint.m 是求两圆交点从而定位的程
序。
imitate.m 是问题 1.2 中所用到的源程序,该程序执行的结果图置于图.zip 中。
move.m 及 GetBetween.m 和 GetBetween2.m 和 GetBetween3.m 为解决问题 1.3 所用
的源程序。其中 GetBetween.m GetBetween2.m GetBetween3.m 是用于无人机方向定位
的 m 文件函数,move.m 是无人机到达理想位置及理想位置拟合圆检验的程序
图:上述问题中程序跑出的中间图及结果图。
图片 1 为问题 1.2 中进行求解的展示图
图片 2 为问题 1.3 中选定圆周上发射信号的 02 05 08 无人机。

西山点子王
- 粉丝: 5
- 资源: 6
最新资源
- 电子商务_网上商城管理系统_用户身份验证_便捷购物_1740825436.zip
- 商城管理_System_SCUM_1740825333.zip
- 智能公交系统电子站牌设计_STM32_微信小程序_毕业设_1740825532.zip
- 全国地图 省GeoJson 市GeoJson
- MATLAB实现领航追随法与人工势场法融合的车辆编队避障控制策略,MATLAB领航追随法融合人工势场法的车辆编队避障控制策略实现研究,MATLAB基于领航追随法的车辆编队控制,领航追随者与人工势场法的
- 迪恩在线教育素材培训课程网站源码 discuz内核完整资料带数据
- 基于手性光学效应的连续介质束缚态研究:从三维图谱到Q因子图的所见即所得超表面复现分析,基于Comsol模拟:三次谐波效应下的本征手性BIC超表面研究-远场偏振图、手性透射曲线与光学响应的可见性分析
- 和材料性能分析** COMSOL 培训视频,深入解析多物理场仿真技术与应用 **深入解析COMSOL多物理场仿真技术与应用:从结构力学到化学反应的全面分析**,界面仿真和流控模拟 COMSO
- 找高手:应该如何训练工程造价的大模型?
- NOIP2009年提高组NOI Linux和Cena测评环境与数据
- 手把手项目实践:用Labview制作一个电子秤的485上位程序
- golang画图库演示程序源码
- IntelCacheAccelerationSoftware,傲腾加速软件
- 昆仑通态MCGS与欧姆龙E5CC温控器通讯:PID控制及输出启停功能实现,欧姆龙E5CC温控器与昆仑通态MCGS的PID通讯方式及输出启停(KUNL-1),昆仑通态MCGS与欧姆龙E5CC温控器通讯+
- 补码计算与进制转码学习
- 《从0到1:手把手教你OpenCV下载安装秘籍》