一、为什么选择 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 进行匹配得到的。部分配置内容如下所示。


