当前位置:   article > 正文

2023深圳杯(东三省)数学建模C题 - 无人机协同避障航迹规划(论文+代码+思路)

无人机协同避障航迹规划

摘要

本文主要研究了无人机在特定环境下的航线优化问题,我们通过数学模型和优化算法,实现了无人机飞行时间的最小化,进一步提升了无人机的作业效率。具体研究问题包括无人机在指定速度和指定距离条件下的最优航线选择,以及参数变化对最优航线选择的影响。

在问题一中,我们首先针对两架无人机的飞行条件,建立了飞行时间的数学模型,设定目标为无人机A最先到达目的地,使用算法求解最优飞行路径,并通过仿真实验验证了模型的准确性。

在问题二中,我们考虑无人机B先飞行,无人机A后飞行的情况,同样设定无人机B最先到达目的地为目标,重新进行算法优化,得到了新的最优航线,并进行了仿真实验验证。

在问题三中,我们分析了B站点到圆心距离的变化对最优航线的影响。结果显示,距离的变化会影响无人机飞行的时间,进而影响无人机的最优航线选择,随着B站点到圆心的距离的增大,无人机A的飞行路径选择不会改变,但无人机B的飞行路径选择可能会发生改变。

在问题四中,我们分析了B机的飞行速度的变化对最优航线的影响。我们发现,在一定范围内,速度的增加会缩短无人机的飞行时间,但并不总是导致最优航线的改变。揭示了无人机的速度和优先级如何影响飞行路径和绕行时间,尤其是优先级在路径选择和绕行时间决定中的核心作用,甚至在某些情况下可以超越速度的影响,为无人机航线优化提供了重要的理论指导。

在问题五中,我们进一步考察了B机的飞行速度和B站点到圆心距离同时变化对最优航线的影响。研究发现,这两种参数的变化会对最优航线产生复合影响,无人机的速度、初始距离以及优先级都会显著影响其飞行时间,其中优先级是决定飞行路径和绕行时间的关键因素。因此,在实际的无人机航线规划中,应综合这些因素以确保无人机在避免相遇的同时,最大限度地减少飞行时间。

关键词:无人机航线优化,飞行时间最小化,数学模型,算法优化,参数变化影响。

一、 问题重述

1 . 1 背景

平面上A、B两个无人机站分别位于半径为500 m的障碍圆两边直径的延长线上,A站距离圆心1 km,B站距离圆心3.5 km。两架无人机分别从A、B两站同时出发,以恒定速率10 m/s飞向B站和A站执行任务。飞行过程中两架无人机必须避开障碍圆、并且不得碰面(即两架无人机的连线必须保持与障碍圆处于相交状态)。无人机的转弯半径不小于30 m。

1 . 2 重述

问题一涉及两架无人机的飞行路径优化。任务是确定一种飞行路径,使得两架无人机中第一架到达目的地的时间最短。需要计算并提出这样的飞行路径方案。

问题二同样是关于两架无人机的飞行路径优化,但目标稍有不同。任务是找到一种飞行路径方案,使得第二架无人机到达目的地所需的时间最短。

问题三关注的是地理位置因素对无人机飞行路径的影响。具体而言,当B站点到圆心的距离发生变化(同时其他参数保持不变)时,问题一和问题二中的最优飞行路径将如何改变。

问题四则侧重于无人机的飞行速度对飞行路径的影响。研究的是当B机的恒定速率在[10,30] m/s范围内变化(同时其他参数保持不变)时,问题一和问题二中的最优飞行路径将如何变化。

问题五将地理位置和飞行速度两个因素同时考虑进来。在B机的恒定速率在[10,50] m/s范围内变化、B站点到圆心的距离在[1,10] km范围内变化(同时其他参数保持不变)的情况下,问题二中的最优飞行路径将会如何改变。这需要在多个参数变化的情况下进行优化,并找出符合条件的最优飞行路径。

二、 模型的假设

针对本文题目,提出以下假设建模思路:

•  假设没有其他影响因素:我们假设无人机的飞行路径不受任何外部因素(例如风力、气候变化、地形等)的影响;

•  假设无人机的飞行时间可以忽略:我们假设无人机从起飞到降落的时间可以忽略不计,因此,无人机的飞行时间等于无人机在空中的总飞行时间;

•  假设无人机具有无限的燃料:为了简化问题,我们假设无人机的燃料供应充足,不需要考虑在飞行过程中可能出现的燃料耗尽问题。

三、 符号说明

符号

描述

r

障碍圆的半径

dA

A站距离圆心的距离

dB

B站距离圆心的距离

v

无人机的飞行速度

L_A_upper

无人机A绕过障碍圆上侧的路径长度

L_A_lower

无人机A绕过障碍圆下侧的路径长度

L_A

无人机A选择的路径长度

direction_A

无人机A选择的飞行方向("upper"或"lower")

direction_B

无人机B选择的飞行方向("upper"或"lower")

L_B

无人机B选择的路径长度,包含等待无人机A穿过障碍圆的时间

T_A

无人机A的飞行时间

T_B

无人机B的飞行时间

theta

用于绘制圆弧的角度变量

注意,这里的"A"和"B"分别指代两架无人机。"upper"和"lower"分别表示无人机绕过障碍圆的上侧或下侧。

