跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Project AirSim 无人机避障算法解析

介绍 Project AirSim 仿真平台,相比原版 AirSim 支持同一场景下无人机与车辆共存。重点解析了基于深度图的无人机前向避障算法实现逻辑,涵盖初始化连接、图像订阅、起飞准备及核心避障循环(获取深度图、区域分割、障碍判断、航向调整)。通过 Python 脚本演示了如何结合传感器数据动态调整飞行路径以避免碰撞,并提供了相关资源链接。

RedisGeek发布于 2026/3/23更新于 2026/10/2516K 浏览
Project AirSim 无人机避障算法解析

一、为什么选择 Project AirSim

近年来,微软开源的 AirSim 项目成为了无人机与自动驾驶研究中的重要仿真平台,但 AirSim 有个限制:同一仿真中无法同时使用车辆(Car)和无人机(Multirotor)。在 AirSim 中,我们需要通过修改 SimMode(SimMode=Multirotor 或 SimMode=Car)来切换模式,这意味着两种载具无法在一个世界中同时存在。

Project AirSim 在原版 AirSim 的基础上进行了大量改进和重构,可以在同一场景中同时渲染无人机与地面车辆。(Issue #61 - Can ProjectAirSim support both cars and UAVs simulation?)

二、无人机避障算法解析

项目中自带了多个示例脚本,其中一个典型案例是:

ProjectAirSim/client/python/airsimv1_scripts_migrated/multirotor/navigate.py

它展示了如何让无人机基于深度图 (Depth Image) 实现一个简单的前向避障算法。下面我将结合源代码来详细分析其执行逻辑。

2.1 初始化与连接

首先,脚本通过 ProjectAirSimClient() 连接到仿真服务器,并加载场景与无人机对象:

client = ProjectAirSimClient()
client.connect()
world = World(client, "scene_drone_classic.jsonc", delay_after_load_sec=2)
drone = Drone(client, world, "Drone1")

其中,ProjectAirSimClient 模块负责与后端进行通信。World 会加载与 navigate.py 位于同一目录下的 sim_config 文件夹中的 scene_drone_classic.jsonc 配置文件。该配置文件中通过 "robot-config": "robot_quadrotor_classic.jsonc" 指定了机器人配置,从而进一步导入 robot_quadrotor_classic.jsonc 中的详细参数设置。

2.2 图像订阅与显示

前面,脚本使用 ImageDisplay() 创建显示窗口,并分别订阅追踪相机 (ChaseCam) 和前向深度相机 (front_center depth)。

image_display = ImageDisplay()
chase_cam_window = "ChaseCam"
image_display.add_chase_cam(chase_cam_window)
client.subscribe(
    drone.sensors["Chase"]["scene_camera"],
    lambda _, chase: image_display.receive(chase, chase_cam_window),
)
depth_name = "Depth-Image"
image_display.add_image(depth_name, subwin_idx=0)
client.subscribe(
    drone.sensors["front_center"]["depth_planar_camera"],
    lambda _, depth: image_display.receive(depth, depth_name),
)

这一步的目的是在本地实时显示仿真画面,便于调试。相机传感器 (sensors) 中第一个键 (key) 的获取,是根据前文提到的 robot_quadrotor_classic.jsonc 文件中的 id 进行匹配得到的。部分配置内容如下所示。

"sensors": [
 {
  "id": "Chase",
  "type": "camera",
  "enabled": true,
  "parent-link": "Frame",
  "capture-interval": 0.03,
  "capture-settings": [

2.3 起飞与准备工作

image_display.start()
drone.enable_api_control()
drone.arm()
await drone.takeoff_async()

无人机起飞后,将进入主循环。

2.4 深度图避障逻辑核心

主循环中,算法每一帧执行如下步骤:

2.4.1 获取前置深度图
result = drone.get_images("front_center", [ImageType.DEPTH_PLANAR])
depth_image = unpack_image(result[ImageType.DEPTH_PLANAR])

这里的 depth_image 是一个 NumPy 数组,表示视场内每个像素的深度信息。值越小表示越近。

2.4.2 取图像上半部分
top = np.vsplit(depth_image, 2)[0]

算法只分析上半部分(前方视野),忽略地面区域。

2.4.3 横向分割为五个区域
bands = np.hsplit(top, [50,100,150,200])
mins = [np.min(x) for x in bands]

将画面从左到右分为 5 个区域,并计算每个区域的最小深度值(代表最近的障碍距离)。

例如:索引 0 → 最左侧,索引 2 → 正前方,索引 4 → 最右侧。

2.4.4 判断最近障碍与最开阔方向
max = np.argmax(mins)
distance = mins[max]
current = mins[2]

mins[max] 最大的区域表示'最开阔的方向';current 是当前正前方的障碍距离。

2.4.5 悬停操作避免碰撞
if (current < 20):
    await drone.hover_async()
    projectairsim_log().info("whoops - we are about to crash, so stopping!")
    input()

若正前方障碍过近(阈值为 20),无人机悬停并等待人工干预。

2.4.6 动态调整航向(yaw)
if (distance > current + 300):
    if (max == 0):
        change = -2*pi/10
    elif (max == 1):
        change = -pi/10
    elif (max == 2):
        change = 0
    elif (max == 3):
        change = pi/10
    else:
        change = 2*pi/10
    yaw += change
    vx = math.cos(yaw)
    vy = math.sin(yaw)

算法把 90° 视场分为 5 段,每段约 18°。当检测到某侧更'开阔'时,无人机偏航一定角度(±18° 或 ±36°),并重新计算速度向量。

2.4.7 以固定高度和速度前进
await drone.move_by_velocity_z_async(vx, vy, -6, 1, YawControlMode.ForwardOnly, yaw=0, yaw_is_rate=False)

move_by_velocity_z_async 是 Project AirSim 提供的用于控制无人机飞行的 API 接口。该函数使无人机在 高度 z = -6(由于 Project AirSim 采用 NED 坐标系,即 North–East–Down)时,以指定的 水平速度 vx、vy 飞行 1 秒。飞行结束后,系统会重新采样图像,并进入下一次循环。

值得注意的是,YawControlMode.ForwardOnly (= 1)(在 drone.py 中定义) 表示偏航角(Yaw)被限制为与运动方向保持一致,即无人机的机头始终朝向其当前的运动方向。这也解释了在 2.4.6 节中,vx 和 vy 是根据偏航角的正弦与余弦计算得到的原因。除此之外,在 drone.py 文件中还定义一个 MaxDegreeOfFreedom = 0,表示偏航与速度向量相互独立,即可以让无人机头朝向和移动方向不一致。

2.5 循环退出与资源释放

按下 Esc / q / x 键退出,程序会停止显示并断开连接:

image_display.stop()
client.disconnect()

三、相关连接

AirSim:https://github.com/microsoft/AirSim.git

Project AirSim:https://github.com/iamaisim/ProjectAirSim.git

目录

  1. 一、为什么选择 Project AirSim
  2. 二、无人机避障算法解析
  3. 2.1 初始化与连接
  4. 2.2 图像订阅与显示
  5. 2.3 起飞与准备工作
  6. 2.4 深度图避障逻辑核心
  7. 2.4.1 获取前置深度图
  8. 2.4.2 取图像上半部分
  9. 2.4.3 横向分割为五个区域
  10. 2.4.4 判断最近障碍与最开阔方向
  11. 2.4.5 悬停操作避免碰撞
  12. 2.4.6 动态调整航向(yaw)
  13. 2.4.7 以固定高度和速度前进
  14. 2.5 循环退出与资源释放
  15. 三、相关连接

更多推荐文章

查看全部
  • Java 后端 Web API 开发实战:从架构到部署
  • OpenCV 形态学操作与乐谱线条提取
  • Linux System V 共享内存:原理、实操与避坑
  • FPGA 嵌入式块存储器 RAM:原理与实现指南
  • Linux 系统编程:封装基础文件操作库与理解标准错误流 stderr
  • 基于现代 C++ std::variant 和 std::visit 构建类型安全的有限状态机
  • WebView 技术详解:原理、场景与性能安全挑战
  • RAG 检索增强生成技术实战与架构解析
  • 十大经典排序算法 Python 实现及原理详解
  • C++ 手写红黑树:解析 STL map 底层平衡机制
  • OpenClaw 跨平台 AI 助手完全使用指南:从入门到进阶
  • SpringBoot 配置文件核心用法:Properties 与 YAML
  • 本地搭建带知识库的 AI 助手:Ollama + Open WebUI
  • CosyVoice 安装 openai-whisper 报错 ModuleNotFoundError: No module named'pkg_resources'
  • 企业级大模型构建指南:知识库驱动的业务智能化
  • Flutter 组件 genkit 适配鸿蒙:AI 幻觉审计与端云协同 RAG 方案
  • WebRTC 在 Android 中的应用实战指南
  • C++ 多态底层实现机制深度解析
  • Aspen 15.0 升级亮点:AI 建模与绿氢适配的流程模拟功能解析
  • 基于魅蓝Note5 Root搭建Linux服务器及部署常用服务

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online