Bootstrap

城市空中交通仿真与优化:基于BFS路径规划与随机策略对比

无人机技术在物流、安防等领域的应用越来越广泛,而在复杂的城市环境中,如何进行高效的空域管理成为关键课题。本文将展示一个使用 Python 和 gym 构建的城市空中交通仿真系统,结合 BFS 路径规划和随机策略的对比研究,探索无人机飞行调度与路径优化的实际应用。


一、背景与目标

无人机在城市空域中的运行面临以下核心挑战:

  1. 路径规划:无人机需要从起点到达终点,同时避开障碍物和禁飞区。
  2. 碰撞检测:确保在高密度空域中飞行器之间不发生碰撞。
  3. 动态环境适应:考虑天气(如风力)等环境因素对飞行的影响。
  4. 性能评估:通过多指标评估不同策略的有效性。

本文实现了一个三维仿真环境,支持以下功能:

  • 使用 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.41.0028.5
随机策略4.35.23.180.4

2. 可视化结果

碰撞次数

BFS 策略显著减少了碰撞次数。

禁飞区违规

BFS 策略通过规划路径,有效避免了禁飞区违规。


四、总结与展望

1. 总结

  • BFS 路径规划在无人机调度和路径规划中表现优异,显著降低了碰撞与违规。
  • 随机策略作为对照基准,凸显了智能路径规划的重要性。

2. 未来优化方向

  1. 高级搜索算法:使用 A*、Dijkstra 等算法优化路径规划效率。
  2. 动态规划:应对多无人机实时动态调度问题。
  3. 更多环境因素:模拟真实空域中的复杂天气、任务优先级等。

通过进一步优化,本仿真系统可以作为城市空域管理研究的基础工具。


五、源码获取与运行

完整代码可以直接运行,生成实验结果和可视化图表:

  1. 克隆代码或复制到本地文件 uam_simulation.py

;