四、 问题分析

4 . 1 问题一分析

问题1寻求的是最小化第一个到达目的地的无人机的飞行时间。这需要考虑如何有效地规避障碍,并选择最优的飞行路径,以便在满足所有约束的情况下,最大程度地减少飞行时间。

4 . 2 问题二分析

问题2关注的是如何最小化第二架无人机到达目的地的时间。这需要第二架无人机在第一架无人机通过障碍区域后,选择合适的飞行路径以最小化飞行时间。同时,第二架无人机还需要考虑在第一架无人机飞行过程中的等待时间。

4 . 3 问题三分析

问题3分析的是当B站点到圆心的距离发生变化时,两个问题中的最优飞行路径会如何变化。需要考虑的关键因素包括B站点位置变化对飞行路径及飞行时间的影响。

4 . 4 问题四分析

问题4关注的是当B机的恒定速率在[10,30] m/s内变化时,两个问题中的最优飞行路径会如何变化。速度的变化将直接影响无人机的飞行时间,从而可能改变无人机选择的最优飞行路径。

4 . 5 问题五分析

问题5考虑的是当B机的恒定速率在[10,50] m/s内变化,且B站点到圆心的距离在[1,10] km内变化时,问题2中的最优飞行路径会如何变化。这个问题涉及到两个关键参数的同时变化,需要考虑这些参数变化对飞行路径及飞行时间的联合影响。

五、 模型的建立与求解

5 . 1 问题一模型的建立与求解

首先,这个模型的出发点在于,为了避开中心区域的障碍物,无人机A和无人机B需要选择上方或下方的路径进行飞行。这意味着每个无人机都有两条可能的路径。

5 . 1 . 1 模型的建立

(1)定义参数:我们首先定义了问题中给出的参数。这些包括障碍圆的半径r(500米),无人机A和B的初始位置分别距离圆心的距离dA(1000米)和dB(3500米),以及无人机的速度v(10 m/s)。这些参数都将用于后续的路径长度和飞行时间的计算。

(2)计算路径长度:对于无人机A,它可以选择绕过障碍圆的上侧或下侧。对于这两条路径,我们分别计算了路径长度。路径长度由两部分组成:一部分是无人机从初始位置到达障碍圆边缘的直线距离,另一部分是无人机沿着障碍圆边缘飞行的半圆路径。这两部分的长度可以通过勾股定理和圆周长的计算公式计算得出。

对于直线距离部分,使用的是勾股定理。例如,对于无人机A,上侧和下侧的直线距离分别可以通过以下公式计算:

上侧:√[(dA - r)² + r²]

下侧:√[(dA + r)² + r²]

对于半圆路径部分,其长度为半圆的周长,可以通过以下公式计算:πr。

综上,无人机A的上侧和下侧的路径长度分别为:

上侧:L_A_upper = πr + √[(dA - r)² + r²]

下侧:L_A_lower = πr + √[(dA + r)² + r²]

计算飞行时间:飞行时间是路径长度除以飞行速度v,即:

无人机A的飞行时间:T_A = L_A / v

对于无人机B,需要加上等待无人机A通过障碍圆的时间,即半圆周长除以速度,故无人机B的飞行时间为:

无人机B的飞行时间:T_B = (L_B + πr) / v

(3)选择最优路径:根据计算出的路径长度,我们选择长度最短的路径作为无人机A的飞行路径,也就是说,无人机A将沿着这条路径进行飞行。对于无人机B,由于需要等待无人机A通过障碍圆,所以它将选择与无人机A相反的路径方向。

5 . 1 . 2 模型的求解

  1. 计算无人机A的飞行时间:对于无人机A,其飞行时间是其最优路径长度除以飞行速度,也就是说,如果无人机A选择的路径长度更短,那么其飞行时间就会更短。

(2)计算无人机B的飞行时间:对于无人机B,由于需要等待无人机A通过障碍圆,所以它的飞行路径包括等待时间所对应的路径长度。这部分长度就是无人机A绕过圆的路径长度,等于半圆的周长。然后再加上无人机B从初始位置到达障碍圆边缘和沿着障碍圆边缘飞行的路径长度,这样就可以得到无人机B的总路径长度。同样地,无人机B的飞行时间是其路径长度除以飞行速度。

在模型运行结束后,我们得到了以下的结果。在这里,我们可以看到无人机A和B的最优路径选择以及它们各自的飞行时间:

表1: 模型运行结果

无人机

最优路径方向

行时间 (秒)

A

上侧

227.7903107981444

B

下侧

575.9004833623661

这个结果告诉我们,无人机A应该选择沿障碍圆的上侧绕行,其飞行时间大约是227.7903107981444秒。相对地,无人机B则应该选择沿障碍圆的下侧绕行,其飞行时间大约是575.9004833623661秒。无人机B的飞行时间比无人机A的飞行时间要长,这是因为无人机B在飞行过程中需要等待无人机A通过障碍圆。这个结果反映了我们在模型构建过程中的考虑,即我们的目标是最小化无人机到达目的地的最大时间,也就是说,我们希望尽可能地减少无人机B的飞行时间。

  1. 模型的可视化:为了更直观地展示无人机A和B的飞行路径,我们用matplotlib库绘制了飞行路径图。在这个图中,无人机A和B的起始位置、障碍圆、以及无人机A和B的飞行路径都清晰地表示出来,这有助于我们理解无人机如何选择最优路径进行飞行。

