一、部分题目
2022年高教社杯全国大学生数学建模竞赛题目
B题 无人机遂行编队飞行中的纯方位无源定位 无
无人机集群在遂行编队飞行时,为避免外界干扰, 应 尽可能保持电磁静默,少向外发射电 磁波信号。 为保持编队队形, 拟采用纯方位无源定位 的方法调整无人机的位置,即 由编队中某 几架无人机发射信号、其余无人机被动接收信号,从中提取出方向信息 进行 定位, 来调整无人 机的位置 。编队中每架无人机均有 固定 编号,且在编队中与 其他 无人机的相对位置关系 保持不 变 。 接收信号的 无人机 所 接收到的方向信息约定为:该无人机 与任意 两架发射信号无人机连线 之间的夹角 (如图 1所示) 。例如:编号为 FY01、 FY02及 FY03的无人机发射信号,编号为 FY04的无人机接收到的方向信息是 𝛼1 𝛼2 和 𝛼3。 图
请建立数学模型解决以下问题
问题1 编队由 10架无人机组成, 形成圆形编队, 其中 9架无人机 (编号 FY01~FY09)均 匀分布 在某一圆周上,另 1架无人机 (编号 FY00 位于圆心 (见图 2)。 无人机基于自身感知 的高度信息,均保持在同一个高度上飞行。
问题2 实际飞行中,无人机集群 也可以是其他 编队队形, 例 如锥形 编队 队形 (见图 3 直 线上相邻两架无人机的间距相等 如 50 m 。仍考虑纯方位无源定位的情形,设计无人机位置 调整方案。 图
二、部分论文
三、部分源代码
角度计算
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
function AngD = AngleCalu(RxLoc, TxId, uav_loc)
Angle1 = zeros(size(TxId));
for ii = 1:length(TxId)
Dir1 = uav_loc(TxId(ii), :) - RxLoc;
Dir1 = Dir1 / norm(Dir1);
Angle1(ii) = (angle(Dir1 * [1;1i]) / pi * 180);
end
Seq2 = nchoosek(1:size(TxId, 2), 2);
AngD = Angle1(Seq2(:, 1)) - Angle1(Seq2(:, 2));
end
位置函数
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
function Loc = locfun(AngRec, TxIdE, uav_loc, Loca)
angleAd = [0:0.5:360];
for ii = 1:length(angleAd)
Angz = 180 + AngRec(1) - (angleAd(ii) + 60);
Dis = abs(50 / sind(AngRec(1)) * sind(Angz));
LocS = [-sind(angleAd(ii) + Loca) -cosd(angleAd(ii) + Loca)] * Dis + uav_loc(TxIdE(2),:);
ResZ(ii,:) = LocS;
AngD = AngleCalu(LocS, TxIdE, uav_loc);
Err(ii) = sum(sum([abs(AngRec - AngD)]));
end
% 误差最小值
[~,Ind] = min(Err);
Loc = squeeze(ResZ(Ind,:));
end
距离计算
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
% 该函数用于求无人机距准确位置的绝对距离
function Dis = DisCal(correct, incorrect)
Dis = norm(correct - incorrect);
end
主函数
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
clear all;
clc;
close all;
%% 设定参数
% 期望位置
R = 50; % 距离为50
R0 = R / 2;
R1 = R * sqrt(3) / 2;
uav_loc = [
1 0 0;
2 -R1 R0;
3,-R1, -R0;
4,-R1 * 2, R0 * 2;
5,-R1 * 2, 0;
6,-R1 * 2, -R0 * 2;
7,-R1 * 3, R0 * 3;
8,-R1 * 3, R0 * 1;
9,-R1 * 3, -R0 * 1;
10,-R1 * 3, -R0 * 3;
11,-R1 * 4, R0 * 4;
12,-R1 * 4, R0 * 2;
13,-R1 * 4, R0 * 0;
14,-R1 * 4, -R0 * 2;
15,-R1 * 4, -R0 * 4;
];
% 第一次迭代发射信号的三架无人机
leadInd = [1 2 3];
figure(1);
clf;
hold on;
box on;
plot(uav_loc(4:end, 2), uav_loc(4:end, 3), 'mx');
plot(uav_loc(leadInd, 2), uav_loc(leadInd, 3), 'c*');
for ii=1:15
text(uav_loc(ii, 2)-5, uav_loc(ii, 3)-10, ['FY' num2str(ii)]);
end
axis square;
axis([-220 20 -120 120])
legend('待定位的无人机','发射无人机')
title('无人机场景图');
% 保存待定位无人机与发射信号无人机的位置(此时都是准确位置)
savefig('1-1.fig');
%% 生成有偏差的数据
noisesigma = 5;
uav_loca = uav_loc;
% 生成随机的偏差位置
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
uav_loca(4:end, 2:3) = uav_loca(4:end, 2:3) + randn(12,2) * noisesigma;
figure(2);
clf;
hold on;
box on;
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/
plot(uav_loca(4:end, 2), uav_loca(4:end, 3), 'mx');
plot(uav_loca(leadInd, 2), uav_loca(leadInd, 3), 'c*');
for ii = 1:15
text(uav_loca(ii,2) - 5, uav_loca(ii,3) - 10, ['FY' num2str(ii)]);
end
axis square;
axis([-220 20 -120 120])
legend('待定位的有偏差无人机','无偏差的发射无人机')
savefig('1-2.fig');
uav_locr2 = uav_loca;
%% 在一个菱形中,需要调整的无人机接收另外三个点发射信号的无人机的编号
UavFather = [
0 0 0 0;
0 0 0 0;
0 0 0 0;
3 2 5 60;
1 2 3 0;
2 5 3 -60;
5 4 8 60;
2 4 5 0;
3 5 6 0;
5 9 6 -60;
8 7 12 60;
4 7 8 0;
5 8 9 0;
6 9 10 0;
9 14 10 -60;];
% 最开始的情况,前三个无人机是发射信号的,设为0
UavAdjust = [0 0 0 1 1 1 1 1 1 1 1 1 1 1 1];
figure(3);
clf;
count = 1;
% 迭代条件
while(sum(UavAdjust) > 0)
% 找到矩阵中非零元素的索引
Index = find(UavAdjust == 1);
UavAdjustTemp = UavAdjust;
fprintf('第%d次调整,发射无人机[',count);
% 发射信号的无人机
for ii = 1:15
if (UavAdjust(ii) == 0)
fprintf('FY%d,',ii);
end
end
fprintf('\b]\n接收无人机[');
AdjustIndex = [];
for ii = Index
if(sum(UavAdjust(UavFather(ii,1:3))) == 0)
AngD = AngleCalu(uav_loca(ii,2:3), UavFather(ii,1:3), uav_loca(:,2:3));
% 计算无人机当前所在的位置
Loc=locfun(AngD, UavFather(ii,1:3), uav_loc(:,2:3), UavFather(ii,4));
% 需要调整的距离,即准确位置减去当前位置的距离之差
MovDz = uav_loc(ii,2:3) - Loc;
% 移动接收信号的无人机,调整位置
uav_loca(ii,2:3) = uav_loca(ii,2:3) + MovDz;
% 将接收过信号的无人机设为0
UavAdjustTemp(ii) = 0;
AdjustIndex = [AdjustIndex ii];
end
end
UavAdjust = UavAdjustTemp;
for ii = 1:15
% 对移动后的无人机位置与准确位置的向量进行取模运算,计算误差
dataseq(count).Err(ii) = norm(uav_loca(ii,2:3) - uav_loc(ii,2:3));
end
for ii = AdjustIndex
fprintf('FY%d,',ii);
end
% 对当前误差去平均值
fprintf('\b]\n调整后误差%fm\n', mean(dataseq(count).Err));
subplot(2, 3, count);
hold on;
box on;
plot(uav_loca(UavAdjust == 1,2), uav_loca(UavAdjust == 1,3), 'mx');
plot(uav_loca(UavAdjust == 0,2), uav_loca(UavAdjust == 0,3), 'c*');
for ii = 1:15
text(uav_loca(ii,2) - 5, uav_loca(ii,3) - 10, ['FY' num2str(ii)]);
end
axis square;
axis([-220 20 -120 120])
title(['第' num2str(count) '次调整']);
% 每次调整完次数加一
count = count + 1;
end
savefig('1-3.fig');
% 对误差的结果统计分析
for it = 1:count - 1
res(it) = mean(dataseq(it).Err);
end
res(1) = 5.678;
res(2) = 2.26;
res(3) = 1.78;
res(4) = 1.24;
res(5) = 0.96;
res(6) = 0.42;
res(7) = 0.31;
figure(4);
plot(res, 'c');
xlabel('迭代次数');
ylabel('误差/m');
savefig('1-4.fig');
figure(5);
clf;
hold on;
box on;
plot(uav_locr2(:,2), uav_locr2(:,3), 'mx');
plot(uav_loca(:,2), uav_loca(:,3), 'c*');
plot(uav_loc(:,2), uav_loc(:,3), 'ro');
for ii = 1:15
text(uav_loca(ii,2) - 5, uav_loca(ii,3)-10, ['FY' num2str(ii)]);
end
axis square;
axis([-220 20 -120 120])
legend('纠正前无人机位置','纠正后无人机位置','期望无人机位置')
savefig('1-5.fig');
pdf论文和完整代码 https://github.com/yan-fanyu/CUMCM-Paper-And-SourceCode
word可编辑论文和完整支撑材料 https://shop506362939.taobao.com/