无人机技术在物流、安防等领域的应用越来越广泛,而在复杂的城市环境中,如何进行高效的空域管理成为关键课题。本文将展示一个使用 Python 和 gym
构建的城市空中交通仿真系统,结合 BFS 路径规划和随机策略的对比研究,探索无人机飞行调度与路径优化的实际应用。
一、背景与目标
无人机在城市空域中的运行面临以下核心挑战:
- 路径规划:无人机需要从起点到达终点,同时避开障碍物和禁飞区。
- 碰撞检测:确保在高密度空域中飞行器之间不发生碰撞。
- 动态环境适应:考虑天气(如风力)等环境因素对飞行的影响。
- 性能评估:通过多指标评估不同策略的有效性。
本文实现了一个三维仿真环境,支持以下功能:
- 使用 BFS 算法进行最短路径规划,避开禁飞区和越界区域。
- 对比 BFS 策略和随机策略的性能差异。
- 模拟风力对无人机运动的扰动,增加仿真真实性。
- 输出结果数据和可视化图表,便于直观比较不同策略的表现。
二、功能实现
1. 核心代码结构
代码由以下模块组成,每个模块对应特定功能:
├── WeatherSystem # 天气系统,生成风向风速
├── CityAirTrafficEnv3D # 仿真环境,负责状态更新、禁飞区检测等
├── bfs_policy # 基于BFS的路径规划策略
├── random_policy # 随机策略
├── run_simulation # 仿真主逻辑
├── analyze_and_save # 数据分析与结果保存
└── main # 主函数,运行仿真与对比
以下将逐一介绍主要功能。
2. 仿真环境
环境设计
CityAirTrafficEnv3D
是一个基于 gym
的三维网格环境,每架无人机都有以下状态:
[x, y, z]
:当前位置。[dest_x, dest_y, dest_z]
:目标位置。done_flag
:是否已到达目标。
无人机的动作空间包括:
- 动作编码:
0
:不动。1-6
:分别对应向+y, -y, +x, -x, +z, -z
移动。
- 风力扰动:
- 无人机执行动作后,其位置会受当前风力影响(只影响 x 和 y 方向)。
class CityAirTrafficEnv3D(gym.Env):
def __init__(self, ...):
# 网格与无人机配置
self.grid_size_x = grid_size_x
self.grid_size_y = grid_size_y
self.grid_size_z = grid_size_z
self.num_drones = num_drones
# 动作空间与状态空间
self.observation_space = spaces.Box(low=..., high=..., dtype=np.float32)
self.action_space = spaces.MultiDiscrete([7] * num_drones)
# 环境内部状态
self.drones_info = None
self.total_collisions = 0
self.total_no_fly_violations = 0
...
禁飞区与碰撞检测
- 禁飞区:预定义多个三维区域,进入则记为违规,并施加惩罚。
- 碰撞检测:若多架无人机位于同一坐标,则增加碰撞计数,并扣分。
3. 路径规划策略
BFS 路径规划
bfs_policy
使用广度优先搜索(BFS)算法,为每架无人机规划最短路径。实现中:
- 搜索从
[x, y, z]
到[dest_x, dest_y, dest_z]
的最短路径。 - 自动避开禁飞区和越界。
- 若找不到可行路径,则无人机原地等待。
代码核心如下:
def bfs_path_planner(env, drone_idx):
# 获取无人机起点与终点
x, y, z, dx, dy, dz, _ = env.drones_info[drone_idx]
start = (int(round(x)), int(round(y)), int(round(z)))
goal = (int(round(dx)), int(round(dy)), int(round(dz)))
# 广度优先搜索
visited = set()
queue = deque([(start, [start])])
directions = [(1,0,0), (-1,0,0), (0,1,0), (0,-1,0), (0,0,1), (0,0,-1)]
while queue:
current, path = queue.popleft()
if current in visited:
continue
visited.add(current)
if current == goal:
return path # 找到路径
for dx_, dy_, dz_ in directions:
nx, ny, nz = current[0] + dx_, current[1] + dy_, current[2] + dz_
if valid_position(env, nx, ny, nz): # 检查禁飞区与边界
queue.append(((nx, ny, nz), path + [(nx, ny, nz)]))
return [] # 无路径
随机策略
随机策略对尚未到达的无人机,随机选择一个动作;到达目标后停止移动。
4. 数据分析与可视化
仿真完成后,保存以下结果:
- CSV 文件:记录每轮仿真的碰撞次数、禁飞区违规次数、延误和各无人机到达时间。
- 图表:
- 碰撞次数折线图。
- 禁飞区违规次数折线图。
- 延误折线图。
- 各无人机到达时间散点图。
代码示例:
def analyze_and_save(policy_name, collisions, nofly, delays, arrivals, csv_file, show_plot=True):
# 生成折线图和散点图
plt.figure()
plt.plot(collisions, marker='o', color='red')
plt.title(f"Collisions ({policy_name})")
plt.savefig(f"collisions_{policy_name}.png")
plt.figure()
plt.plot(nofly, marker='s', color='blue')
plt.title(f"No-Fly Violations ({policy_name})")
plt.savefig(f"nofly_{policy_name}.png")
...
三、实验结果与分析
1. 性能对比
策略 | 碰撞次数 | 禁飞区违规次数 | 延误 | 平均到达时间 |
---|---|---|---|---|
BFS策略 | 0.4 | 1.0 | 0 | 28.5 |
随机策略 | 4.3 | 5.2 | 3.1 | 80.4 |
2. 可视化结果
碰撞次数
BFS 策略显著减少了碰撞次数。
禁飞区违规
BFS 策略通过规划路径,有效避免了禁飞区违规。
四、总结与展望
1. 总结
- BFS 路径规划在无人机调度和路径规划中表现优异,显著降低了碰撞与违规。
- 随机策略作为对照基准,凸显了智能路径规划的重要性。
2. 未来优化方向
- 高级搜索算法:使用 A*、Dijkstra 等算法优化路径规划效率。
- 动态规划:应对多无人机实时动态调度问题。
- 更多环境因素:模拟真实空域中的复杂天气、任务优先级等。
通过进一步优化,本仿真系统可以作为城市空域管理研究的基础工具。
五、源码获取与运行
完整代码可以直接运行,生成实验结果和可视化图表:
- 克隆代码或复制到本地文件
uam_simulation.py
。