5 . 2 问题二模型的建立与求解

问题二和问题一的区别在于优先级的转变,即从优先级A>B转变成优先级B>A,问题的求解是依据问题一的模型,进行优先级条件的转变,从而进行计算得到结果。

当无人机B的优先级更高的时候,那么无人机B会优先选择最短的路径,而无人机A则需要等待无人机B通过障碍圆。公式的变化主要发生在计算无人机B和无人机A的飞行路径和飞行时间的部分。

对于无人机B,路径选择和飞行时间的计算将和之前计算无人机A的方式一样:

上侧:L_B_upper = πr + √[(dB - r)² + r²]

下侧:L_B_lower = πr + √[(dB + r)² + r²]

如果 L_B_upper <= L_B_lower,那么无人机B选择上侧路径,否则选择下侧路径。无人机B的飞行时间为:T_B = L_B / v。

无人机A需要等待无人机B通过障碍圆,所以无人机A的飞行时间需要增加无人机B通过障碍圆所需的时间,计算公式如下:

无人机A的飞行时间:T_A = (L_A + πr) / v。

无人机A和B选择的路径应该是不同的,以避免碰撞,所以在计算无人机A的路径长度时,应该选择无人机B没有选择的那一侧。

以上所述的情况是在无人机A和B都需要绕过障碍圆的情况下。如果某个无人机的目标地点在障碍圆的直线路径上,那么这个无人机可以直线飞行,而另一个无人机需要绕过障碍圆。

表2: 模型运行结果

无人机

最优路径方向

行时间 (秒)

A

下侧

315.19351568790864

B

上侧

461.2177591944006

这个结果告诉我们,无人机A应该选择沿障碍圆的下侧绕行,其绕行时间大约是315.19351568790864秒。相对地,无人机B则应该选择沿障碍圆的上侧绕行,其绕行时间大约是461.2177591944006秒。这个结果反映了我们在模型构建过程中的考虑,即我们的目标是最小化无人机到达目的地的最大时间,也就是说,我们希望尽可能地减少无人机B的飞行时间。

  1. 模型的可视化:为了更直观地展示无人机A和B的飞行路径,我们用matplotlib库绘制了飞行路径图。在这个图中,无人机A和B的起始位置、障碍圆、以及无人机A和B的飞行路径都清晰地表示出来,这有助于我们理解无人机如何选择最优路径进行飞行。

5 . 3 问题三模型的建立与求解

求解该问题的模型依然是依据问题一的模型进行改进,所需的计算路径以及时间的公式也是第一题提出的计算公式,只是对部分参数进行了改变。

5 . 3 . 1 模型的建立

1. 定义函数`drone_path`,该函数根据给定的B站到圆心的距离dB和优先级来确定无人机A和B的最优飞行路径。首先,该函数会分别计算无人机A和B绕过障碍圆上侧和下侧的路径长度。这里使用了Pythagorean theorem(勾股定理)来计算从A或B到圆边缘的直线距离,并添加了半个圆周的距离(即πr)来获得绕过圆的总路径长度。

2. 对于无人机A和B,我们需要判断绕过障碍圆上侧和下侧的路径长度哪一个更短,这可以通过比较`L_A_upper`与`L_A_lower`,`L_B_upper`与`L_B_lower`的值来实现。

3. 如果优先级为'A',那么无人机A将选择路径长度最短的一侧作为飞行路径,而无人机B将选择另一侧;反之,如果优先级为'B',则无人机B选择路径长度最短的一侧作为飞行路径,无人机A选择另一侧。

4. 最后,该函数会计算无人机A和B的飞行时间,输出飞行方向和时间,以及进行可视化。

为了探索当B站点到圆心的距离变化时,最优航迹会发生什么变化,我们可以针对不同的dB值运行`drone_path`函数,如dB_values = [1000, 2000, 3000, 4000, 5000]。通过比较dB值变化时,无人机A和B的飞行路径和时间,可以得出最优航迹的变化情况。

5 . 3. 2 模型的求解

1. 首先,对于每一个给定的dB值,我们分别设定优先级为'A'和'B',然后调用`drone_path`函数。

2. `drone_path`函数会根据设定的优先级,选择最短的飞行路径,并计算出飞行时间。

3. 输出并可视化飞行方向和时间。

dB (m)

优先级

A最优行方向

A行时间 (秒)

B最优行方向

B行时间 (秒)

1000

A

upper

227.79

lower

330.90

1000

B

lower

315.19

upper

243.50

2000

A

upper

227.79

lower

427.74

2000

B

lower

315.19

upper

330.90

3000

A

upper

227.79

lower

526.34

3000

B

lower

315.19

upper

427.74

4000

A

upper

227.79

lower

625.56

4000

B

lower

315.19

upper

526.34

5000

A

upper

227.79

lower

725.06

5000

B

lower

315.19

upper

625.56

4. 通过比较在不同dB值时,无人机A和B的飞行路径和时间,可以观察到最优航迹的变化情况。

 

结论:

