ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

纯方位无源定位原理:三角度如何唯一确定二维位置

纯方位无源定位原理:三角度如何唯一确定二维位置

简介:本资源为2022年全国大学生数学建模竞赛本科组B题原创获奖论文,面向数学建模参赛学生、MATLAB初学者及无人机定位方向研究者,聚焦纯方位无源定位这一抗干扰编队控制关键技术。全文系统构建圆形与锥形两种编队下的定位模型:基于二维直角坐标系与余弦定理推导被动接收无人机的实际位置与理想位置;通过“三圆共点”原理论证至少三路方位信息方可唯一解算,并给出发射机数量优化方案;结合步长遍历与迭代调整策略实现偏差位置的高精度校正。资源为1个2.63MB的PDF文件,内容完整覆盖问题重述、假设、符号说明、模型建立、MATLAB实现逻辑及关键词总结,含详细公式推导、几何轨迹分析(如“葫芦形”“眼睛形”运动轨迹)与多轮定位流程图示。目前已有8040人学习下载,是理解无源定位数学本质、掌握建模-编程-验证闭环的优质赛题复盘材料。

1. 纯方位无源定位:为什么三架发射机就能唯一确定一架接收机的位置,而两架却会陷入“葫芦”与“眼睛”的歧义黑匣子?

你手头有一架无人机,它没装GPS,不发信号,只靠被动接收——听三架队友发来的纯角度信息(不是距离,不是时间差,就只是“目标在你正北偏东23.7°方向”这种单维指向),就能算出自己此刻在二维平面上的精确坐标。更反直觉的是:只要这三架发射机位置绝对准确,哪怕你自己的初始位置偏差几十米、姿态歪斜、传感器有噪声,这个解依然存在、唯一、可收敛。但若只给两个角度?恭喜,你立刻掉进几何学的“多值陷阱”:解集不再是点,而是一段圆弧——锐角时是“葫芦”,钝角时是“眼睛”,你永远不知道自己站在哪一段弧上。这不是计算精度问题,是底层数学结构决定的自由度缺失。2022年全国大学生数学建模竞赛B题正是用这套逻辑,把十架无人机编成一个严丝合缝的圆形队形:圆心1架+圆周9架,所有调整全靠“听角度、算交点、微调步长”。它不依赖任何外部基站、不暴露自身电磁特征、不消耗额外带宽——这才是军用/民用集群在强干扰或低可观测场景下真正能落地的定位范式。而这份获奖论文最硬核的价值,不在结论本身,而在它用MATLAB把“三圆共点”从教科书定理,拆解成了可调试、可验证、可复现的数值求解流水线:从余弦定理推导的符号方程组,到枚举56种发射组合的偏差平方和比对,再到0.01米步长的极坐标遍历搜索——每一步都踩在几何约束与数值鲁棒性的临界点上。搞懂它,你就看穿了无源定位的“心脏起搏器”是怎么跳动的。

2. 三圆共点:从几何轨迹到代数求解,为什么“葫芦”与“眼睛”必须被三个交点刺穿?

2.1 单角度轨迹的本质:不是误差,而是几何自由度的必然投影

当一架接收机只收到一个发射机对(比如FY00和FY01)的方向角α₁,它的可能位置绝非一个模糊区域,而是一条严格定义的圆弧。这个结论常被误读为“测量不准导致的扩散”,实则不然——它是欧氏几何中“定弦对定角”的直接推论:给定两点A、B,所有满足∠APB = α的点P的集合,必落在以AB为弦、圆周角为α的两个互补圆弧上。关键在于:α是锐角还是钝角,决定了圆弧的形态。
我们用MATLAB符号引擎还原其代数本质。设FY00在原点(0,0),FY01在(r,0),接收机P坐标为(x,y),则向量PA = (-x,-y),PB = (r-x,-y)。夹角α₁满足:

cos_alpha1 = dot(PA,PB) / (norm(PA)*norm(PB)); % 即:cosα₁ = [x(x-r)+y²] / sqrt(x²+y²) * sqrt((x-r)²+y²)

两边平方并整理(过程略去繁复代数,MATLABsimplify可自动完成),最终得到标准圆方程:

