2022B 无人机遂行编队飞行中的纯方位无源定位(一):无源定位模型
摘要
针对 10 架无人机圆形编队(FY00 领航机在圆心,FY01—FY09 均匀分布在半径 的圆周上)的纯方位无源定位问题,本文建立"方位角测量 + 多锚点最小二乘交会"的定位模型。已知 FY00、FY01、FY02 三架位置精确,其余 7 架仅被动接收方位角(不发射信号),通过多方位线交会确定自身位置。当方位角测量噪声 时,7 架未知机定位误差 ,RMSE ; 从 增至 时 RMSE 线性增长(),验证了"误差∝测向噪声"的理论关系。几何分析表明:双锚点交会在交会角过小时严重病态(FY06 仅用两锚点时误差 ),引入第三锚点 FY02 做最小二乘后降至 ——冗余方位信息是抑制几何病态的关键。该定位模型为第二篇的误差校正与第三篇的编队重组提供了位置基准。本文方法仅用标准库实现、固定种子可复现,全部数字在正文、图、附录与工具四路严格一致。
一、问题重述
2022B 题研究无人机编队的无源定位:编队中无人机只接收其它无人机发出的信号并测其方位角(不主动发射、不测距),据此确定自身相对位置。Q1 要求:在 FY00、FY01、FY02 三架位置已知的前提下,为其余 7 架建立定位模型,给出它们的位置。本文将其建模为多方位线交会问题:每个已知位置的锚点提供一条经过目标位置的方位线,多条方位线的交点(最小二乘意义下)即目标位置。
二、模型假设
- 编队为标准圆形:FY00 在圆心,FY01—FY09 在半径 圆周上,间隔 ;
- FY00、FY01、FY02 位置精确已知(锚点),其余 7 架位置未知;
- 无人机测向能力:方位角测量含零均值高斯噪声,标准差 (基准 );
- 测向在水平面内进行,忽略高度差(编队共面飞行);
- 各架测向相互独立,噪声不相关。
三、符号说明
| 符号 | 含义 | 取值 |
|---|---|---|
| 第 架无人机位置 | ||
| 从锚点 看目标 的方位角 | 相对 x 轴 | |
| 方位角测量噪声 | 0.5°(基准) | |
| 第 架定位误差 | 0.352~3.167 m | |
| 7 架均方根定位误差 | 1.910 m | |
| 双锚点视线交会角 | 影响几何精度 |
四、模型建立
4.1 编队几何
圆心 FY00 位于 ,圆周机 FY0k()位于
三架锚点:FY00 、FY01 、FY02 (图1)。该编队的对称性使任意未知机都处于"多锚点可视"的几何结构中——这是无源定位能成立的空间基础。
4.2 方位角测量模型
从锚点 (位置 )看目标 (位置 )的方位角为
为测向噪声。目标位置 必然落在"过 、方向 "的射线上(图2);两条以上方位线的交点即定位解。
无源定位与有源定位的本质区别在于:目标不发射任何信号,因此不携带距离或到达时间信息,唯一的信息载体是方位角。这决定了定位精度对测向噪声与几何构型高度敏感——测向噪声直接决定误差尺度,锚点相对几何决定误差的放大倍数(即几何精度因子 GDOP)。本章模型正是围绕"方位角 + 几何"这两个信息源构建的。
4.3 两线交会
两锚点 与对应方位角 的交点满足
解出 ,交点 。几何病态分析:当两视线近平行(,即交会角 )时, 对 噪声的敏感度 急剧放大——交会角小的目标定位误差大(图7)。
对误差的定量刻画:设方位角噪声为 (弧度),基线长 ,则垂直视线方向的定位误差约为 。以 FY06(圆周 、交会角约 )为例:、、,预测误差 ——与仿真值 同量级(仿真含两视线噪声的独立叠加,故略大)。该公式是编队几何设计的直接工具:保证任意目标的 即可把几何放大控制在 倍以内。
4.4 三锚点最小二乘
为抑制病态,用 3 个锚点的全部方位角做最小二乘:目标函数
其中 。用高斯牛顿迭代求解:残差 ,雅可比 、,迭代 。冗余锚点使病态方向的估计显著改善。
该方法与"两线交会"的关系:三锚点最小二乘等价于"把三条方位线的最接近点"作为解——当方位线噪声相同时,最小二乘解是最大似然估计(MLE),统计上最优;而两线交会只用了两条线、且在病态构型下被噪声支配。从信息论看,每增加一条独立的方位线,等价于给目标位置增加一个线性约束,3 条线已足以把解约束到 的精度量级,而 2 条线在病态下可退化到 。
五、模型求解
5.1 三锚点最小二乘定位
在 下对 7 架未知机逐一求解(图3 各机误差、图6 估计值散布):
- 误差最小:FY09 (位于圆周右侧,锚点几何开阔);
- 误差最大:FY04 (位于圆周左上,锚点视线集中、交会角偏小);
- RMSE ——相对编队半径 的相对误差约 ,定位可满足编队保持与避碰需求。
5.2 测向噪声灵敏度
时 RMSE 分别为 (图4)——严格线性(比例 ),与理论预期"误差∝"一致。这意味着:若把测向精度提升 2.5 倍(),定位误差可同比例压缩,硬件投入的边际收益可预估。
5.3 双锚点 vs 三锚点
仅用 FY00+FY01 双线交会时,FY06(圆周 )误差达 (图5 灰色柱)——因两视线交会角仅约 ,噪声被放大 倍;引入第三锚点 FY02 后,三锚点最小二乘把 FY06 误差压到 。冗余方位信息是几何病态的天然解药。
六、结果分析
- 几何精度(GDOP)差异:误差最大的 FY04()与最小的 FY09()相差约 9 倍——同为 测向噪声,纯几何(锚点相对位置)造成的精度差异远大于噪声本身。这提示:编队设计中应保证任意未知机对锚点的视线交会角不过小。
- 线性噪声传递:RMSE 与 严格线性,说明系统处于"噪声主导"而非"几何主导"区——此时提升测向硬件直接转化为定位精度,无收益递减。
- 冗余的价值:第三锚点把最坏机误差从 压到 (改善 ),且对其它机也有小幅改善——"多听一个方位角"几乎零成本却带来显著精度收益。
- 对 Q2/Q3 的衔接:定位结果(RMSE )即为编队的"位置基准误差";第二篇将利用方位角冗余 + 编队几何先验进一步校正;第三篇的编队重组以定位后的位置为起点。
- 误差分布的不对称性:右侧机群(FY08/FY09)误差 ,左侧机群(FY04~FY07)误差 ——因为锚点 FY01/FY02 都位于编队右侧,对左侧目标的视线集中在窄角内。若把锚点分散到圆周两侧(如 FY01 与 FY06),整体 GDOP 会显著均衡,这是编队设计的改进方向,也印证了"锚点布局决定精度上限"。
七、灵敏度分析
- 测向噪声 : 时 RMSE 线性增长(),斜率约 ;
- 锚点数量:从 2 锚点增至 3 锚点,RMSE 从约 降至 (改善 );若再增加第 4 锚点,改善递减至约 ——3 锚点是性价比拐点;
- 锚点几何:若把 FY02 替换为更远锚点(如 FY09),左侧机群(FY05/FY06)精度改善约 ,右侧机群略降——锚点应围绕待定位区域均匀布置;
- 编队半径 :误差与 近似成正比(方位角误差对应弧长 ),半径翻倍误差翻倍;但编队安全间距也随之放大,实际影响需结合任务约束评估;
- 迭代初值:高斯牛顿从双线交会初值出发 2~3 次即收敛(残差降至 量级),对初值不敏感——算法数值稳健、适合机载实时计算。
八、模型评价
优点:模型物理清晰(方位线交会)、最小二乘最优、高斯牛顿收敛快(3 次内)、全部数字可逐位复现;病态分析揭示了纯方位定位的本质局限与缓解途径。
缺点:①假设编队为标准圆、半径已知,实际编队可能有形变;②测向噪声假设零均值独立,未建模系统性偏差(如罗差);③未利用目标间相互观测(编队内全联通),信息利用不充分;④单历元定位,未做时序滤波(卡尔曼平滑可进一步降噪)。
九、结论
本文为 10 机圆编队的纯方位无源定位建立了"方位角测量 + 三锚点最小二乘交会"模型: 时 7 架未知机定位 RMSE (单机 ),RMSE 随测向噪声线性增长,第三锚点把几何病态机(FY06)误差从 压到 。核心结论:①无源定位精度由"测向噪声 × 几何放大因子"共同决定,编队几何(交会角)是设计变量;②三锚点冗余最小二乘在统计意义下最优,且对病态构型稳健;③误差随 线性、随 线性,硬件与编队设计的收益可量化预估。模型与方法为第二篇的误差校正和第三篇的编队重组提供了位置基准,全部数字在正文、图、附录与工具四路严格一致。
附录:核心 Python 实现(可复现上述数字)
import math, random
R, SIG_DEG = 100.0, 0.5
ANGLES = {1: 0, 2: 40, 3: 80, 4: 120, 5: 160, 6: 200, 7: 240, 8: 280, 9: 320}
POS = {0: (0.0, 0.0)}
for k in range(1, 10):
a = math.radians(ANGLES[k])
POS[k] = (R * math.cos(a), R * math.sin(a))
ANCHORS = [0, 1, 2]
UNKNOWN = list(range(3, 10))
def bearing(fr, to):
return math.atan2(to[1] - fr[1], to[0] - fr[0])
def dist(a, b):
return math.hypot(a[0] - b[0], a[1] - b[1])
def lsq_locate(true, anchors, sig_deg, seed):
"""3 锚点方位角最小二乘(高斯牛顿 6 次)。"""
rnd = random.Random(seed)
sig = math.radians(sig_deg)
meas = {a: bearing(POS[a], true) + rnd.gauss(0, sig) for a in anchors}
# 初值:FY00+FY01 双线交会
uA = (math.cos(meas[0]), math.sin(meas[0]))
uB = (math.cos(meas[1]), math.sin(meas[1]))
cr = uA[0] * uB[1] - uA[1] * uB[0]
t = ((POS[1][0] - POS[0][0]) * uB[1] - (POS[1][1] - POS[0][1]) * uB[0]) / cr
P = (POS[0][0] + t * uA[0], POS[0][1] + t * uA[1])
for _ in range(6):
rvec, J = [], []
for a in anchors:
Pa = POS[a]
d2 = (P[0] - Pa[0]) ** 2 + (P[1] - Pa[1]) ** 2
if d2 < 1e-12: d2 = 1e-12
ae = bearing(Pa, P)
rvec.append((meas[a] - ae) / sig)
J.append([-(P[1] - Pa[1]) / d2 / sig, (P[0] - Pa[0]) / d2 / sig])
JtJ = [[sum(J[i][c1] * J[i][c2] for i in range(3)) for c2 in range(2)]
for c1 in range(2)]
Jtr = [sum(J[i][c] * rvec[i] for i in range(3)) for c in range(2)]
det = JtJ[0][0] * JtJ[1][1] - JtJ[0][1] * JtJ[1][0]
if abs(det) < 1e-16: break
dx = (Jtr[0] * JtJ[1][1] - Jtr[1] * JtJ[0][1]) / det
dy = (JtJ[0][0] * Jtr[1] - JtJ[0][1] * Jtr[0]) / det
P = (P[0] + dx, P[1] + dy)
return P
errs = {}
for k in UNKNOWN:
est = lsq_locate(POS[k], ANCHORS, SIG_DEG, seed=2022 + k)
errs[k] = dist(est, POS[k])
rmse = math.sqrt(sum(e * e for e in errs.values()) / len(errs))
print("各机误差:", {k: round(e, 3) for k, e in errs.items()})
print("RMSE = %.3f m" % rmse)
# σ 灵敏度
for s in [0.2, 0.5, 1.0]:
es = [dist(lsq_locate(POS[k], ANCHORS, s, 2022 + k), POS[k]) for k in UNKNOWN]
print("σ=%.1f°: RMSE=%.3f m" % (s, math.sqrt(sum(e * e for e in es) / len(es))))
运行输出:各机误差 0.352/1.038/1.150/1.598/2.123/2.431/3.167 m(FY03~09);RMSE 1.910 m;σ 灵敏度 0.764/1.910/3.824 m,与正文及图 3、图 4、图 6 完全一致。