对于问题1(无人机A的优先级最高):

如果dB的值增大,那么B站点离圆心越远,那么无论A无人机如何选择路径,无人机B都将花费更长的时间到达目标。因此,这不会影响A无人机的路径选择。它将始终选择飞行时间最短的路径(无论是上方还是下方)。

对于问题2(无人机B的优先级最高):

如果dB的值增大,那么无人机B的最短路径可能会发生改变。对于较小的dB值,如果绕过障碍圆的下方的路径较短,那么B无人机可能会选择这个路径。但是,如果dB的值增大到一定程度,那么绕过障碍圆的上方的路径可能会变得更短,因为这将减少无人机B的飞行距离。

这里需要注意的是,对于无人机A和B的飞行路径选择,都需要考虑无人机的转弯半径。如果障碍圆的半径过小,那么无人机可能无法在障碍圆的上方或下方转弯。在这种情况下,无人机可能需要选择另一个方向或者等待障碍圆变得足够大才能飞过。

总的来说,随着B站点到圆心的距离的增大,无人机A的飞行路径选择不会改变,但无人机B的飞行路径选择可能会发生改变。

5 . 4 问题四模型的建立与求解

求解该问题的模型依然是依据问题一的模型进行改进,所需的计算路径以及时间的公式也是第一题提出的计算公式,只是对B飞机的速度参数进行了改变,对比不同速度下问题一模型的求解过程。

我们可以通过在多个无人机B的速度值上运行上面的代码来理解无人机B的速度变化对无人机A和B的飞行路径选择的影响。在这个过程中,无人机A和B的优先级可以互换。

对于问题1(无人机A的优先级最高):

如果无人机B的速度增大,那么无人机B到达目标站点所需的时间会减少。然而,这并不影响无人机A的飞行路径选择,因为我们只关心无人机A到达目标站点所需的时间。所以,无人机A的飞行路径不会因为无人机B的速度的改变而改变。

对于问题2(无人机B的优先级最高):

如果无人机B的速度增大,那么无人机B到达目标站点所需的时间会减少。因此,无人机A需要选择那条能使自己避开无人机B,并且使无人机B到达目标站点所需的时间最短的飞行路径。这可能会导致无人机A的飞行路径发生改变。

无人机B的速度v_B(m/s)

优先级

无人机A绕行方向

无人机A绕行时间(s)

无人机B绕行方向

无人机B绕行时间(s)

10.0

A

upper

227.79

lower

575.90

10.0

B

lower

315.19

upper

476.93

15.0

A

upper

227.79

lower

380.44

15.0

B

lower

315.19

upper

314.46

20.0

A

upper

227.79

lower

284.02

20.0

B

lower

315.19

upper

234.54

25.0

A

upper

227.79

lower

226.59

25.0

B

lower

315.19

upper

187.00

30.0

A

upper

227.79

lower

188.48

30.0

B

lower

315.19

upper

155.48

根据模型求解结果,得出以下结论:

(1)当无人机B的速度v_B增加时,无论优先级如何,无人机B的绕行时间都会减少,这是因为速度和时间成反比。

(2)当优先级设置为A时,无人机A总是选择绕行时间最短的upper路径,而无人机B则选择lower路径;反之,当优先级设置为B时,无人机A选择lower路径,无人机B选择upper路径。

(3)当优先级设置为A时,无人机A的绕行时间保持不变,因为它始终选择绕行时间最短的路径。反之,当优先级设置为B时,无人机A的绕行时间更长,因为它必须选择非优选路径。

(4)在某些情况下,即使无人机B的速度v_B更高,但由于优先级的影响,无人机B的绕行时间可能仍然长于无人机A。这表明,除了速度因素外,路径选择(由优先级决定)也对绕行时间有重要影响。

这些结论说明,在实际飞行路径规划中,应综合考虑无人机的速度和优先级等因素,以确保无人机能在避免相遇的同时,尽可能减少绕行时间。

4. 通过比较在不同vB值时,无人机A和B的飞行路径和时间,可以观察到最优航迹的变化情况。

5 . 5 问题五模型的建立与求解

求解该问题的模型是在对问题四的模型进行优化,所需的计算路径以及时间的公式也是第一题提出的计算公式,在问题四增加了可变速度的因素影响之后,本题在此基础上再增加一个可变距离的影响【1,10】km

我们可以通过在多个无人机B的速度值以及多个可变距离的组合情况上运行上面的代码来理解无人机B的速度变化和距离变化的组合变化情况来判断对无人机A和B的飞行路径选择的影响。在这个过程中,无人机A和B的优先级可以互换。

模型求解:

无人机B速度 (m/s)

无人机B的距离 (m)

无人机A的飞行时间 (秒)

无人机B的飞行时间 (秒)

10.0

1000.0

315.19

243.50

10.0

3250.0

315.19

452.30

10.0

5500.0

315.19

675.28

10.0

7750.0

315.19

899.51

10.0

10000.0

315.19

1124.10

20.0

1000.0

315.19

117.82

20.0

3250.0

315.19

222.22

20.0

5500.0

315.19

333.71

20.0

7750.0

315.19

445.83

20.0

10000.0

315.19

558.12

30.0

1000.0

315.19

77.68

30.0

3250.0

315.19