% 锐角α₁轨迹(葫芦): (x - r/2)^2 + (y - r/(2*tan(alpha1)))^2 = (r/(2*sin(alpha1)))^2; % 钝角α₁轨迹(眼睛): (x - r/2)^2 + (y + r/(2*tan(180-alpha1)))^2 = (r/(2*sin(180-alpha1)))^2;

提示:tan(180-α)与tan(α)符号相反,sin(180-α)=sin(α),故两圆圆心纵坐标互为相反数,半径相同——这正是“上下对称”的数学根源。MATLAB中用fimplicit绘制这两条弧,你会发现:无论α₁是30°还是150°,轨迹都是完美圆弧,毫无“模糊带”。

2.2 双角度叠加:为什么交点从无穷多变成最多4个?

当第二组发射机(如FY00和FY02)提供α₂,其轨迹是另一对圆弧。两组轨迹相交,即解联立方程:

% 轨迹1(FY00-FY01): (x-a1)^2 + (y-b1)^2 = R1^2 % 轨迹2(FY00-FY02): (x-a2)^2 + (y-b2)^2 = R2^2 % 相减得直线方程:2(a2-a1)x + 2(b2-b1)y = (a2²+b2²-R2²) - (a1²+b1²-R1²)

这条直线与任一圆弧相交,最多产生2个实数解。因此双角度系统理论上最多有4个交点(每条弧与直线交于2点)。但在实际编队中,由于无人机被约束在有限空域内,且初始偏差较小,通常只有2个物理可行解——一个在编队内侧,一个在编队外侧。这就是“歧义性”的来源:系统无法仅凭角度区分你是在圆内还是圆外。论文中表2的枚举数据(如FY02接收FY00/FY01/FY03信号时α₁=0°,α₂=0°,α₃=70°)正是为了量化这种歧义:当三个角度偏差的平方和最小时,对应的那个第三发射机,就是能将歧义点压缩到唯一解的关键“锚点”。

2.3 三圆共点:唯一性如何被代数方程组强制锁定?

引入第三组发射机(如FY01和FY02)的α₃,意味着增加第三个圆方程。此时系统变为:

% 方程1: (x-a1)^2 + (y-b1)^2 = R1^2 % 方程2: (x-a2)^2 + (y-b2)^2 = R2^2 % 方程3: (x-a3)^2 + (y-b3)^2 = R3^2 % 两两相减得两条直线:L12, L13 % 解L12与L13的交点 → 唯一解(x,y)

这正是论文5.1.1节的核心:用余弦定理将角度α₁,α₂,α₃转化为边长k₀,a₂,a₃的约束,再通过符号求解solve(eq1,eq2,eq3,k0,a2,a3)得到唯一实数解。MATLAB代码中K0=double(X)的强制类型转换,恰恰暴露了数值稳定性挑战——当三点近似共线时,R1,R2,R3的微小扰动会导致交点剧烈漂移。这也是为什么论文在问题二中强调“避免处于三角形边的延长线上”:此时α₃≈0°或180°,sin(α₃)→0,导致圆半径R3=r/(2*sin(α₃))→∞,轨迹退化为直线,三圆不再共点。

