题目要求建立一个基于纯方位无源定位的模型,用来确定某些位置略有偏差的无人机的精确位置。具体来说,编队中位于圆心的FY00无人机和其他两架发射信号的无人机的位置已知,被动接收信号的无人机通过接收到的方向信息(即夹角)来调整自身位置。
我们可以通过极坐标系建模,在此过程中利用几何关系和方向信息来确定无人机的位置。整个建模过程包括以下步骤:
编队由10架无人机组成,其中FY00位于圆心,其余9架无人机均匀分布在一个半径为 R R R 的圆周上。在此模型中,假设圆周半径为 R = 100 R = 100 R=100 米(如问题3所述),这些无人机的编号为FY01至FY09。
极坐标定义:
我们将圆心FY00作为极点,定义极坐标系。每架无人机的极坐标表示为 ( r i , θ i ) (r_i, \theta_i) (ri,θi),其中 r i r_i ri 是无人机与圆心的距离, θ i \theta_i θi 是相对于固定参考线(如水平线)的角度。
假设与输入:
发射信号的三架无人机编号已知,假设为FY00、FY01和FY02。被动接收信号的无人机编号为FY04。FY04接收到的方向信息是三个夹角 α 1 , α 2 , α 3 \alpha_1, \alpha_2, \alpha_3 α1,α2,α3,它们分别为FY04与FY00、FY01、FY02之间连线的夹角。
我们现在考虑如何利用夹角信息来确定FY04的位置。对于FY04来说,它接收来自FY00、FY01和FY02的信号,利用这三架无人机的已知位置和所测量的夹角信息,可以使用三角形几何关系来推导其位置。
夹角关系:
FY04接收到的夹角 α 1 \alpha_1 α1, α 2 \alpha_2 α2, α 3 \alpha_3 α3 分别是FY04与这三架无人机之间的相对方向。具体来说,这些角度可以用来形成一个三角形,并通过三角学方法推导出FY04的坐标。
方向信息的使用:
无人机FY04所接收到的三个角度提供了方向信息,但由于我们处于一个二维平面上,三个方向信息足以定位无人机FY04。三角形的内角和为180度,因此我们有:
α 1 + α 2 + α 3 = 18 0 ∘ \alpha_1 + \alpha_2 + \alpha_3 = 180^\circ α1+α2+α3=180∘
通过已知的夹角和发射无人机的位置,可以构建三角形的边长关系,进一步确定FY04的相对位置。
由于FY00、FY01、FY02的位置已知,我们可以通过三角形几何定理推导FY04的位置。考虑以下步骤:
已知发射无人机的位置:
FY00位于圆心,其极坐标为 ( 0 , 0 ∘ ) (0, 0^\circ) (0,0∘),FY01和FY02均位于半径为100米的圆周上,其极坐标为 ( 100 , θ 1 ) (100, \theta_1) (100,θ1) 和 ( 100 , θ 2 ) (100, \theta_2) (100,θ2),其中 θ 1 \theta_1 θ1 和 θ 2 \theta_2 θ2 分别表示它们与水平线之间的夹角。
夹角的几何关系:
FY04所测量到的角度 α 1 \alpha_1 α1, α 2 \alpha_2 α2, α 3 \alpha_3 α3 描述了其与发射无人机之间的方向关系。我们可以利用这些角度和三角学公式(如正弦定理和余弦定理)求解FY04的相对位置。
设FY04与FY00的距离为 d 0 d_0 d0,与FY01的距离为 d 1 d_1 d1,与FY02的距离为 d 2 d_2 d2。则根据余弦定理:
d 0 2 = d 1 2 + d 2 2 − 2 d 1 d 2 cos ( α 1 ) d_0^2 = d_1^2 + d_2^2 - 2d_1 d_2 \cos(\alpha_1) d02=d12+d22−2d1d2cos(α1)
通过这一公式可以计算出FY04相对于FY00的距离。然后,利用正弦定理可以进一步确定其极坐标角度 θ 4 \theta_4 θ4。
正弦定理:
通过正弦定理,我们可以建立一个夹角与边长的关系:
d 1 sin ( α 2 ) = d 2 sin ( α 3 ) = d 0 sin ( α 1 ) \frac{d_1}{\sin(\alpha_2)} = \frac{d_2}{\sin(\alpha_3)} = \frac{d_0}{\sin(\alpha_1)} sin(α2)d1=sin(α3)d2=sin(α1)d0
该公式进一步提供了FY04的相对位置信息。
当通过三角形关系计算出FY04与发射信号的无人机之间的距离和方向后,我们可以将FY04的相对位置转换为极坐标形式,即 ( r 4 , θ 4 ) (r_4, \theta_4) (r4,θ4),其中 r 4 r_4 r4 表示FY04与FY00的距离, θ 4 \theta_4 θ4 表示其极角。然后,根据所得到的极坐标信息,我们可以计算FY04的位置并与其理想位置进行比较,进而调整无人机到正确位置。
import numpy as np
import matplotlib.pyplot as plt
# 定义无人机的初始坐标(极坐标表示)
drones_polar = [
(100, 0), # FY01
(98, 40.10), # FY02
(112, 80.21), # FY03
(105, 119.75), # FY04
(98, 159.86), # FY05
(112, 199.96), # FY06
(105, 240.07), # FY07
(98, 280.17), # FY08
(112, 320.28) # FY09
]
# 将极坐标转换为笛卡尔坐标
def polar_to_cartesian(r, theta_deg):
theta_rad = np.radians(theta_deg)
x = r * np.cos(theta_rad)
y = r * np.sin(theta_rad)
return np.array([x, y])
# 初始化无人机的笛卡尔坐标
drones_cartesian = np.array([polar_to_cartesian(r, theta) for r, theta in drones_polar])
# 定义无人机 FY00 在圆心的位置
FY00 = np.array([0, 0])
# 绘制初始无人机编队图
def plot_drones(drones_cartesian, FY00):
plt.figure(figsize=(8, 8))
plt.scatter(drones_cartesian[:, 0], drones_cartesian[:, 1], label='Drones FY01~FY09', color='b')
plt.scatter(FY00[0], FY00[1], label='Drone FY00 (Center)', color='r')
for i, drone in enumerate(drones_cartesian):
plt.text(drone[0] + 1, drone[1] + 1, f'FY0{i+1}', fontsize=12)
plt.text(FY00[0] + 1, FY00[1] + 1, 'FY00', fontsize=12)
plt.title("Initial Drone Formation")
plt.xlabel('X (meters)')
plt.ylabel('Y (meters)')
plt.grid(True)
plt.axis('equal')
plt.legend()
plt.show()
plot_drones(drones_cartesian, FY00)
# 定义方向夹角函数,计算无人机与FY00和FY01形成的夹角
def calculate_angle(p1, p2, p3):
v1 = p1 - p2
v2 = p3 - p2
cos_angle = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
angle = np.arccos(cos_angle)
return np.degrees(angle)
# 假设无人机 FY04(编号 4)接收到 FY00 和 FY01 的信号,计算夹角
def calculate_angles_for_drone(drones_cartesian, FY00, target_index):
# FY01
FY01 = drones_cartesian[0]
# FY04 (target drone)
target_drone = drones_cartesian[target_index]
# 计算 FY04 接收到的夹角
angle1 = calculate_angle(target_drone, FY00, FY01)
return angle1
# 计算FY04接收到的夹角
angle_FY04 = calculate_angles_for_drone(drones_cartesian, FY00, 3)
print(f"FY04接收到的夹角(FY00和FY01之间): {angle_FY04:.2f} 度")
# 假设更多的无人机参与发射信号,FY04接收到这些无人机的信号
def calculate_all_angles(drones_cartesian, FY00, target_index, transmitting_indices):
angles = []
for i in transmitting_indices:
angle = calculate_angle(drones_cartesian[target_index], FY00, drones_cartesian[i])
angles.append(angle)
return angles
# 假设FY00、FY01、FY02发射信号,FY04接收到信号
transmitting_drones = [0, 1, 2]
angles_received = calculate_all_angles(drones_cartesian, FY00, 3, transmitting_drones)
# 输出计算结果
for i, angle in enumerate(angles_received):
print(f"FY04接收到的与FY00和FY0{transmitting_drones[i]+1}的夹角: {angle:.2f} 度")
要解决这个问题,我们需要建立一个模型,使得接收信号的无人机能够通过信号的方向信息确定其精确位置。核心问题是,通过接收到的多个信号,如何唯一确定该无人机的位置。与之前简单的几何模型不同,我们将采用一种基于最小二乘法的定位方法,结合矩阵运算和方向余量(DOA: Direction of Arrival)技术,来确定无人机位置。
为了精确解答该问题,建模的关键步骤如下:
假设无人机接收到多个发射信号(其中至少包括FY00和FY01)。这些信号的方向信息可以表示为与发射信号的无人机的夹角。我们定义信号模型如下:
对于任意发射信号的无人机 p i \mathbf{p}_i pi 和接收信号的无人机 p r \mathbf{p}_r pr,我们设它们的相对位置为:
p i = [ x i y i ] , p r = [ x r y r ] \mathbf{p}_i = \begin{bmatrix} x_i \\ y_i \end{bmatrix}, \quad \mathbf{p}_r = \begin{bmatrix} x_r \\ y_r \end{bmatrix} pi=[xiyi],pr=[xryr]
其中 p i \mathbf{p}_i pi 表示第 i i i 架发射信号的无人机的位置, p r \mathbf{p}_r pr 是我们需要确定的FY04的未知位置。
接收到的方向信息 α i \alpha_i αi 是FY04与发射信号无人机 p i \mathbf{p}_i pi 之间的夹角,具体为:
α i = arctan ( y i − y r x i − x r ) \alpha_i = \arctan\left( \frac{y_i - y_r}{x_i - x_r} \right) αi=arctan(xi−xryi−yr)
这些夹角信息构成了定位的核心数据。
为了确定FY04的位置,我们需要利用最小二乘法来进行非线性估计。设FY04的估计位置为 p ^ r = ( x r , y r ) \hat{\mathbf{p}}_r = (x_r, y_r) p^r=(xr,yr),真实的夹角信息与估计的夹角之间会存在一定的误差。目标是通过最小化这些误差来估计FY04的准确位置。
误差定义为:
e i = α i − α ^ i e_i = \alpha_i - \hat{\alpha}_i ei=αi−α^i
其中 α ^ i \hat{\alpha}_i α^i 是由当前估计的 p ^ r \hat{\mathbf{p}}_r p^r 计算出的夹角:
α ^ i = arctan ( y i − y ^ r x i − x ^ r ) \hat{\alpha}_i = \arctan\left( \frac{y_i - \hat{y}_r}{x_i - \hat{x}_r} \right) α^i=arctan(xi−x^ryi−y^r)
通过最小化所有发射信号无人机的方向误差的平方和:
min ∑ i = 1 n e i 2 \min \sum_{i=1}^{n} e_i^2 min∑i=1nei2
我们可以得到FY04的最佳位置估计。这里的 n n n 是发射信号的无人机数量,包括已知的FY00和FY01,以及其他可能的未知编号的无人机。
为了实现这一最小化问题的解,我们可以将其转换为线性代数问题。通过线性化夹角公式并引入雅可比矩阵(Jacobian Matrix),我们可以使用迭代方法(例如高斯-牛顿法或勒文贝格-马夸尔特法)来求解无人机的位置信息。
设 p r = ( x r , y r ) \mathbf{p}_r = (x_r, y_r) pr=(xr,yr) 是当前的无人机位置估计,雅可比矩阵 J J J 定义为:
J = [ ∂ α 1 ∂ x r ∂ α 1 ∂ y r ∂ α 2 ∂ x r ∂ α 2 ∂ y r ⋮ ⋮ ∂ α n ∂ x r ∂ α n ∂ y r ] J = \begin{bmatrix} \frac{\partial \alpha_1}{\partial x_r} & \frac{\partial \alpha_1}{\partial y_r} \\ \frac{\partial \alpha_2}{\partial x_r} & \frac{\partial \alpha_2}{\partial y_r} \\ \vdots & \vdots \\ \frac{\partial \alpha_n}{\partial x_r} & \frac{\partial \alpha_n}{\partial y_r} \end{bmatrix} J= ∂xr∂α1∂xr∂α2⋮∂xr∂αn∂yr∂α1∂yr∂α2⋮∂yr∂αn
每个分量可以计算为:
∂ α i ∂ x r = − y i − y r ( x i − x r ) 2 + ( y i − y r ) 2 \frac{\partial \alpha_i}{\partial x_r} = -\frac{y_i - y_r}{(x_i - x_r)^2 + (y_i - y_r)^2} ∂xr∂αi=−(xi−xr)2+(yi−yr)2yi−yr
∂ α i ∂ y r = x i − x r ( x i − x r ) 2 + ( y i − y r ) 2 \frac{\partial \alpha_i}{\partial y_r} = \frac{x_i - x_r}{(x_i - x_r)^2 + (y_i - y_r)^2} ∂yr∂αi=(xi−xr)2+(yi−yr)2xi−xr
我们可以将误差向量 e = [ e 1 , e 2 , … , e n ] T \mathbf{e} = [e_1, e_2, \dots, e_n]^T e=[e1,e2,…,en]T 表示为:
e = α − α ^ \mathbf{e} = \mathbf{\alpha} - \hat{\mathbf{\alpha}} e=α−α^
其中 α \alpha α 是观测到的夹角向量, α ^ \hat{\alpha} α^ 是由当前估计位置计算出的夹角向量。
最终,我们的目标是通过迭代求解以下最小二乘法问题:
p ^ r = p r − ( J T J ) − 1 J T e \hat{\mathbf{p}}_r = \mathbf{p}_r - (J^T J)^{-1} J^T \mathbf{e} p^r=pr−(JTJ)−1JTe
其中 ( J T J ) − 1 J T e (J^T J)^{-1} J^T \mathbf{e} (JTJ)−1JTe 是方向误差的校正向量。
通过多次迭代,FY04的估计位置 p ^ r \hat{\mathbf{p}}_r p^r 将逐渐逼近真实位置。
根据上述模型,最小二乘法的有效性依赖于接收信号的无人机获得的方向信息数量。为了确保能够唯一确定FY04的位置,我们需要至少三个独立的方向信息(即三个已知的发射信号无人机),这是一个基本的几何条件。
这是因为:
因此,除了FY00和FY01之外,至少还需要一架无人机发射信号,以提供额外的方向信息,实现FY04的有效定位。
import numpy as np
# 定义无人机的初始坐标(极坐标表示)
drones_polar = [
(100, 0), # FY01
(98, 40.10), # FY02
(112, 80.21), # FY03
(105, 119.75), # FY04
(98, 159.86), # FY05
(112, 199.96), # FY06
(105, 240.07), # FY07
(98, 280.17), # FY08
(112, 320.28) # FY09
]
# 将极坐标转换为笛卡尔坐标
def polar_to_cartesian(r, theta_deg):
theta_rad = np.radians(theta_deg)
x = r * np.cos(theta_rad)
y = r * np.sin(theta_rad)
return np.array([x, y])
# 初始化无人机的笛卡尔坐标
drones_cartesian = np.array([polar_to_cartesian(r, theta) for r, theta in drones_polar])
# 定义无人机 FY00 在圆心的位置
FY00 = np.array([0, 0])
# 计算方向夹角函数,计算无人机与FY00和FY01之间的夹角
def calculate_angle(p1, p2, p3):
v1 = p1 - p2
v2 = p3 - p2
cos_angle = np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
angle = np.arccos(cos_angle)
return np.degrees(angle)
# 根据方向信息确定接收无人机的位置
def locate_drone(FY00, FY01, FY_unknown_list, received_angles):
"""
通过已知发射无人机 (FY00, FY01) 和未知编号无人机发射的信号 (FY_unknown_list),以及接收到的方向夹角信息 (received_angles),
来计算接收无人机的位置。
"""
# FY01和FY00作为基准无人机,设定他们的坐标为已知
p_FY00 = FY00
p_FY01 = FY01
# 未知无人机发射信号坐标列表(从drones_cartesian提取)
p_unknown_list = np.array([drones_cartesian[i] for i in FY_unknown_list])
# 先定义接收无人机初始估计位置(从FY00、FY01开始估计)
# 为简化,假设接收无人机起始位置为(50, 50),可以在后续迭代中调整位置
estimated_position = np.array([50, 50])
# 迭代求解过程,通过角度和已知信号位置不断逼近无人机的实际位置
for i in range(100): # 迭代次数设置为100次
errors = []
for j, p_unknown in enumerate(p_unknown_list):
angle_estimated = calculate_angle(estimated_position, p_FY00, p_FY01)
angle_real = received_angles[j]
error = angle_real - angle_estimated
errors.append(error)
# 更新估计位置
# 为简化问题,我们将位置更新设定为简单的梯度下降(位置微调,误差修正)
error_mean = np.mean(errors)
adjustment = np.array([error_mean * 0.01, error_mean * 0.01]) # 简单调整,步长为0.01
estimated_position += adjustment
# 判断收敛条件,若调整值过小,则停止
if np.linalg.norm(adjustment) < 1e-6:
break
return estimated_position
# 假设FY02、FY03、FY04发射信号,并接收到方向信息
FY_unknown_list = [1, 2, 3] # FY02、FY03、FY04发射信号
received_angles = [45, 30, 60] # 接收到的方向信息(角度)假设为45度、30度、60度
# 计算接收无人机的估计位置
estimated_position = locate_drone(FY00, drones_cartesian[0], FY_unknown_list, received_angles)
# 输出估计位置
print(f"接收无人机的位置估计为: {estimated_position}")
对于问题1的第三小问,要求给出合理的无人机位置调整方案。我们需要基于已知的无人机初始位置,使用一部分无人机(包括中心的 FY00
和最多 3 架无人机)发射信号,剩下的无人机通过接收信号来调整位置。最终目标是让9架无人机均匀分布在一个圆周上。
我们首先将问题分为多个步骤,分别分析无人机的初始位置和期望的最终位置,通过多次调整逐步实现无人机均匀分布。
初始位置与目标位置:
初始时,9架无人机略有位置偏差,分布在一个半径为100米的圆周附近。目标是让它们最终均匀分布在这个圆周上,保持每架无人机之间的夹角相同(360度/9 = 40度)。
调整原则:
每次调整时,由中心的无人机 FY00
和最多 3 架其他无人机发射信号,剩余的无人机根据接收到的方向信息调整到其目标位置。通过合理的调整策略,无人机应逐步接近其理想位置,最终达到均匀分布。
建模方法:
我们使用 最小二乘法 来拟合无人机的实际位置,并引入优化算法(如梯度下降或牛顿法)来对每次调整的误差进行修正。该模型还结合了几何分析,将无人机位置调整建模为多次迭代的非线性优化问题。
假设圆心位置为 (0, 0)
,每架无人机的初始位置可以表示为极坐标 ( r i , θ i ) (r_i, \theta_i) (ri,θi),其中 r i r_i ri 是半径, θ i \theta_i θi 是无人机与x轴的夹角(角度)。理想状态下,无人机应该均匀分布在半径为100米的圆周上,目标位置为:
θ ideal , i = 4 0 ∘ × ( i − 1 ) , r ideal , i = 100 (i=1, 2, ..., 9) \theta_{\text{ideal}, i} = 40^\circ \times (i-1), \quad r_{\text{ideal}, i} = 100 \quad \text{(i=1, 2, ..., 9)} θideal,i=40∘×(i−1),rideal,i=100(i=1, 2, ..., 9)
对于每次调整,假设中心无人机 FY00
和其他三架无人机(如 FY01
, FY02
, FY03
)发射信号。剩下的无人机通过接收到的方向信息(夹角)调整位置。夹角的计算公式为:
cos ( α i j ) = ( x i − x 0 ) ( x j − x 0 ) + ( y i − y 0 ) ( y j − y 0 ) ( x i − x 0 ) 2 + ( y i − y 0 ) 2 ⋅ ( x j − x 0 ) 2 + ( y j − y 0 ) 2 \cos(\alpha_{ij}) = \frac{(x_i - x_0)(x_j - x_0) + (y_i - y_0)(y_j - y_0)}{\sqrt{(x_i - x_0)^2 + (y_i - y_0)^2} \cdot \sqrt{(x_j - x_0)^2 + (y_j - y_0)^2}} cos(αij)=(xi−x0)2+(yi−y0)2⋅(xj−x0)2+(yj−y0)2(xi−x0)(xj−x0)+(yi−y0)(yj−y0)
其中 x i , y i x_i, y_i xi,yi 表示无人机 i i i 的坐标, x 0 , y 0 x_0, y_0 x0,y0 表示中心无人机 FY00
的坐标。通过此公式,我们可以计算无人机接收到的夹角,然后将其与理想状态下的夹角进行比较,得到位置误差。
对于每一次调整,无人机根据接收的夹角信息更新自身位置。我们可以通过以下步骤来更新位置:
误差 i = θ real , i − θ ideal , i \text{误差}_i = \theta_{\text{real}, i} - \theta_{\text{ideal}, i} 误差i=θreal,i−θideal,i
根据误差的大小,调整无人机的位置使其靠近目标位置。
引入最小二乘法优化:
在每次调整中,我们可以引入最小二乘法来拟合无人机的位置,使得每架无人机的实际位置尽量接近其目标位置。假设目标位置为 ( x ideal , i , y ideal , i ) (x_{\text{ideal}, i}, y_{\text{ideal}, i}) (xideal,i,yideal,i),当前无人机位置为 ( x i , y i ) (x_i, y_i) (xi,yi),则我们可以构建最小二乘误差函数:
E = ∑ i = 1 9 ( ( x i − x ideal , i ) 2 + ( y i − y ideal , i ) 2 ) E = \sum_{i=1}^9 \left( (x_i - x_{\text{ideal}, i})^2 + (y_i - y_{\text{ideal}, i})^2 \right) E=∑i=19((xi−xideal,i)2+(yi−yideal,i)2)
我们通过优化这个误差函数,使无人机的位置调整到最小误差。
位置更新公式:
基于梯度下降法或者牛顿法,我们可以计算无人机位置的更新量 Δ x i , Δ y i \Delta x_i, \Delta y_i Δxi,Δyi,并通过迭代更新每一架无人机的坐标:
x i ( k + 1 ) = x i ( k ) − η ∂ E ∂ x i , y i ( k + 1 ) = y i ( k ) − η ∂ E ∂ y i x_i^{(k+1)} = x_i^{(k)} - \eta \frac{\partial E}{\partial x_i}, \quad y_i^{(k+1)} = y_i^{(k)} - \eta \frac{\partial E}{\partial y_i} xi(k+1)=xi(k)−η∂xi∂E,yi(k+1)=yi(k)−η∂yi∂E
其中 η \eta η 是学习率, ∂ E ∂ x i \frac{\partial E}{\partial x_i} ∂xi∂E 和 ∂ E ∂ y i \frac{\partial E}{\partial y_i} ∂yi∂E 分别是误差函数对 x i x_i xi 和 y i y_i yi 的偏导数。
停止条件:
当每架无人机的位置误差(即 Δ x i , Δ y i \Delta x_i, \Delta y_i Δxi,Δyi 的模)小于某个阈值时,停止迭代,认为无人机已经调整到其目标位置。
通过多次迭代调整,我们逐步逼近理想的均匀分布。在每一次迭代中,选择不同的 3 架无人机与 FY00
发送信号,剩下的无人机依次调整位置。每次调整后,更新所有无人机的位置直到满足精度要求。
该模型中每次调整的复杂度主要由方向信息的计算和位置的迭代优化决定。由于方向信息的计算涉及到无人机之间的几何关系,复杂度为 O ( n ) O(n) O(n)。在每次调整中,引入最小二乘法的优化算法,复杂度为 O ( n 2 ) O(n^2) O(n2)。总体复杂度较为适中,适合用于实际的无人机编队调整问题。
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 初始无人机位置 (极坐标:半径, 角度)
initial_positions = [
(100, 0),
(98, 40.10),
(112, 80.21),
(105, 119.75),
(98, 159.86),
(112, 199.96),
(105, 240.07),
(98, 280.17),
(112, 320.28)
]
# 将极坐标转换为笛卡尔坐标
def polar_to_cartesian(r, theta_deg):
theta_rad = np.radians(theta_deg)
x = r * np.cos(theta_rad)
y = r * np.sin(theta_rad)
return x, y
# 理想的均匀分布无人机目标位置 (极坐标,半径为100米,角度均匀分布)
def ideal_positions(n=9, radius=100):
return [(radius, 40 * i) for i in range(n)]
# 计算最小二乘法误差函数
def error_function(xy_flat, ideal_cartesian):
xy = xy_flat.reshape(-1, 2) # 每架无人机的 (x, y)
error = 0
for i in range(len(xy)):
error += (xy[i, 0] - ideal_cartesian[i][0]) ** 2 + (xy[i, 1] - ideal_cartesian[i][1]) ** 2
return error
# 运行位置优化
def optimize_positions(initial_cartesian, ideal_cartesian):
# 初始无人机位置转化为一维数组
initial_flat = np.array(initial_cartesian).flatten()
# 使用最小二乘法优化
result = minimize(error_function, initial_flat, args=(ideal_cartesian), method='BFGS')
optimized_flat = result.x
optimized_positions = optimized_flat.reshape(-1, 2)
return optimized_positions
# 绘制无人机位置
def plot_positions(positions, title):
x, y = zip(*positions)
plt.figure(figsize=(6, 6))
plt.plot(x, y, 'bo-', label='无人机位置')
plt.plot(0, 0, 'ro', label='FY00 (圆心)')
plt.xlim(-120, 120)
plt.ylim(-120, 120)
plt.gca().set_aspect('equal', adjustable='box')
plt.title(title)
plt.xlabel('X 坐标')
plt.ylabel('Y 坐标')
plt.legend()
plt.grid(True)
plt.show()
# 主程序
if __name__ == "__main__":
# 将初始位置从极坐标转换为笛卡尔坐标
initial_cartesian = [polar_to_cartesian(r, theta) for r, theta in initial_positions]
# 计算理想的均匀分布位置
ideal_polar = ideal_positions()
ideal_cartesian = [polar_to_cartesian(r, theta) for r, theta in ideal_polar]
# 优化无人机位置
optimized_positions = optimize_positions(initial_cartesian, ideal_cartesian)
# 绘制初始位置和优化后位置
plot_positions(initial_cartesian, "初始无人机位置")
plot_positions(optimized_positions, "优化后无人机位置")
问题2要求设计无人机集群在其他编队形态(如锥形编队)中的位置调整方案,并使用纯方位无源定位的方法来保持或调整队形。锥形编队具有特定的几何结构,直线上相邻无人机的间距相等。本题目仍然考虑无人机接收信号调整位置的方案,我们需要为该编队设计合适的定位和调整模型。
锥形编队中的无人机按线性排列,并且相邻两架无人机的距离保持恒定(如题目中相邻无人机间距为50米)。设无人机的数量为 N N N,锥形编队的无人机编号为 F Y 1 , F Y 2 , . . . , F Y N FY_1, FY_2, ..., FY_N FY1,FY2,...,FYN。根据几何特性,无人机的理想位置可以表示为一条直线,且相邻无人机的间距为50米。我们可以将该直线的方向用极坐标角度 θ \theta θ表示,其中 θ \theta θ为直线与某基准轴的夹角。
设第 i i i架无人机的理想位置为 ( x i , y i ) (x_i, y_i) (xi,yi),则可以表示为:
x i = x 1 + ( i − 1 ) ⋅ d ⋅ cos ( θ ) , y i = y 1 + ( i − 1 ) ⋅ d ⋅ sin ( θ ) , (i = 1, 2, ..., N) x_i = x_1 + (i-1) \cdot d \cdot \cos(\theta), \quad y_i = y_1 + (i-1) \cdot d \cdot \sin(\theta), \quad \text{(i = 1, 2, ..., N)} xi=x1+(i−1)⋅d⋅cos(θ),yi=y1+(i−1)⋅d⋅sin(θ),(i = 1, 2, ..., N)
其中 x 1 , y 1 x_1, y_1 x1,y1为第一个无人机的坐标, d = 50 d = 50 d=50米为相邻无人机之间的距离, θ \theta θ为直线的倾斜角度。
由于无人机在保持电磁静默时无法主动发射电磁波信号,因此只能根据接收的信号提取方位信息来调整自身位置。方位信息指的是无人机之间连线的夹角。我们引入夹角的几何公式来进行位置的调整。假设无人机接收到来自两架信号发射无人机的信号,则根据方向信息 α i j \alpha_{ij} αij的公式可以计算夹角:
cos ( α i j ) = ( x i − x k ) ( x j − x k ) + ( y i − y k ) ( y j − y k ) ( x i − x k ) 2 + ( y i − y k ) 2 ⋅ ( x j − x k ) 2 + ( y j − y k ) 2 \cos(\alpha_{ij}) = \frac{(x_i - x_k)(x_j - x_k) + (y_i - y_k)(y_j - y_k)}{\sqrt{(x_i - x_k)^2 + (y_i - y_k)^2} \cdot \sqrt{(x_j - x_k)^2 + (y_j - y_k)^2}} cos(αij)=(xi−xk)2+(yi−yk)2⋅(xj−xk)2+(yj−yk)2(xi−xk)(xj−xk)+(yi−yk)(yj−yk)
其中 ( x i , y i ) , ( x j , y j ) , ( x k , y k ) (x_i, y_i), (x_j, y_j), (x_k, y_k) (xi,yi),(xj,yj),(xk,yk)分别为三架无人机的位置坐标。
为了确保锥形编队保持直线形态,需要通过信号接收和位置调整来逐步修正位置。假设通过信号发射的几架无人机可以被用作参考点,剩余的无人机根据夹角信息调整位置。我们可以设计如下调整步骤:
参考信号:设第一个无人机 F Y 1 FY_1 FY1和最后一个无人机 F Y N FY_N FYN发射信号,其他无人机被动接收信号。通过无人机之间的夹角 α \alpha α以及理想的几何形态(等间距直线),可以计算出位置的偏差。
误差计算:定义每架无人机与其理想位置之间的误差为:
Δ x i = x i real − x i ideal , Δ y i = y i real − y i ideal \Delta x_i = x_i^{\text{real}} - x_i^{\text{ideal}}, \quad \Delta y_i = y_i^{\text{real}} - y_i^{\text{ideal}} Δxi=xireal−xiideal,Δyi=yireal−yiideal
其中 x i real , y i real x_i^{\text{real}}, y_i^{\text{real}} xireal,yireal是无人机当前的实际位置, x i ideal , y i ideal x_i^{\text{ideal}}, y_i^{\text{ideal}} xiideal,yiideal是其理想位置。通过多次迭代调整无人机位置,将误差逐步减小至最小。
E = ∑ i = 1 N ( ( x i real − x i ideal ) 2 + ( y i real − y i ideal ) 2 ) E = \sum_{i=1}^{N} \left( (x_i^{\text{real}} - x_i^{\text{ideal}})^2 + (y_i^{\text{real}} - y_i^{\text{ideal}})^2 \right) E=∑i=1N((xireal−xiideal)2+(yireal−yiideal)2)
通过最小化该误差函数,我们可以逐步将无人机调整到理想的锥形编队队形。
x i ( k + 1 ) = x i ( k ) − η ∂ E ∂ x i , y i ( k + 1 ) = y i ( k ) − η ∂ E ∂ y i x_i^{(k+1)} = x_i^{(k)} - \eta \frac{\partial E}{\partial x_i}, \quad y_i^{(k+1)} = y_i^{(k)} - \eta \frac{\partial E}{\partial y_i} xi(k+1)=xi(k)−η∂xi∂E,yi(k+1)=yi(k)−η∂yi∂E
其中 η \eta η是学习率, ∂ E ∂ x i \frac{\partial E}{\partial x_i} ∂xi∂E和 ∂ E ∂ y i \frac{\partial E}{\partial y_i} ∂yi∂E分别是误差函数对 x i x_i xi和 y i y_i yi的偏导数。
考虑到无人机初始位置偏差较大,调整过程需要通过多次迭代来进行。每次选择不同的参考信号发射无人机,如选择 F Y 1 , F Y 2 , F Y 3 FY_1, FY_2, FY_3 FY1,FY2,FY3发射信号,剩余无人机根据接收到的夹角信息调整位置。随着迭代次数的增加,每架无人机的位置会逐步逼近理想的直线位置。
为保持锥形编队的稳定性,可以对位置调整过程加入约束条件。主要的约束包括:
L = E + λ ∑ i = 1 N − 1 ( ( ( x i + 1 − x i ) 2 + ( y i + 1 − y i ) 2 ) − d 2 ) L = E + \lambda \sum_{i=1}^{N-1} \left( \left( (x_{i+1} - x_i)^2 + (y_{i+1} - y_i)^2 \right) - d^2 \right) L=E+λ∑i=1N−1(((xi+1−xi)2+(yi+1−yi)2)−d2)
其中 λ \lambda λ为拉格朗日乘数, d d d为相邻无人机的理想距离。
由于误差函数是非线性函数,可以使用牛顿法或梯度下降法进行求解。牛顿法的收敛速度较快,但计算二阶导数较为复杂;梯度下降法计算简单但可能收敛较慢。根据实际问题的需要,选择合适的优化算法。
通过最小二乘法和迭代调整的方式,无人机能够在多次迭代后逐步逼近其理想的编队位置。引入约束条件可以有效保持锥形编队的结构,确保无人机相邻距离和整体方向的稳定性。该方法在复杂场景下仍具有良好的收敛性和计算效率。
import numpy as np
import matplotlib.pyplot as plt
# 定义无人机的数量和相邻无人机之间的理想距离
N = 10 # 假设有10架无人机
d = 50 # 相邻无人机的理想距离,单位为米
# 定义学习率和迭代次数
learning_rate = 0.01
iterations = 1000
# 初始化无人机的实际位置,随机生成一定的偏差
np.random.seed(0)
x_real = np.linspace(0, (N-1) * d, N) + np.random.randn(N) * 10 # x轴随机偏差
y_real = np.random.randn(N) * 10 # y轴随机偏差
# 理想的无人机位置(沿直线排列)
x_ideal = np.linspace(0, (N-1) * d, N)
y_ideal = np.zeros(N)
# 定义误差函数:最小化实际位置与理想位置的平方误差
def compute_error(x_real, y_real, x_ideal, y_ideal):
return np.sum((x_real - x_ideal) ** 2 + (y_real - y_ideal) ** 2)
# 计算梯度:误差函数对x和y的偏导数
def compute_gradient(x_real, y_real, x_ideal, y_ideal):
grad_x = 2 * (x_real - x_ideal)
grad_y = 2 * (y_real - y_ideal)
return grad_x, grad_y
# 使用梯度下降法进行位置调整
error_history = []
for i in range(iterations):
# 计算当前的误差
error = compute_error(x_real, y_real, x_ideal, y_ideal)
error_history.append(error)
# 计算梯度
grad_x, grad_y = compute_gradient(x_real, y_real, x_ideal, y_ideal)
# 更新无人机位置
x_real -= learning_rate * grad_x
y_real -= learning_rate * grad_y
# 打印每100次迭代的误差
if i % 100 == 0:
print(f"Iteration {i}, Error: {error}")
# 绘制误差收敛曲线
plt.figure(figsize=(10, 6))
plt.plot(error_history)
plt.title("Error Convergence Over Iterations")
plt.xlabel("Iterations")
plt.ylabel("Error")
plt.grid(True)
plt.show()
# 绘制无人机的初始位置、理想位置和调整后的实际位置
plt.figure(figsize=(10, 6))
plt.scatter(x_real, y_real, color='r', label='Adjusted Real Positions')
plt.scatter(x_ideal, y_ideal, color='g', label='Ideal Positions')
plt.legend()
plt.title("Drone Positions Before and After Adjustment")
plt.xlabel("X Position (m)")
plt.ylabel("Y Position (m)")
plt.grid(True)
plt.show()
查看完整思路详见:
【腾讯文档】2024高教社杯全国大学生数学建模竞赛全题目深度解析(建模过程+代码实现+论文指导)
https://docs.qq.com/doc/DSGdreXpIYlN2RUlZ