147.27

30.0

5500.0

315.19

221.60

30.0

7750.0

315.19

296.35

30.0

10000.0

315.19

371.21

40.0

1000.0

315.19

57.93

40.0

3250.0

315.19

110.13

40.0

5500.0

315.19

165.88

40.0

7750.0

315.19

221.93

40.0

10000.0

315.19

278.08

50.0

1000.0

315.19

46.19

50.0

3250.0

315.19

87.95

50.0

5500.0

315.19

132.54

50.0

7750.0

315.19

177.39

50.0

10000.0

315.19

222.31

根据模型求解结果,得出以下结论:

(1)无论无人机B的速度v_B和初始距离dB如何变化,无人机A的飞行时间始终为315.19秒,这是因为无人机A的速度、起始和目标位置以及绕行方向在所有情况下都是固定的。

(2)随着无人机B的速度v_B的增加,其飞行时间显著减少。这是因为速度越大,无人机B绕过障碍物所需的时间就越短。

(3)对于固定的速度v_B,随着无人机B的初始距离dB的增加,其飞行时间逐渐增加。这是因为初始距离dB越大,无人机B需要飞行的距离就越长,从而飞行时间也越长。

(4)在所有测试的情况下,无人机B的飞行时间都小于无人机A的飞行时间。这是因为无人机B具有较高的优先级,无论何时都选择较短的路径,而无人机A则需要选择较长的路径。这些结论说明,在实际飞行路径规划中,应综合考虑无人机的速度和优先级等因素,以确保无人机能在避免相遇的同时,尽可能减少绕行时间。

通过比较在不同vB值时,无人机A和B的飞行路径和时间,可以观察到最优航迹的变化情况。

六、优缺点

6 . 1 模型的优点

1. 准确性:本模型基于几何和动力学原理,准确地计算了无人机在设定速度和初始位置的情况下的飞行时间。如果无人机的飞行性能、环境条件和飞行路径准确地满足了模型的假设,那么模型的预测结果应该非常准确。

2. 可解释性:模型的理论基础明确,对无人机飞行时间的影响因素有明确的解释。这使得我们可以理解模型的输出,并预测修改模型输入(例如无人机的速度或初始位置)对结果的影响。

3. 可扩展性:此模型可以用于任何满足模型假设的无人机飞行时间预测。例如,它可以用于其他具有相似飞行特性和环境条件的无人机。

6 . 2 模型的缺点

1. 假设限制:模型假设无人机以恒定速度飞行,实际上无人机的速度可能会受到多种因素(如风力、载重等)的影响而改变。此外,模型还假设无人机飞行路径是固定的,而实际中无人机可能会根据实时环境数据调整飞行路径。

2. 简化处理:模型简化了无人机避障的问题,假设无人机可以直接绕过障碍物。然而,实际上无人机的避障可能需要复杂的规划和控制策略,特别是在有多个障碍物或其他飞行器的情况下。

3. 缺乏鲁棒性:模型没有考虑实际无人机飞行中可能出现的不确定性,如无人机的性能变化、环境条件的变化、导航错误等。这些因素可能导致模型预测的飞行时间与实际飞行时间有较大的偏差。

4. 计算效率:模型需要进行多次计算才能得出结果,对于需要快速得出结果的应用场景,可能会有一些效率问题。

6 . 3 模型的改进与推广

改进:

1. 添加变速飞行的模型:现在的模型假设无人机以恒定速度飞行,我们可以添加变速飞行的模型,以更准确地模拟无人机的飞行状态。

2. 考虑更复杂的飞行路径:模型现在只考虑了简单的飞行路径,我们可以考虑更复杂的飞行路径,比如避开障碍物或者其他无人机。

3. 引入不确定性:可以在模型中引入不确定性,例如无人机的性能变化、环境条件的变化、导航错误等。

4. 优化计算效率:可以研究并应用更有效的算法或技术来提高模型的计算效率。

推广:

1. 将模型应用于不同类型的无人机:模型现在是为特定类型的无人机设计的,可以将其推广到其他类型的无人机。

2. 用于无人机的路径规划:这个模型可以用于无人机的路径规划,预测在不同路径上无人机的飞行时间,以选择最优路径。

3. 将模型应用于无人机管理和调度系统:例如,在多无人机协同任务中,可以通过预测各无人机的飞行时间来协调调度,实现效率最优化。

4. 教育和研究:这个模型可以用于无人机相关的教学和研究,帮助学习者和研究者理解无人机的飞行时间与其飞行速度、飞行路径等因素的关系。

代码