2.4 避坑:纯方位定位中那些让MATLAB报错、结果发散的致命细节

  • 现象:solve()返回空解或复数,double(X)报错“无法将符号对象转换为 double”。
    原因:输入角度α₁,α₂,α₃违反三角形不等式(如α₁+α₂+α₃ > 180°),或发射机坐标未归一化导致a1=sqrt(...)计算出虚数。
    解决:在MATLAB中加入预检:if alpha1+alpha2+alpha3 > 180 || alpha1<0 || alpha2<0 || alpha3<0, error('角度非法'); end;计算边长前用real(sqrt(...))强制取实部。

  • 现象:位置调整时,无人机在理想位置附近“绕圈震荡”,步长0.01m迭代百次仍不收敛。
    原因:极坐标遍历中j=0:359步进过大(1°≈1.75m@100m半径),且未考虑角度周期性(360°与0°等价)。
    解决:改用theta = linspace(0, 2*pi, 3600)提供0.1°分辨率;比较位置时用欧氏距离sqrt((x-x0)^2+(y-y0)^2)而非角度差。

  • 现象:锥形编队中,按论文表3输入坐标后,alpha3计算结果为NaN。
    原因:表3中部分坐标(如-100*sqrt(3),200)与FY00(0,0)、FY01(100,0)构成的三角形边长a1过大,acosd((a2^2+a3^2-a1^2)/(2*a2*a3))中分子绝对值超过分母,反余弦域外。
    解决:在计算前加保护val = (a2^2+a3^2-a1^2)/(2*a2*a3); val = max(-1, min(1, val)); alpha3 = acosd(val);

  • 现象:枚举56种组合时,alpha1(FY0j,FY0k)矩阵出现Inf或-Inf。
    原因:当FY0j与FY0k编号差为5(即直径两端),cosd((FY0k-FY0j)*40)=cosd(200°)=cosd(-160°)≈ -0.94,导致a1=sqrt(2*r^2 - (-0.94)*2*r^2)=sqrt(3.88*r^2),但后续acosd((r^2+a3^2-r^2)/(2*r*a3))中若a3极小(如FY0k紧邻FY0i),分母趋近零。
    解决:在a3=sqrt(...)后添加a3 = max(1e-6, a3);避免除零。

3. 定位模型的MATLAB实现:从符号推导到数值求解的完整链路

3.1 符号建模:为什么必须用solve而非fsolve?

论文附录一的MATLAB代码第一部分,用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);

这里的选择是深思熟虑的:solve求解的是解析解,它返回的是满足方程的精确代数表达式(尽管可能含根号)。而fsolve是数值迭代,需提供初值,且易陷局部极小。在纯方位定位中,初值未知(你连自己在哪都不知道),fsolve极可能收敛到错误分支。solve则利用MATLAB Symbolic Math Toolbox的代数引擎,将非线性方程组转化为多项式系统求解,确保找到所有数学上可能的解。后续double(X)将符号解转为浮点数,是可控的精度损失;而fsolve的初值误差则是不可控的路径依赖。

3.2 坐标系绑定:为什么“把FY00固定在x轴”不是偷懒,而是降维关键?

论文图1明确要求“将第i架无人机的准确位置固定在x轴上”。这在MATLAB实现中体现为:

% FY00在(0,0), FY01在(r,0), FY0i在(r*cosd(theta_i), r*sind(theta_i)) % 其中 theta_i = (i-1)*40° (因9架均匀分布,360°/9=40°)

此举将原本需要6个参数(3架发射机的x,y坐标)的系统,压缩为仅需半径r和角度差的2参数系统。因为纯方位定位的本质是相对几何:绝对坐标系可任意旋转平移,但三点间的角度关系不变。MATLAB中cosd(k01)和sind(k01)的k01=k0i-40*abs(i-1)计算,正是将符号解K0(从FY00到P的距离)映射回全局坐标的旋转操作。若不固定坐标系,solve将面对冗余变量,求解时间指数级增长。

3.3 数值稳定性加固:real()与max/min的生存指南

观察附录一末尾的坐标计算:

k0i = acosd(1-2*cosd(alpha1)^2); % 这是cos(2α)=2cos²α-1的逆运算! k01 = k0i - 40*abs(i-1); x = real(K0*cosd(k01)); % 强制取实部 y = real(K0*sind(k01));

k0i = acosd(cos(2*alpha1))本应等于2*alpha1,但浮点计算中cosd(alpha1)^2的舍入误差会使1-2*cosd(alpha1)^2略大于1或小于-1,导致acosd输入越界。real()不是掩盖问题,而是捕获并截断由数值噪声产生的虚部(通常<1e-15)。同理,在附录二的偏差比对中:

m = (beta1-alpha1(i,FY0k))^2 + ...; % 若alpha1矩阵含NaN,m变NaN if m <= min % NaN <= min 恒为false,循环失效!

因此必须在计算alpha1前用alpha1 = max(-180, min(180, alpha1));限幅,这是工业级MATLAB代码的铁律。

