2022国赛B题无人机纯方位无源定位:MATLAB代码实现与避坑指南

发布时间:2026/10/13 15:53:09
2022国赛B题无人机纯方位无源定位:MATLAB代码实现与避坑指南 简介这份资源是2022年全国大学生数学建模竞赛本科组B题的完整论文聚焦无人机纯方位无源定位问题适合备战数模竞赛的本科生及指导教师参考。论文获河北省一等奖采用MATLAB编程实现围绕圆形与锥形编队展开涵盖被动接收信号无人机的定位模型、发射信号无人机数量确定、初始位置偏差下的迭代调整方案等核心内容并借助余弦定理、三圆共点与枚举法完成求解。资源包共1个PDF文件大小约2.63MB内容为完整论文正文含摘要、问题重述、模型假设、符号说明及模型建立与求解全过程便于直接研读建模思路与MATLAB实现细节。目前已有8039人学习下载读者可从中获取赛题分析框架、定位模型推导、位置调整算法及论文写作范式适合作为数模竞赛训练与纯方位无源定位研究的参考材料。1. 从三组方位角反推坐标这套2022年国赛B题论文到底能跑出什么如果你手头只有几个角度值却要反推出平面上一个点的坐标而且这个点还在动你会怎么做2022年全国大学生数学建模竞赛本科组B题问的就是这件事——无人机纯方位无源定位。十架无人机组成圆形编队九架在圆周上一架在圆心其中几架发射信号其余被动接收方位信息然后靠这些角度把有偏差的无人机拉回理想位置。整套论文用MATLAB把定位模型、额外信号源数量确定、圆形与锥形编队的位置调整全部跑通了附带四份完整程序。适合正在备战数模竞赛、需要一套可复现的几何定位代码框架的人也适合想搞懂“三圆共点”怎么落到代码里的工程师。我拆完这套东西最大的感受是数学推导不算难难的是把角度输入、坐标反解、步长遍历这三步串成一条不出错的流水线。2. 定位模型的数学骨架余弦定理怎么变成可执行代码2.1 从三个方位角到二维坐标的反解逻辑论文的核心思路其实很直接把圆心无人机固定在原点圆周上第i架无人机的准确位置固定在x轴上这样整个编队的准确坐标就是一组已知量。当一架有偏差的无人机接收到来自三架已知位置无人机的方位信息时它和每架发射源之间就形成了一个夹角。三个夹角、三个已知发射源位置理论上就能唯一确定接收机的位置。具体推导分两步走。第一步利用余弦定理在三角形中反复迭代把接收机到三个发射源的距离解出来。第二步再用一次余弦定理求出接收机相对于x轴的极角最后转成直角坐标。论文里公式(1)到(8)就是完整过程核心是三个方程联立解三个未知边长然后再用边长反推角度。我实际跑附录一的时候发现MATLAB的符号求解在这里非常关键。因为方程里有平方项和余弦项混在一起手算很容易卡住但solve配合double能直接把数值解捞出来。下面这段代码就是论文附录一里求解当前位置坐标的核心部分我加了注释方便对照公式% 被动接收信号无人机定位模型的建立 % 输入三个方位角和发射源编号 alpha1 input(第一个角度); % 0k i 夹角 alpha2 input(第二个角度); % 0k j 夹角 alpha3 input(第三个角度); % j k i 夹角 FY0i input(发射信号无人机1); FY0j input(发射信号无人机2); r input(圆形编队半径); % 计算两架发射源之间的已知距离 a1 sqrt(2*r^2 - cosd(abs(FY0i-FY0j)*40)*2*r^2); % 符号求解三条未知边长 syms k0 a2 a3 eq1 (k0^2 a3^2 - r^2)/(2*k0*a3) - cosd(alpha1); eq2 (k0^2 a2^2 - r^2)/(2*k0*a2) - cosd(alpha2); eq3 (a2^2 a3^2 - a1^2)/(2*a2*a3) - cosd(alpha3); [X, Y, Z] solve(eq1, eq2, eq3, k0, a2, a3); % 取实数值并转换为直角坐标 K0 double(X); k0i acosd(1 - 2*cosd(alpha1)^2); k01 k0i - 40*abs(i-1); x real(K0*cosd(k01)); % 横坐标 y real(K0*sind(k01)); % 纵坐标这段代码里最容易被忽略的是k01的计算。论文里用了一个几何关系接收机相对于x轴的极角可以通过acosd(1-2*cosd(alpha1)^2)先算出一个中间量再减去发射源编号差乘以40度来修正。这个40度来自圆周上相邻无人机之间的夹角——360度除以9正好40度。如果你把半径r改成其他值这个角度不变因为它是编队结构决定的。参数方面r是圆形编队半径论文里问题一第三小问用的是100米但附录一里可以任意输入。alpha1、alpha2、alpha3分别是接收机与三架发射源连线之间的夹角单位是度。FY0i和FY0j是发射信号的无人机编号编号差决定了它们之间的圆心角。注意solve返回的符号解可能有多个分支必须用real取实部否则后续坐标计算会混入虚数导致结果完全跑偏。我第一次跑的时候就因为没取实部x坐标直接变成复数排查了半天。2.2 准确位置的确定三圆共点与轨迹交点定位模型还有另一半确定无人机“应该在哪里”。论文用了一个很漂亮的几何结论——一个动点到两个定点的夹角如果是定值那它的轨迹就是两段对称圆弧拼成的封闭曲线。夹角是钝角时轨迹像“眼睛”锐角时像“葫芦”。当有三架位置无偏差的无人机同时发射信号时接收机就会有三条这样的轨迹三条轨迹的交点就是它的准确位置。这个结论在代码里的体现是你不需要真的去画圆弧求交点而是直接用余弦定理把三条轨迹对应的角度关系写成方程联立求解。论文公式(9)到(14)就是干这个的。实际写代码时我一般会把三组“发射源-接收机”组合分别代入余弦定理得到三个关于距离的方程然后解出接收机到每个发射源的距离最后用极坐标转直角坐标。这里有个容易翻车的地方当接收机恰好位于某两个发射源连线的延长线上时夹角会退化成0度或180度余弦定理的分母变成零方程直接炸掉。论文在问题二里专门提到了这个情况——第二轮定位时4、7、9、11、13、14号无人机就是因为落在延长线上而无法定位。实际写代码时我建议在计算余弦值之前加一个判断% 防止延长线导致的除零错误 if abs(sind(alpha)) 1e-6 warning(接收机位于延长线上无法定位); continue; end这个判断在批量处理多架无人机时特别有用能避免程序中途崩溃。3. 额外信号源数量确定枚举56种情况的最小值搜索3.1 为什么一架额外信号源就够了论文问题一第二小问的结论是除了0号和1号之外只需要额外增加一架无人机发射信号就能实现有效定位。推导逻辑是这样的——如果只有0号和1号发射信号接收机只能收到一个方位信息它的可能位置是一条“葫芦”或“眼睛”轨迹无法唯一确定。但如果再增加一架发射源接收机就能收到三个方位信息0号、1号、额外那架三条轨迹交于一点位置就唯一了。这个结论的验证靠的是枚举。论文把除0号和1号之外的8架无人机所有可能的发射组合都列了出来总共56种情况8乘7然后对每一种情况计算三个方位角的准确值。当某架接收机实际收到的方位角与某个组合的准确值之差的平方和最小那个组合里的额外发射源就是最优选择。3.2 枚举法的MATLAB实现与参数调优附录二的代码就是干这件事的。它先遍历所有可能的发射源组合算出每个组合下三个方位角的准确值存成一个三维数组。然后再输入实际接收到的方位角遍历所有组合找平方和最小值。% 求出所有可能的发射源组合对应的方位角 FY00 0; FY0i 1; % 两个已知定点 r input(圆形编队半径); for FY0j 2:9 for FY0k 2:9 if FY0k FY0j continue; % 发射源不能重复 end % 计算三边长度 a1 sqrt(2*r^2 - cosd((FY0j-FY0i)*40)*2*r^2); a3 sqrt(2*r^2 - cosd((FY0k-FY0i)*40)*2*r^2); a2 sqrt(2*r^2 - cosd((FY0k-FY0j)*40)*2*r^2); % 用余弦定理求三个方位角 alpha1(FY0j,FY0k) acosd((r^2a3^2-r^2)/(2*r*a3)); alpha2(FY0j,FY0k) acosd((a3^2a2^2-a1^2)/(2*a3*a2)); alpha3(FY0j,FY0k) acosd((r^2a2^2-r^2)/(2*r*a2)); end end % 反解输入实际角度找最优额外发射源 beta1 input(第一个角度); beta2 input(第二个角度); beta3 input(第三个角度); FY0k input(接收信号的无人机编号); min_val 1000; mini 0; for i 2:9 if i FY0k continue; end m (beta1-alpha1(i,FY0k))^2 (beta2-alpha2(i,FY0k))^2 (beta3-alpha3(i,FY0k))^2; if m min_val min_val m; mini i; end end disp([额外发射源编号, num2str(mini)]);这段代码里alpha1、alpha2、alpha3三个矩阵的维度是9乘9但实际只用了2到9的行和列因为0号和1号是固定发射源。min_val初始设成1000是个保险值因为三个角度差的平方和最大不会超过3乘180的平方1000足够大。mini记录的是平方和最小对应的那架无人机编号。参数调优方面如果你把半径r从100改成10角度值不会变因为所有距离都按比例缩放了。但如果你改变编队结构——比如圆周上不是9架而是8架——那相邻夹角就从40度变成45度所有公式里的40都要替换。论文里没有涉及这种改动但实际工程中编队规模可能变化改的时候要全局替换。提示枚举法在56种情况下跑一次大概几毫秒但如果你要批量处理多架接收机建议把角度矩阵预先算好存成mat文件避免每次重复计算。4. 圆形与锥形编队的位置调整步长遍历与延长线陷阱4.1 圆形编队的0.01米步长遍历策略问题一第三小问要求给出位置调整方案。论文的思路是0号和1号已经在理想位置保持不动。2号无人机根据0号和1号的方位信息定位自己的实际位置然后以0.01米为步长向四周全方位遍历当与准确位置相差小于0.01米时就认为到达理想位置。之后2号加入“无偏差”集合用0、1、2三架去定位3号依次类推。附录三的代码实现了这个遍历过程。核心是一个while循环每次迭代检查当前位置与理想位置的距离如果大于阈值就继续搜索。% 圆形编队位置调整 FY00 0; FY01 1; njl 0.01; % 最小距离阈值 r 100; % 圆形编队半径 bzrow 100; % 准确位置的极径 bztheta [0 40 80 120 160 200 240 280 320]; % 准确位置的极角 FY0irow(2) input(FY02的初始位置(row):); FY0itheta(2) input(FY02的初始位置(theta):); jl 100; % 初始距离设大一点 while jl njl mjl 10000; for j 0:359 % 向四周遍历每次转1度 % 计算当前位置与理想位置的距离 % 如果距离小于当前最小值更新最优方向 end % 沿最优方向移动0.01米 % 更新jl为移动后的距离 end这段代码里bztheta是9架无人机在圆周上的准确极角从0度开始每隔40度一个。FY0irow和FY0itheta是2号无人机的初始极坐标需要手动输入。jl是当前距离初始设成100是为了保证第一次循环能进去。内层for j 0:359是全方位搜索每次转1度找距离最小的方向。找到最优方向后沿该方向移动0.01米然后重新计算距离。实际跑的时候如果初始偏差不大比如几米通常几十次迭代就能收敛。但如果初始偏差特别大比如几十米可能需要几百次。论文里没有给出具体的初始偏差值但根据问题描述“略有偏差”我估计在1到5米范围内。4.2 锥形编队的延长线问题与三轮定位方案问题二把圆形编队换成了锥形编队本质逻辑一样但多了一个坑当某架无人机位于三架已知位置无人机构成的三角形的边的延长线上时它只能接收到一个方向信息无法定位。论文的解决方案是分三轮。第一轮假设1号和5号位置无偏差用它们定位2号。具体做法是先把1号和2号作为发射源、5号作为接收机得到一个方向信息再把2号和5号作为发射源、1号作为接收机得到另一个方向信息这样在三角形1-2-5中两个角已知第三个角也就确定了2号的位置就能解出来。然后2号向四周遍历到准确位置。第二轮用1、2、5三架去定位其他无人机。但4、7、9、11、13、14号恰好落在三角形边的延长线上无法定位。第三轮选取2、6、8作为发射源剩下的未定位无人机都不在延长线上全部可以定位。这个三轮方案在代码里的实现需要维护一个“已定位”集合每轮结束后把新定位的无人机加进去下一轮用更大的集合去定位剩余的。我一般会用一个逻辑数组来标记located false(1, 15); % 15架无人机 located([1, 5]) true; % 初始已知 % 第一轮 located(2) true; % 第二轮 candidates [3, 6, 8, 10, 12, 15]; located(candidates) true; % 第三轮 remaining find(~located); % 用2、6、8去定位remaining这个逻辑数组的好处是每轮结束后自动更新不需要手动维护列表。find(~located)直接返回所有未定位的编号省去了逐个判断的麻烦。注意锥形编队的坐标计算和圆形不同。论文表3给出了锥形编队的理想位置x坐标从0到-100√3y坐标从100到-200间距是50√3和50。如果你要改锥形参数这些值都要重新推导。5. 避坑与排查跑这套代码时最容易翻车的五个地方5.1 角度输入顺序与编号对应不上现象输入三个角度后解出的坐标和预期完全不符偏差几十米甚至上百米。原因论文里三个角度alpha1、alpha2、alpha3分别对应“0号与接收机”、“0号与另一发射源”、“两发射源与接收机”的夹角顺序不能乱。如果输入时把alpha2和alpha3搞反余弦定理的方程就全错了。解决在输入之前先把三架无人机的编号写下来对照论文图2确认每个角对应的顶点。我一般会在代码里加一行打印把输入的编号和角度都显示出来方便核对。5.2 solve函数返回空解或复数解现象double(X)返回空数组或者带虚部的复数后续坐标计算报错。原因方程无解或者有多解时solve可能返回空或者符号解。常见于角度输入超出几何可行范围比如三个角度之和大于360度。解决先用real取实部再用isempty判断是否为空。如果为空检查角度是否合理——三个方位角之和应该等于360度减去三角形内角和不满足就说明输入有误。5.3 延长线导致的除零错误现象程序跑到某架无人机时突然报除零错误或者结果变成Inf。原因接收机恰好位于两个发射源连线的延长线上夹角为0度或180度余弦定理分母为零。解决在计算余弦值之前加判断如果abs(sind(alpha)) 1e-6就跳过这架无人机标记为“无法定位”。论文问题二里4、7、9、11、13、14号就是这种情况直接跳过等下一轮。5.4 步长遍历陷入死循环现象while循环跑了上万次还没退出距离一直在0.01米附近震荡。原因步长0.01米太小而搜索方向每次只转1度导致在最优方向附近来回跳动无法精确落到阈值内。解决把方向搜索的步长从1度改成0.5度或者把距离阈值从0.01放宽到0.05。论文里用0.01是因为调整时间不计实际工程中0.05米已经足够精确。5.5 锥形编队坐标计算用错公式现象锥形编队的理想位置算出来和论文表3对不上整体偏移或旋转。原因锥形编队的坐标系原点和圆形不同。圆形编队原点在圆心锥形编队原点在顶点。论文表3里第一架无人机在(0, 100)最后一架在(-100√3, -200)这个坐标系需要单独建立。解决重新推导锥形编队的坐标公式。直线上相邻两架间距相等相邻三架构成等边三角形所以x方向间距是50√3y方向间距是50。按这个规律逐行计算不要直接套用圆形的公式。6. 进阶技巧把四份MATLAB程序串成一条自动化流水线四份附录程序单独跑都能出结果但实际用的时候我习惯把它们串成一条流水线先读入所有无人机的初始位置然后自动判断哪些需要定位、哪些需要调整最后输出每架无人机的调整方案。具体做法是写一个主脚本把附录一、二、三、四封装成函数用结构体传递参数。比如% 主脚本无人机编队定位与调整流水线 config.r 100; % 编队半径 config.njl 0.01; % 调整阈值 config.formation circle; % 编队类型 % 第一步读入初始位置 init_pos load(initial_positions.mat); % 第二步确定额外发射源 extra_source find_extra_source(config, init_pos); % 第三步逐架定位并调整 for i 2:9 [pos, adjusted] locate_and_adjust(config, init_pos, extra_source, i); if adjusted fprintf(无人机%d已调整到理想位置\n, i); else fprintf(无人机%d无法定位跳过\n, i); end end这个流水线的好处是你只需要改config里的参数就能切换圆形和锥形编队不用手动改每份代码。find_extra_source函数内部就是附录二的枚举逻辑locate_and_adjust内部是附录一的定位加附录三的遍历。验证方法也很直接跑完之后检查每架无人机的最终位置与理想位置的偏差是否都小于0.01米。如果某架偏差大于阈值说明它在延长线上被跳过了需要换一组发射源重新定位。还有一个技巧是可视化。MATLAB的plot可以把调整前后的位置画在一起一眼就能看出哪些无人机移动了、哪些没动。我一般会用红色圆圈标初始位置绿色十字标理想位置蓝色箭头表示调整方向。这样即使不看数字也能判断方案是否合理。从那以后我每次跑这类几何定位代码都强制先跑一遍延长线判断把无法定位的无人机单独列出来再决定用哪几架做发射源。这个习惯帮我省了很多次调试时间。希望帮到你。本文还有配套的精品资源点击获取

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询