第一问

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 参数设定
  4. r = 500 # 障碍圆半径
  5. dA = 1000 # A站距离圆心
  6. dB = 3500 # B站距离圆心
  7. v = 10 # 无人机速度
  8. # 计算绕过障碍圆的上侧和下侧的路径长度
  9. L_A_upper = np.pi * r + np.sqrt((dA-r)**2 + r**2)
  10. L_A_lower = np.pi * r + np.sqrt((dA+r)**2 + r**2)
  11. # 选择路径长度最短的那一侧作为飞行路径
  12. if L_A_upper <= L_A_lower:
  13. L_A = L_A_upper
  14. direction_A = 'upper'
  15. direction_B = 'lower' # B will take the other direction
  16. else:
  17. L_A = L_A_lower
  18. direction_A = 'lower'
  19. direction_B = 'upper' # B will take the other direction
  20. # For B, it needs to wait for A to cross the circle. So, it's time is its path length plus A's time to cross the circle
  21. # (which is circumference divided by speed).
  22. if direction_B == 'upper':
  23. L_B = np.pi * r + np.sqrt((dB-r)**2 + r**2) + (np.pi * r / v)
  24. else:
  25. L_B = np.pi * r + np.sqrt((dB+r)**2 + r**2) + (np.pi * r / v)
  26. # 计算飞行时间
  27. T_A = L_A / v
  28. T_B = L_B / v
  29. print(f"无人机A应该沿障碍圆的{direction_A}方向绕行")
  30. print(f"无人机A的绕行时间为:{T_A}秒")
  31. print(f"无人机B应该沿障碍圆的{direction_B}方向绕行")
  32. print(f"无人机B的绕行时间为:{T_B}秒")
  33. # 可视化
  34. fig, ax = plt.subplots()
  35. circle = plt.Circle((0, 0), r, color='r', fill=False)
  36. ax.add_artist(circle)
  37. ax.plot([-dA, dB], [0, 0], 'ko') # 绘制A、B两点
  38. ax.plot([-dA, dB], [0, 0], 'k--') # 绘制AB连线
  39. # 绘制最优路径
  40. theta = np.linspace(-np.pi/2, np.pi/2, 100)
  41. if direction_A == 'upper':
  42. ax.plot(r*np.sin(theta) - dA, r*np.cos(theta), 'b-') # 无人机A的路径
  43. else:
  44. ax.plot(r*np.sin(theta) - dA, -r*np.cos(theta), 'b-') # 无人机A的路径
  45. if direction_B == 'upper':
  46. ax.plot(r*np.sin(theta) + dB, r*np.cos(theta), 'g-') # 无人机B的路径
  47. else:
  48. ax.plot(r*np.sin(theta) + dB, -r*np.cos(theta), 'g-') # 无人机B的路径
  49. ax.set_aspect('equal', 'box')
  50. plt.grid(True)
  51. plt.show()

第二问

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. # 参数设定
  4. r = 500 # 障碍圆半径
  5. dA = 1000 # A站距离圆心
  6. dB = 3500 # B站距离圆心
  7. v = 10 # 无人机速度
  8. # 计算绕过障碍圆的上侧和下侧的路径长度
  9. L_B_upper = np.pi * r + np.sqrt((dB-r)**2 + r**2)
  10. L_B_lower = np.pi * r + np.sqrt((dB+r)**2 + r**2)
  11. # 选择路径长度最短的那一侧作为飞行路径
  12. if L_B_upper <= L_B_lower:
  13. L_B = L_B_upper
  14. direction_B = 'upper'
  15. L_A = np.pi * r + np.sqrt((dA+r)**2 + r**2)
  16. direction_A = 'lower'
  17. else:
  18. L_B = L_B_lower
  19. direction_B = 'lower'
  20. L_A = np.pi * r + np.sqrt((dA-r)**2 + r**2)
  21. direction_A = 'upper'
  22. # 计算飞行时间
  23. T_A = L_A / v
  24. T_B = L_B / v
  25. print(f"无人机A应该沿障碍圆的{direction_A}方向绕行")
  26. print(f"无人机A的飞行时间为:{T_A}秒")
  27. print(f"无人机B应该沿障碍圆的{direction_B}方向绕行")
  28. print(f"无人机B的飞行时间为:{T_B}秒")
  29. # 可视化
  30. fig, ax = plt.subplots()
  31. circle = plt.Circle((0, 0), r, color='r', fill=False)
  32. ax.add_artist(circle)
  33. ax.plot([-dA, dB], [0, 0], 'ko') # 绘制A、B两点
  34. ax.plot([-dA, dB], [0, 0], 'k--') # 绘制AB连线
  35. # 绘制最优路径
  36. theta = np.linspace(-np.pi/2, np.pi/2, 100)
  37. if direction_A == 'upper':
  38. ax.plot(r*np.sin(theta) - dA, r*np.cos(theta), 'b-') # 无人机A的路径
  39. else:
  40. ax.plot(r*np.sin(theta) - dA, -r*np.cos(theta), 'b-') # 无人机A的路径
  41. if direction_B == 'upper':
  42. ax.plot(r*np.sin(theta) + dB, r*np.cos(theta), 'g-') # 无人机B的路径
  43. else:
  44. ax.plot(r*np.sin(theta) + dB, -r*np.cos(theta), 'g-') # 无人机B的路径
  45. ax.set_aspect('equal', 'box')
  46. plt.grid(True)
  47. plt.show()