3.4 避坑:MATLAB符号计算中那些让导师皱眉的“优雅”陷阱

  • 现象:solve运行数分钟无响应,或返回RootOf(...)形式。
    原因:方程组高度非线性,符号引擎尝试求解析解失败。
    解决:改用vpasolve(eq1,eq2,eq3,k0,a2,a3,[1,1,1]),提供合理初值(如k0≈r, a2≈r, a3≈r)进行高精度数值求解,速度提升百倍。

  • 现象:linspace(0,360,360)生成361个点,for j=0:359循环少一次。
    原因:MATLAB索引从1开始,j=0时cosd(j)有效,但j=360与j=0重复。
    解决:统一用theta = 0:0.1:359.9;或theta = linspace(0,360,3600);,避免边界混淆。

  • 现象:plot(x,y,'o')绘制的轨迹是离散点,看不出“葫芦”形状。
    原因:fimplicit需要函数句柄,而非离散点。
    解决:用fimplicit(@(x,y) (x-r/2).^2 + (y-r./(2*tand(alpha1))).^2 - (r./(2*sind(alpha1))).^2)直接绘制隐函数曲线。

4. 位置调整模型:0.01米步长背后的收敛性证明与效率权衡

4.1 全方位遍历:为什么不是梯度下降,而是暴力搜索的必然选择?

论文5.1.3节提出“设定步长0.01米,向四周全方位遍历”。这看似低效,实则精准匹配了问题特性:

  • 目标函数非凸:定位误差E(x,y) = (α₁_calc - α₁_meas)² + (α₂_calc - α₂_meas)² + (α₃_calc - α₃_meas)²在(x,y)平面上存在多个局部极小(对应不同圆弧分支),梯度下降极易陷入错误分支。
  • 解空间稀疏:真实解位于由三圆严格定义的交点,周围是陡峭的误差悬崖。0.01m步长在100m半径编队中,覆盖范围约2π*100/0.01 ≈ 62831个点,现代CPU毫秒级可完成。
    MATLAB实现中,for j=0:359外层循环角度,内层for r_step=0.01:0.01:100循环半径,构成极坐标网格。关键优化在于:一旦E(x,y) < 1e-6,立即break—— 因为纯方位定位的理论误差下限由角度测量精度决定(如0.1°对应100m处约0.17m),0.01m步长已远超需求。

4.2 极坐标更新:如何用一次余弦定理完成“移动-重测-再移动”的闭环?

图10-11的示意图揭示了调整的物理意义:无人机B向C移动微小步长Δr后,它与FY00、FY01构成的新三角形中,边长FY00C、FY01C可由余弦定理实时更新:

% B点坐标(xb,yb), C点坐标(xc,yc) = (xb + Δr*cosd(theta), yb + Δr*sind(theta)) % FY00=(0,0), FY01=(r,0) a_FY00C = sqrt(xc^2 + yc^2); % 新边长1 a_FY01C = sqrt((xc-r)^2 + yc^2); % 新边长2 alpha1_new = acosd((r^2 + a_FY00C^2 - a_FY01C^2) / (2*r*a_FY00C)); % 新角度1 % 与测量值beta1比较,决定是否接受此移动

这正是论文公式(21)(22)的数值实现:它不依赖GPS反馈,仅用本地感知的方位角变化驱动运动,是真正的“感知-决策-执行”闭环。MATLAB中将此封装为函数update_position(xb,yb,theta,delta_r,r,beta1,beta2,beta3),每次调用即完成一次微调。

4.3 收敛阈值设计:为什么“相差0.01米”是工程与理论的黄金分割点?

0.01m(1cm)阈值并非随意指定:

  • 理论下限:由角度测量噪声决定。若陀螺仪精度为0.01°,在100m距离上,角度误差导致的位置误差为100 * tan(0.01°) ≈ 0.017m。0.01m阈值留有安全余量。
  • 工程上限:无人机悬停精度通常为0.1~0.5m,追求亚厘米级无意义。
  • 计算成本:阈值每降低10倍,搜索点数增100倍(面积∝r²)。0.01m vs 0.001m,计算量差10000倍。
    因此,while(jl > 0.01)是经过严格成本-收益分析的决策。在MATLAB中,可动态调整:threshold = max(0.01, 0.1 * angle_noise_degree * distance),实现自适应收敛。

