首页 > 后端开发 > Python教程 > 使用 matplotlib 和 A* 算法构建无人机导航系统

使用 matplotlib 和 A* 算法构建无人机导航系统

Patricia Arquette
发布: 2024-11-29 04:59:09
原创
439 人浏览过

您有没有想过无人机如何在复杂的环境中导航?在本博客中,我们将使用 Python、Matplotlib 和 A* 算法创建一个简单的无人机导航系统。最后,您将拥有一个可以可视化无人机解决迷宫的工作系统!

你将学到什么

  1. 基本人工智能术语,如“代理”和“环境”。
  2. 如何使用 Python 创建和可视化迷宫。
  3. A* 算法如何解决导航问题。
  4. 如何实现和可视化无人机的路径。

简介

要构建我们的无人机导航系统,我们需要以下内容:

  1. 特工:无人机?.
  2. 路径: 无人机将穿过的 2D 迷宫?️。
  3. 搜索算法: A* 算法 ⭐.

但首先,让我们为新手快速回顾一下一些基本的人工智能术语。


关键人工智能术语

  • 代理:一个实体(如我们的无人机),感知其环境(迷宫)并采取行动以实现目标(到达迷宫的尽头)。
  • 环境: 代理运行的世界,这里表示为 2D 迷宫。
  • 启发式:用于指导搜索的经验法则或估计(例如测量到目标的距离)。

系统设计

我们的无人机将在二维迷宫中导航。迷宫将包括:

  • 墙壁(不可通行区域以 1 表示)。
  • 路径(用 0 表示的开放空间)。

无人机的目标:

  1. 避开墙壁。?
  2. 到达路径的尽头。?

这是迷宫的样子:

Building a drone navigation system using matplotlib and A* algorithm


第 1 步:搭建迷宫

导入所需的库

首先,安装并导入所需的库:

import matplotlib.pyplot as plt
import numpy as np
import random
import math
from heapq import heappop, heappush
登录后复制
登录后复制

定义迷宫尺寸

让我们定义迷宫大小:
蟒蛇
宽度、高度 = 22, 22

设置方向和重量

在现实世界的导航中,不同方向的移动可能会产生不同的成本。例如,向北移动可能比向东移动更困难。

DIRECTIONAL_WEIGHTS = {'N': 1.2, 'S': 1.0, 'E': 1.5, 'W': 1.3}
DIRECTIONS = {'N': (-1, 0), 'S': (1, 0), 'E': (0, 1), 'W': (0, -1)}
登录后复制
登录后复制

初始化迷宫网格

我们从一个充满墙壁的网格开始(1s):

import matplotlib.pyplot as plt
import numpy as np
import random
import math
from heapq import heappop, heappush
登录后复制
登录后复制

麻木的。 Ones() 函数用于创建给定形状和类型的新数组,并用 1 填充...在使用默认值初始化数组时很有用。

第二步:雕刻迷宫

现在让我们定义一个函数,它将“雕刻”在迷宫中开辟路径,迷宫现在仅用墙壁初始化

DIRECTIONAL_WEIGHTS = {'N': 1.2, 'S': 1.0, 'E': 1.5, 'W': 1.3}
DIRECTIONS = {'N': (-1, 0), 'S': (1, 0), 'E': (0, 1), 'W': (0, -1)}
登录后复制
登录后复制

定义起点和终点

maze = np.ones((2 * WIDTH + 1, 2 * HEIGHT + 1), dtype=int)
登录后复制

第三步:可视化迷宫

使用Matplotlib显示迷宫:

def carve(x, y):
    maze[2 * x + 1, 2 * y + 1] = 0  # Mark current cell as a path
    directions = list(DIRECTIONS.items())
    random.shuffle(directions)  # Randomize directions

    for _, (dx, dy) in directions:
        nx, ny = x + dx, y + dy
        if 0 <= nx < WIDTH and 0 <= ny < HEIGHT and maze[2 * nx + 1, 2 * ny + 1] == 1:
            maze[2 * x + 1 + dx, 2 * y + 1 + dy] = 0
            carve(nx, ny)

carve(0, 0)  # Start carving from the top-left corner
登录后复制

第 4 步:用 A 解决迷宫*

A* 算法 使用路径成本和启发式的组合来查找加权迷宫中的最短路径。

定义启发式

我们使用欧几里得距离作为我们的启发式:

start = (1, 1)
end = (2 * WIDTH - 1, 2 * HEIGHT - 1)
maze[start] = 0
maze[end] = 0
登录后复制

A*算法实现

fig, ax = plt.subplots(figsize=(8, 6))
ax.imshow(maze, cmap='binary', interpolation='nearest')
ax.set_title("2D Maze")
plt.show()
登录后复制

第 5 步:可视化解决方案

我们已经有了迷宫,​​但你还看不到无人机的路径。
让我们可视化无人机的路径:

def heuristic(a, b):
    return math.sqrt((a[0] - b[0]) ** 2 + (a[1] - b[1]) ** 2)
登录后复制

结论

恭喜! ?您已经构建了一个可用的无人机导航系统:

  • 生成一个 2D 迷宫。
  • 使用 A* 算法解决它。
  • 可视化最短路径。 Building a drone navigation system using matplotlib and A* algorithm

后续步骤

  1. 尝试不同的迷宫大小和重量。
  2. 尝试其他启发式方法,例如曼哈顿距离。
  3. 可视化 3D 迷宫以获得更多复杂性!

请随时分享您的结果或在下面的评论中提出问题。
到无限甚至更远?

以上是使用 matplotlib 和 A* 算法构建无人机导航系统的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板