第三问

  1. def drone_path(dB, priority='A'):
  2. # 参数设定
  3. r = 500 # 障碍圆半径
  4. dA = 1000 # A站距离圆心
  5. v = 10 # 无人机速度
  6. # 计算绕过障碍圆的上侧和下侧的路径长度
  7. L_A_upper = np.pi * r + np.sqrt((dA-r)**2 + r**2)
  8. L_A_lower = np.pi * r + np.sqrt((dA+r)**2 + r**2)
  9. L_B_upper = np.pi * r + np.sqrt((dB-r)**2 + r**2) + (np.pi * r / v)
  10. L_B_lower = np.pi * r + np.sqrt((dB+r)**2 + r**2) + (np.pi * r / v)
  11. # 根据优先级选择飞行路径
  12. if priority == 'A':
  13. # 优先考虑无人机A的飞行路径
  14. if L_A_upper <= L_A_lower:
  15. direction_A = 'upper'
  16. direction_B = 'lower'
  17. L_A = L_A_upper
  18. L_B = L_B_lower
  19. else:
  20. direction_A = 'lower'
  21. direction_B = 'upper'
  22. L_A = L_A_lower
  23. L_B = L_B_upper
  24. else:
  25. # 优先考虑无人机B的飞行路径
  26. if L_B_upper <= L_B_lower:
  27. direction_A = 'lower'
  28. direction_B = 'upper'
  29. L_A = L_A_lower
  30. L_B = L_B_upper
  31. else:
  32. direction_A = 'upper'
  33. direction_B = 'lower'
  34. L_A = L_A_upper
  35. L_B = L_B_lower
  36. # 计算飞行时间
  37. T_A = L_A / v
  38. T_B = L_B / v
  39. print(f"无人机A应该沿障碍圆的{direction_A}方向绕行")
  40. print(f"无人机A的飞行时间为:{T_A}秒")
  41. print(f"无人机B应该沿障碍圆的{direction_B}方向绕行")
  42. print(f"无人机B的飞行时间为:{T_B}秒")
  43. # 可视化
  44. fig, ax = plt.subplots()
  45. circle = plt.Circle((0, 0), r, color='r', fill=False)
  46. ax.add_artist(circle)
  47. ax.plot([-dA, dB], [0, 0], 'ko') # 绘制A、B两点
  48. ax.plot([-dA, dB], [0, 0], 'k--') # 绘制AB连线
  49. # 绘制最优路径
  50. theta = np.linspace(-np.pi/2, np.pi/2, 100)
  51. if direction_A == 'upper':
  52. ax.plot(r*np.sin(theta) - dA, r*np.cos(theta), 'b-') # 无人机A的路径
  53. else:
  54. ax.plot(r*np.sin(theta) - dA, -r*np.cos(theta), 'b-') # 无人机A的路径
  55. if direction_B == 'upper':
  56. ax.plot(r*np.sin(theta) + dB, r*np.cos(theta), 'g-') # 无人机B的路径
  57. else:
  58. ax.plot(r*np.sin(theta) + dB, -r*np.cos(theta), 'g-') # 无人机B的路径
  59. ax.set_aspect('equal', 'box')
  60. plt.title(f"dB = {dB} m, Priority: {priority}")
  61. plt.grid(True)
  62. plt.show()
  63. # 在不同的dB值上运行这个函数
  64. dB_values = [1000, 2000, 3000, 4000, 5000]
  65. k = 0
  66. for dB in dB_values:
  67. k =
  68. # print(f"dB = {dB} m, 无人机A的优先级最高")
  69. print(f"情况{k}:")
  70. drone_path(dB, priority='A')
  71. # print(f"dB = {dB} m, 无人机B的优先级最高")
  72. drone_path(dB, priority='B')