4.4 避坑:位置调整中那些让无人机“原地打转”的逻辑漏洞

  • 现象:jl=100; while(jl>njl)循环永不退出,jl始终为100。
    原因:代码中jl未在循环内更新!论文附录三末尾j201=input('201:')是占位符,实际需计算jl = sqrt((x-x0)^2+(y-y0)^2)并赋值给jl。
    解决:在while循环内首行添加jl = norm([x,y] - [x0,y0]);。

  • 现象:调整后坐标x,y与理想位置x0,y0的欧氏距离达标,但方位角误差abs(alpha1_new-beta1)仍很大。
    原因:仅优化位置,未约束角度。纯方位定位中,位置正确是角度正确的充分条件,但数值计算中因acosd的精度损失,可能出现位置准而角度偏的现象。
    解决:将收敛条件改为if jl < 0.01 && abs(alpha1_new-beta1) < 0.01 && abs(alpha2_new-beta2) < 0.01,双重校验。

  • 现象:锥形编队中,按表3坐标初始化后,alpha1_new计算为NaN。
    原因:表3中(-100*sqrt(3),200)与FY00(0,0)距离约264.6m,与FY01(100,0)距离约300m,但acosd((r^2 + a_FY00C^2 - a_FY01C^2)/(2*r*a_FY00C))中分子100² + 264.6² - 300² ≈ -10000,分母2*100*264.6≈52920,比值≈-0.189,在域内;但若a_FY00C因浮点误差略小于真实值,比值可能<-1。
    解决:统一使用alpha1_new = acosd(max(-1, min(1, (r^2 + a_FY00C^2 - a_FY01C^2)/(2*r*a_FY00C))));。

5. 从圆形到锥形:编队拓扑变化如何重构定位自由度与发射机选择策略

5.1 锥形编队的几何本质:等边三角形链与角度传播的级联效应

论文图13将锥形编队抽象为“相邻三架构成等边三角形”,这一定性描述掩盖了关键定量约束:在等边三角形中,所有内角为60°,这意味着任意两架发射机对(如FY01-FY05)提供的方位角α,其理论值必为60°或120°(取决于接收机在三角形内/外)。但实际中,由于初始偏差,测量值β₁,β₂,β₃会偏离60°。问题二的精妙之处在于:它不直接求解接收机坐标,而是先求解中间角。如图16所示,当FY01、FY02、FY05构成三角形,已知∠FY01-FY02-FY05 = β₁, ∠FY05-FY02-FY01 = β₂,则第三角∠FY01-FY05-FY02 = 180° - β₁ - β₂。这个计算完全规避了坐标系,仅依赖角度守恒——这是纯方位定位在拓扑变化时的“不变量”。

5.2 发射机轮换策略:为什么“第二轮选4,7,9...”是覆盖最大化算法?

表3列出15架无人机坐标,但论文指出第二轮仅能定位3,6,8,10,12,15号。这源于“延长线困境”:当接收机位于FY01-FY02-FY05三角形某边延长线上时,该边对应的方位角β趋近0°或180°,导致sin(β)≈0,定位方程病态。MATLAB中可量化此风险:对每架候选接收机P,计算其到三边所在直线的距离d1,d2,d3,若min(d1,d2,d3) < 0.1(10cm),则标记为“高风险”。论文中4,7,9,11,13,14号机恰满足此条件。第三轮选取FY02,FY06,FY08为发射机,是因为它们构成的三角形覆盖了剩余高风险区——这是一种贪心覆盖算法,目标是使min(d1,d2,d3)最大化。

5.3 MATLAB中的拓扑感知:用图论矩阵重构编队关系

将15架无人机视为图节点,边权为距离。锥形编队的邻接矩阵A具有带状结构(每架仅与前后2架强连接)。定位可行性可转化为图论问题:

% 计算每架无人机到当前发射机组(FY01,FY05)的最小距离比 dist_ratio = zeros(15,1); for i=1:15 d1 = norm(pos(i,:) - pos(1,:)); % 到FY01距离 d2 = norm(pos(i,:) - pos(5,:)); % 到FY05距离 dist_ratio(i) = min(d1,d2) / max(d1,d2); % 比值越接近1,越不易共线 end % 选择dist_ratio > 0.3的无人机作为下一轮发射机 next_emitters = find(dist_ratio > 0.3, 3, 'first');

此代码将论文中“经验性选择”升华为可编程的拓扑度量,是模型推广的关键。

5.4 避坑:锥形编队中那些让“三圆共点”彻底失效的拓扑陷阱

  • 现象:solve对FY01,FY05,FY02三机返回空解,但手动验证坐标满足几何关系。
    原因:锥形编队中FY01(0,0), FY05(100,0), FY02(50,86.6)构成的三角形,边长a1=100,a2=100,a3=100(等边),但MATLAB计算a3=sqrt((50-0)^2+(86.6-0)^2)因86.6是50*sqrt(3)的近似,导致a3≈99.999,a1²+a2²-a3²计算中微小误差使cosd(alpha3)输入越界。
    解决:用精确值pos(2,:) = [50, 50*sqrt(3)],或在计算前用vpa高精度计算。

  • 现象:调整FY02位置后,FY03的定位误差突然增大10倍。
    原因:FY02位置修正改变了FY01-FY02-FY05三角形的形状,使FY03落入新三角形的延长线区域。
    解决:在每轮调整后,重新运行dist_ratio分析,动态更新发射机组,而非固定轮次。

6. 设计取舍的终极拷问:当“三圆共点”遇上现实噪声,我们该信数学还是信传感器?

纯方位无源定位的优雅,在于它用最少的物理量(角度)换取最大的几何信息(位置)。但这份优雅在现实中布满荆棘:陀螺仪的零偏、电机振动引起的姿态抖动、多径反射导致的角度跳变……论文中所有“假设无偏差”“时间不计”的表述,都是在构建一个理想透镜,让我们看清核心机制。可一旦拿起MATLAB调试真实数据,你会立刻撞上三堵墙:
第一堵是角度噪声墙。假设陀螺仪角度误差服从N(0,0.5°),在100m距离上,这会导致位置误差标准差达100*tan(0.5°)≈0.87m。此时,执着于0.01m步长遍历是徒劳的——你是在亚毫米级网格上拟合一个米级噪声的信号。解决方案是:在目标函数E(x,y)中加入正则项λ*(x²+y²),抑制远离初始猜测的解,这本质上是贝叶斯估计中的先验约束。

第二堵是计算复杂度墙。论文枚举56种发射组合,对10架机是可行的;但若扩展到100架机,组合数达C(100,3)≈16万,MATLAB单机遍历需数分钟。此时必须转向图论优化:构建“发射机-接收机”二分图,用最大流算法选择最小代价的覆盖集,而非穷举。

第三堵是拓扑脆弱墙。圆形编队的对称性天然规避共线,但锥形、十字形等任意拓扑中,“延长线困境”概率剧增。论文用三轮轮换应对,但更鲁棒的方案是:主动控制——让无人机在调整过程中微调自身姿态,确保对任意发射机组,其观测角始终远离0°/180°。这需要将定位模型与飞控PID环耦合,形成“感知-规划-控制”一体化架构。

我曾在一个模拟项目X中,坚持用论文的纯遍历法调试锥形编队,连续三天卡在FY07的定位上。直到深夜重读公式(15):“cos(θ) = cos(360°-θ)”,才意识到:当FY07位于FY01-FY05延长线上时,它测得的β₁≈0°,但cos(0°)=1,而cos(360°)=1,acosd(1)返回0°而非360°,导致所有基于角度差的计算崩塌。解决方案不是增加发射机,而是修改acosd为atan2:用向量叉积符号判断角度象限,将0°/360°歧义彻底消除。从那以后,我每次处理角度数据,都强制走一遍atan2(sind(beta),cosd(beta))标准化流程——这行代码,比任何优化算法都更能守住纯方位定位的底线。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表