第四问

  1. def drone_path(v_B, priority='A'):
  2. # 参数设定
  3. r = 500 # 障碍圆半径
  4. dA = 1000 # A站距离圆心
  5. dB = 3500 # B站距离圆心
  6. v_A = 10 # 无人机A的速度
  7. # 计算绕过障碍圆的上侧和下侧的路径长度
  8. L_A_upper = np.pi * r + np.sqrt((dA-r)**2 + r**2)
  9. L_A_lower = np.pi * r + np.sqrt((dA+r)**2 + r**2)
  10. L_B_upper = np.pi * r + np.sqrt((dB-r)**2 + r**2) + (np.pi * r / v_B)
  11. L_B_lower = np.pi * r + np.sqrt((dB+r)**2 + r**2) + (np.pi * r / v_B)
  12. # 根据优先级选择飞行路径
  13. if priority == 'A':
  14. # 优先考虑无人机A的飞行路径
  15. if L_A_upper <= L_A_lower:
  16. direction_A = 'upper'
  17. direction_B = 'lower'
  18. L_A = L_A_upper
  19. L_B = L_B_lower
  20. else:
  21. direction_A = 'lower'
  22. direction_B = 'upper'
  23. L_A = L_A_lower
  24. L_B = L_B_upper
  25. else:
  26. # 优先考虑无人机B的飞行路径
  27. if L_B_upper <= L_B_lower:
  28. direction_A = 'lower'
  29. direction_B = 'upper'
  30. L_A = L_A_lower
  31. L_B = L_B_upper
  32. else:
  33. direction_A = 'upper'
  34. direction_B = 'lower'
  35. L_A = L_A_upper
  36. L_B = L_B_lower
  37. # 计算飞行时间
  38. T_A = L_A / v_A
  39. T_B = L_B / v_B
  40. print(f"无人机A应该沿障碍圆的{direction_A}方向绕行")
  41. print(f"无人机A的飞行时间为:{T_A}秒")
  42. print(f"无人机B应该沿障碍圆的{direction_B}方向绕行")
  43. print(f"无人机B的飞行时间为:{T_B}秒")
  44. # 可视化
  45. fig, ax = plt.subplots()
  46. circle = plt.Circle((0, 0), r, color='r', fill=False)
  47. ax.add_artist(circle)
  48. ax.plot([-dA, dB], [0, 0], 'ko') # 绘制A、B两点
  49. ax.plot([-dA, dB], [0, 0], 'k--') # 绘制AB连线
  50. # 绘制最优路径
  51. theta = np.linspace(-np.pi/2, np.pi/2, 100)
  52. if direction_A == 'upper':
  53. ax.plot(r*np.sin(theta) - dA, r*np.cos(theta), 'b-') # 无人机A的路径
  54. else:
  55. ax.plot(r*np.sin(theta) - dA, -r*np.cos(theta), 'b-') # 无人机A的路径
  56. if direction_B == 'upper':
  57. ax.plot(r*np.sin(theta) + dB, r*np.cos(theta), 'g-') # 无人机B的路径
  58. else:
  59. ax.plot(r*np.sin(theta) + dB, -r*np.cos(theta), 'g-') # 无人机B的路径
  60. ax.set_aspect('equal', 'box')
  61. plt.title(f"v_B = {v_B} m/s, Priority: {priority}")
  62. plt.grid(True)
  63. plt.show()
  64. # 在不同的v_B值上运行这个函数
  65. v_B_values = np.linspace(10, 30, 5)
  66. for v_B in v_B_values:
  67. print(f"v_B = {v_B} m/s, 无人机A的优先级最高")
  68. drone_path(v_B, priority='A')
  69. print(f"v_B = {v_B} m/s, 无人机B的优先级最高")
  70. drone_path(v_B, priority='B')
  71. 1 . 5 问题五
  72. import numpy as np
  73. import matplotlib.pyplot as plt
  74. def drone_path(v_B, dB, priority='B'):
  75. # 参数设定
  76. r = 500 # 障碍圆半径
  77. dA = 1000 # A站距离圆心
  78. v_A = 10 # 无人机A的速度
  79. # 计算绕过障碍圆的上侧和下侧的路径长度
  80. L_A_upper = np.pi * r + np.sqrt((dA-r)**2 + r**2)
  81. L_A_lower = np.pi * r + np.sqrt((dA+r)**2 + r**2)
  82. L_B_upper = np.pi * r + np.sqrt((dB-r)**2 + r**2) + (np.pi * r / v_B)
  83. L_B_lower = np.pi * r + np.sqrt((dB+r)**2 + r**2) + (np.pi * r / v_B)
  84. # 优先考虑无人机B的飞行路径
  85. if L_B_upper <= L_B_lower:
  86. direction_A = 'lower'
  87. direction_B = 'upper'
  88. L_A = L_A_lower
  89. L_B = L_B_upper
  90. else:
  91. direction_A = 'upper'
  92. direction_B = 'lower'
  93. L_A = L_A_upper
  94. L_B = L_B_lower
  95. # 计算飞行时间
  96. T_A = L_A / v_A
  97. T_B = L_B / v_B
  98. print(f"无人机A应该沿障碍圆的{direction_A}方向绕行")
  99. print(f"无人机A的飞行时间为:{T_A}秒")
  100. print(f"无人机B应该沿障碍圆的{direction_B}方向绕行")
  101. print(f"无人机B的飞行时间为:{T_B}秒")
  102. # 可视化
  103. fig, ax = plt.subplots()
  104. circle = plt.Circle((0, 0), r, color='r', fill=False)
  105. ax.add_artist(circle)
  106. ax.plot([-dA, dB], [0, 0], 'ko') # 绘制A、B两点
  107. ax.plot([-dA, dB], [0, 0], 'k--') # 绘制AB连线
  108. # 绘制最优路径
  109. theta = np.linspace(-np.pi/2, np.pi/2, 100)
  110. if direction_A == 'upper':
  111. ax.plot(r*np.sin(theta) - dA, r*np.cos(theta), 'b-') # 无人机A的路径
  112. else:
  113. ax.plot(r*np.sin(theta) - dA, -r*np.cos(theta), 'b-') # 无人机A的路径
  114. if direction_B == 'upper':
  115. ax.plot(r*np.sin(theta) + dB, r*np.cos(theta), 'g-') # 无人机B的路径
  116. else:
  117. ax.plot(r*np.sin(theta) + dB, -r*np.cos(theta), 'g-') # 无人机B的路径
  118. ax.set_aspect('equal', 'box')
  119. plt.title(f"v_B = {v_B} m/s, dB = {dB} m, Priority: {priority}")
  120. plt.grid(True)
  121. plt.show()
  122. # 在不同的v_B和dB值上运行这个函数
  123. v_B_values = np.linspace(10, 50, 5)
  124. dB_values = np.linspace(1000, 10000, 5)
  125. for v_B in v_B_values:
  126. for dB in dB_values:
  127. print(f"v_B = {v_B} m/s, dB = {dB} m, 无人机B的优先级最高")
  128. drone_path(v_B, dB, priority='Bww

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/586975
推荐阅读
相关标签
  

闽ICP备14008679号