AirSim+UE4无人机仿真环境搭建与Python控制实战指南

发布时间:2026/7/12 15:42:43

AirSim+UE4无人机仿真环境搭建与Python控制实战指南 1. 项目概述为什么选择AirSimUE4进行无人机仿真如果你正在研究无人机无论是做算法验证、路径规划还是想测试自己的控制逻辑直接上真机测试的成本和风险都太高了。炸一次机损失的不只是金钱更是宝贵的时间和项目进度。这就是仿真平台存在的意义。过去很多人会首选ROSGazebo这确实是一个经典组合但它的视觉保真度和物理引擎的真实性有时会让你在仿真中跑得很顺的算法一到现实世界就“水土不服”。AirSim的出现可以说为无人机仿真打开了一扇新的大门。它本质上不是一个新的仿真器而是微软基于虚幻引擎4UE4开发的一个插件。这意味着你获得的是一个由顶级游戏引擎驱动的、拥有电影级画质的虚拟世界。在这个世界里光影、材质、天气效果都极其逼真无人机搭载的相机无论是RGB、深度还是红外拍出来的图像与真实世界采集的数据在视觉特征上高度相似。这对于依赖计算机视觉的算法如SLAM、目标检测、视觉导航来说是至关重要的。你不再需要花费大量精力去给Gazebo的简陋模型“贴图”来模拟真实环境。用Python来控制AirSim中的无人机则是另一个巨大的便利。官方提供了完善的Python API封装了几乎所有你能想到的操作获取传感器数据、控制无人机姿态、设置飞行模式。你不需要去啃C或深入UE4的蓝图系统用你熟悉的Python脚本就能快速搭建起一个算法验证流水线。从环境搭建到写出第一个起飞代码整个过程就像搭积木一样直观。这对于研究人员、学生和快速原型开发者来说极大地降低了入门门槛让你能把精力集中在核心算法的创新上而不是纠缠于仿真环境本身。2. 环境搭建全攻略避坑指南与最佳实践搭建AirSimUE4的环境是整个过程的第一步也是最容易让人“从入门到放弃”的一步。网上教程很多但版本兼容性问题、依赖缺失、路径错误等小细节足以消耗掉你大半的热情。这里我将结合多次重装的经验为你梳理一条最清晰、坑最少的路径。2.1 核心组件选择与安装顺序整个环境可以看作三层操作系统层、虚幻引擎层、AirSim插件层。正确的安装顺序和版本匹配是关键。操作系统选择Windows 10/11 和 Ubuntu 18.04/20.04 是官方主要支持的系统。对于绝大多数用户尤其是想利用UE4编辑器可视化搭建场景的Windows平台是首选因为Epic Games Launcher和UE4编辑器在Windows上的体验最完整。Linux平台更适合作为无界面的仿真服务器运行。本文将以Windows为主进行说明。虚幻引擎版本这是最大的版本陷阱。AirSim对UE4版本有严格要求并非越新越好。经过大量社区验证UE4.27是目前与AirSim兼容性最稳定、文档最齐全的版本。切勿使用UE5或UE4.26等版本你会遇到各种编译错误和运行时问题。请务必通过Epic Games启动器安装UE 4.27.2这个特定版本。Python环境AirSim的Python客户端支持Python 3.6到3.9。我推荐使用Python 3.8它在兼容性和库生态上达到了一个很好的平衡。强烈建议使用Anaconda或Miniconda来创建独立的虚拟环境避免污染系统Python。# 使用conda创建环境示例 conda create -n airsim python3.8 conda activate airsimVisual Studio在Windows上编译AirSim插件需要Visual Studio 2019或2017以及“使用C的桌面开发”工作负载。这是必须的不能省略。2.2 一步步安装UE4.27下载Epic Games启动器访问Epic Games官网下载并安装启动器。安装UE4.27在启动器的“虚幻引擎”标签页点击“库”然后点击“引擎版本”旁的“”号。在弹出窗口中不要直接点“安装”而是点击版本号下拉菜单选择4.27然后从子版本中选择4.27.2。这一步至关重要选好后再点击“安装”选择一个大容量的磁盘建议预留至少30GB空间。验证安装安装完成后你可以在启动器库中看到“4.27.2”的版本并能点击“启动”打开UE4编辑器。第一次启动会进行一些初始化稍等即可。2.3 编译与部署AirSim插件AirSim插件需要从源码编译。不要直接下载预编译的二进制文件因为你需要确保它与你的UE4版本精确匹配。获取源码打开Git Bash或任何Git客户端克隆AirSim的官方仓库。建议克隆后切换到稳定的发布标签。git clone https://github.com/microsoft/AirSim.git cd AirSim # 查看与UE4.27兼容的标签例如 v1.8.1 git checkout v1.8.1使用编译脚本AirSim仓库根目录下有一个build.cmd脚本Windows。在克隆的AirSim文件夹中直接双击运行此脚本或者用管理员权限打开PowerShell/CMD并执行.\build.cmd。注意运行前请确保你的UE4安装路径中没有中文或特殊字符并且以管理员身份运行可以避免一些文件权限问题。脚本会自动检测你的VS2019和UE4.27安装路径并开始编译。这个过程会下载一些依赖需要保持网络通畅耗时大约15-30分钟。关键的部署步骤编译成功后脚本会生成Unreal\Plugins文件夹下的内容。但工作还没完。你需要手动将编译好的插件复制到UE4的插件目录。找到你的UE4安装路径例如C:\Program Files\Epic Games\UE_4.27。进入Engine\Plugins\Marketplace文件夹。如果Marketplace不存在就进入Engine\Plugins。将AirSim目录下的Unreal\Plugins文件夹完整地复制到Marketplace或Plugins目录中。这是很多教程语焉不详但极其关键的一步复制后路径应类似于UE_4.27\Engine\Plugins\Marketplace\AirSim。创建并配置UE4项目打开UE4编辑器4.27.2版本。选择“游戏” - “空白”创建一个新的C项目例如命名为MyAirSimProject选择保存位置。必须选择“包含初学者内容包”。项目创建后编辑器可能会提示“发现缺失模块”选择“是”重新编译。编译完成后在编辑器菜单栏中你应该能看到“设置” - “AirSim”这个选项。如果没看到说明插件部署失败了请检查上一步的复制路径是否正确。点击“AirSim”设置可以进行车辆类型多旋翼、汽车、默认控制器PX4、SimpleFlight等基础配置。首次使用保持默认多旋翼、SimpleFlight即可。2.4 安装Python客户端Python客户端是独立于UE4插件存在的它通过RPC远程过程调用与仿真器通信。在你的Conda虚拟环境airsim中使用pip安装pip install msgpack-rpc-python pip install airsim请注意airsim这个Python包只包含客户端API不包含仿真器本身。安装完成后你可以在Python中import airsim来测试是否成功。3. 第一个场景载入与运行官方地图环境搭好了我们急需一个场景来验证一切是否正常工作。自己从零搭建场景太耗时幸运的是AirSim官方和社区提供了一些高质量的场景包。3.1 获取与使用预编译场景包最快捷的方式是使用官方发布的预编译二进制场景。前往AirSim的GitHub仓库的 Releases 页面找到与你的AirSim版本对应的发布版例如1.8.1。在“Assets”中你会看到一系列以.zip结尾的文件如Blocks.zip,LandscapeMountains.zip等。这些就是打包好的UE4项目里面已经集成了AirSim插件和地图。下载并解压下载你感兴趣的场景例如Blocks.zip。将其解压到一个不含中文和空格的路径下比如D:\AirSimScenes\Blocks。运行场景进入解压后的文件夹找到Blocks.exeWindows或相应的可执行文件双击运行。你会看到一个UE4渲染的窗口启动这就是仿真环境。连接Python客户端保持仿真窗口运行。打开你的Python IDE或命令行在激活了airsim环境后运行一个最简单的连接测试脚本test_connection.pyimport airsim import time # 连接到仿真器默认是本地127.0.0.1的41451端口 client airsim.MultirotorClient() client.confirmConnection() # 确认连接是否成功 print(Connected to AirSim!) # 获取无人机状态 state client.getMultirotorState() print(fDrone position: {state.kinematics_estimated.position})如果脚本成功打印出无人机的位置信息通常初始位置是原点(0,0,0)那么恭喜你整个链路——从UE4仿真环境到Python控制——已经彻底打通了。3.2 在自建项目中载入场景资产如果你想在自己的UE4项目中使用这些漂亮的地图需要获取场景的.umap地图文件和相关的资产文件。官方发布的二进制包通常不直接包含这些源文件。你可以通过以下方式获取从Marketplace购买或下载免费地图在Epic Games启动器的“虚幻引擎”Marketplace中搜索“Landscape”、“Environment”等关键词有许多免费的高质量场景包。下载后可以在你的项目中的“内容浏览器”里看到它们直接拖入关卡即可。使用社区分享的地图一些AirSim社区成员会分享他们制作或转换的地图。这些通常以.uproject或资产集合的形式提供需要导入到你的项目中。从二进制包中提取高级理论上二进制包中的资产是打包的不易直接提取使用。更推荐上述两种方式。实操心得对于初学者强烈建议直接从运行预编译的Blocks场景开始。它能让你在5分钟内看到成果建立信心。Blocks场景是一个简单的积木城市环境视野开阔障碍物规则非常适合进行基础的飞行控制测试。4. Python API核心解析掌控你的虚拟无人机连接到仿真器只是第一步真正有趣的是通过API控制无人机。AirSim的Python API设计得非常直观主要围绕airsim.MultirotorClient()这个客户端对象展开。4.1 连接、状态获取与基础控制让我们深入看看test_connection.py中用到和即将用到的几个核心方法confirmConnection(): 这是一个阻塞调用会一直尝试连接直到成功或超时。在脚本开头调用它可以确保后续指令在执行前仿真器已就绪。getMultirotorState(): 返回一个包含无人机几乎所有状态信息的对象如位置、速度、姿态四元数、GPS数据、电池状态等。kinematics_estimated是其中最常用的部分提供了位姿估计。enableApiControl(True):安全第一在发送任何控制指令前必须调用此方法以取得程序对无人机的控制权。否则无人机将处于手动模式或不受控状态。armDisarm(True): 解锁无人机电机。相当于真实无人机中的“解锁”操作。必须在起飞前执行。takeoffAsync(timeout_sec10): 异步起飞指令。无人机将垂直上升到默认高度约2.5米。Async后缀表示这个函数立即返回一个“未来”对象而非等待动作完成。我们可以用.join()来等待它完成。landAsync(): 异步降落指令。hoverAsync(): 让无人机悬停在当前位置。一个完整的“起飞-悬停-降落”流程代码如下import airsim import time client airsim.MultirotorClient() client.confirmConnection() print(Taking off...) client.enableApiControl(True) # 获取控制权 client.armDisarm(True) # 解锁 client.takeoffAsync().join() # 起飞并等待完成 print(Takeoff complete. Hovering for 5 seconds...) time.sleep(5) # 悬停5秒 print(Landing...) client.landAsync().join() # 降落并等待完成 client.armDisarm(False) # 上锁 client.enableApiControl(False) # 释放控制权 print(Mission accomplished!)4.2 运动控制位置、速度与姿态AirSim提供了不同层级的控制接口满足从高层任务规划到底层控制算法测试的需求。位置控制最简单直接的控制方式。指定一个目标点x, y, z无人机将自动飞过去。# 飞到 (10, 5, -3) 的位置。注意在UE4和AirSim中Z轴向上为负。 client.moveToPositionAsync(10, 5, -3, velocity2).join()velocity参数指定了飞行速度米/秒。这是一个“傻瓜式”接口内部包含了轨迹生成和控制器。速度控制指定无人机在机体坐标系下的前向、右侧、向上的速度。更接近底层控制。# 以1m/s的速度向前飞持续3秒 client.moveByVelocityBodyFrameAsync(1, 0, 0, duration3).join()注意这是机体坐标系前-右-下常用于实现基于速度的遥控或某些算法。姿态与油门控制最底层的控制模式。直接指定无人机的俯仰角、滚转角、偏航角速度和油门量。这需要你对无人机动力学有较好理解。# 滚转5度右侧倾斜俯仰0度偏航角速度10度/秒油门0.7持续1秒 client.moveByRollPitchYawrateThrottleAsync(5.0, 0, 10, 0.7, duration1).join()重要提示姿态控制模式非常灵敏参数不当极易导致无人机失控翻滚。建议先在低空、开阔环境测试。控制模式的选择策略做应用层开发如巡检、航拍优先使用moveToPositionAsync。你关心的是“去哪”而不是“怎么去”。测试导航与路径规划算法可以使用moveToPositionAsync或者结合getMultirotorState获取位置后自己计算速度指令使用moveByVelocityBodyFrameAsync。测试飞控算法或状态估计器需要使用moveByRollPitchYawrateThrottleAsync或更底层的接口以注入你的控制律。4.3 传感器数据获取AirSim的强大之处在于其丰富的传感器模型。获取传感器数据非常简单。相机图像无人机上预置了多个相机“front_center”, “bottom_center”等。responses client.simGetImages([ airsim.ImageRequest(0, airsim.ImageType.Scene), # 获取“front_center”相机的RGB图像 airsim.ImageRequest(0, airsim.ImageType.DepthVis), # 获取深度可视化图像 ]) for i, response in enumerate(responses): if response.pixels_as_float: print(fImage {i} is depth, width{response.width}, height{response.height}) else: # 将字节数据转换为numpy数组方便OpenCV处理 img1d np.frombuffer(response.image_data_uint8, dtypenp.uint8) img_rgb img1d.reshape(response.height, response.width, 3) # 现在可以使用cv2.imshow()显示img_rgb了注意ImageRequest的第一个参数是相机名或索引0通常代表前向中心相机。ImageType.Scene是RGB图DepthVis是用于可视化的深度图假彩色DepthPerspective是真实的透视深度浮点数据。IMU、GPS、磁力计这些数据都包含在getMultirotorState()返回的对象中在imu_data,gps_location,magnetometer等属性里。激光雷达需要先在settings.json中配置启用Lidar传感器然后通过getLidarData()获取点云数据。实操心得处理图像数据时AirSim返回的是压缩的PNG或RAW字节流。使用np.frombuffer转换并重塑形状是最高效的方式。对于深度图如果pixels_as_float为True则需要用np.frombuffer(response.image_data_float, dtypenp.float32)来解析。初次获取图像可能会因为渲染延迟而失败在simGetImages前加一个短暂的time.sleep(0.1)通常能解决问题。5. 从零编写你的第一个飞行脚本现在让我们把前面所有的知识点整合起来写一个有点挑战性但又完整的脚本让无人机起飞飞一个正方形航线并在每个角点悬停拍照最后安全降落。5.1 脚本规划与结构设计我们将脚本分为几个清晰的函数模块提高可读性和可复用性connect_and_arm(): 连接、获取控制权、解锁。fly_square(side_length): 执行正方形飞行任务。take_picture_at_point(client, point_name): 在指定点拍照并保存。main(): 主流程控制。我们假设无人机从原点(0,0,0)起飞飞到高度-5米即离地5米然后以原点为起点在XY平面飞一个边长为10米的正方形。5.2 完整代码实现与逐行解读import airsim import time import numpy as np import cv2 import os # 1. 连接与准备函数 def connect_and_arm(client): 连接仿真器并解锁无人机 print(Connecting to AirSim...) client.confirmConnection() print(Connection established.) print(Enabling API control and arming...) client.enableApiControl(True) # 获取控制权 client.armDisarm(True) # 解锁电机 print(Drone is armed and ready.) def take_picture_at_point(client, point_name, camera_name0): 在当前位置用指定相机拍照并保存到本地 # 请求RGB图像 responses client.simGetImages([ airsim.ImageRequest(camera_name, airsim.ImageType.Scene, False, False) # 不压缩不返回浮点 ]) if responses: response responses[0] # 将图像数据转换为OpenCV格式 img1d np.frombuffer(response.image_data_uint8, dtypenp.uint8) img_rgb img1d.reshape(response.height, response.width, 3) # OpenCV使用BGR顺序需要从RGB转换 img_bgr cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR) # 创建保存目录 save_dir square_flight_images os.makedirs(save_dir, exist_okTrue) # 生成文件名并保存 filename f{save_dir}/{point_name}.png cv2.imwrite(filename, img_bgr) print(fPicture saved: {filename}) return filename else: print(fFailed to take picture at {point_name}) return None def fly_square(client, side_length10.0, altitude-5.0, velocity2.0): 控制无人机飞一个正方形并在顶点拍照 print(fStarting square flight pattern. Side: {side_length}m, Altitude: {-altitude}m) # 定义正方形的四个顶点相对于起飞点 # AirSim坐标系X向前Y向右Z向上但高度为负值 waypoints [ (side_length/2, -side_length/2, altitude), # 第一象限顶点 (side_length/2, side_length/2, altitude), # 第二象限顶点 (-side_length/2, side_length/2, altitude), # 第三象限顶点 (-side_length/2, -side_length/2, altitude), # 第四象限顶点 (0, 0, altitude) # 回到中心 ] waypoint_names [Point_A, Point_B, Point_C, Point_D, Center] # 起飞到指定高度 print(fTaking off to altitude {-altitude}m...) client.takeoffAsync().join() # 也可以使用 moveToZAsync 精确控制起飞高度 # client.moveToZAsync(altitude, velocity).join() # 依次飞向各个航点 for i, (wp, name) in enumerate(zip(waypoints, waypoint_names)): print(fFlying to {name} {wp}...) client.moveToPositionAsync(wp[0], wp[1], wp[2], velocity).join() # 到达后悬停1秒稳定姿态 client.hoverAsync().join() time.sleep(1.0) # 拍照 take_picture_at_point(client, name) print(fArrived at {name}.) def main(): # 初始化客户端 client airsim.MultirotorClient() try: # 步骤1: 连接并解锁 connect_and_arm(client) # 步骤2: 执行正方形航线飞行 fly_square(client, side_length12.0, altitude-6.0, velocity1.5) # 步骤3: 降落并上锁 print(Mission complete. Landing...) client.landAsync().join() except Exception as e: print(fAn error occurred: {e}) # 发生异常时尝试紧急降落 print(Attempting emergency landing...) client.landAsync().join() finally: # 无论成功与否最后都要确保上锁并释放控制权 print(Disarming and releasing control.) client.armDisarm(False) client.enableApiControl(False) print(Script finished.) if __name__ __main__: main()5.3 代码关键点解析与调试技巧坐标系理解这是最大的坑。AirSim使用北-东-地NED坐标系。即X轴指向正北世界坐标系的前方。Y轴指向正东世界坐标系的右侧。Z轴指向地心因此高度是负值地面约为0空中为负例如-10米表示离地10米高。 在moveToPositionAsync中传入的Z坐标必须是负数。我们的脚本中altitude-5.0表示5米高。异步与同步带Async的函数是非阻塞的它会立即返回一个Future对象。如果我们不等待它完成就发送下一条指令会导致指令堆积或冲突。调用.join()方法会阻塞当前线程直到这个动作完成。在顺序执行任务时如“飞到A点然后飞到B点”使用.join()是简单可靠的选择。对于更复杂的并发控制可以操作Future对象。异常处理与安全在try...except...finally块中包裹主要飞行逻辑是必须的。仿真中也可能出现意外如指令超时、连接断开。finally块确保无论是否出错最后都会执行上锁和释放控制权的操作这是一个良好的编程习惯模拟了真实飞控的安全逻辑。图像保存我们使用OpenCV (cv2) 来保存图像。注意AirSim返回的是RGB格式而OpenCV默认使用BGR格式因此需要用cv2.cvtColor进行转换。确保你已通过pip install opencv-python安装了OpenCV库。运行脚本确保你的AirSim仿真场景如Blocks.exe正在运行。在终端激活airsim环境运行python square_flight.py。观察仿真窗口无人机应自动起飞飞一个正方形并在每个角点短暂悬停此时画面会轻微停顿一下因为脚本在保存图片最后降落。如果无人机没有动或者脚本报错连接失败请检查仿真器是否确实在运行。防火墙是否阻止了本地回环地址的41451端口。Python客户端的版本是否与仿真器兼容。6. 进阶配置与问题排查实录当你完成了第一个脚本可能会想定制更多东西或者遇到了奇怪的问题。这一章分享一些进阶配置和常见问题的解决方法。6.1 深度定制settings.json配置文件AirSim的行为主要通过Documents\AirSimWindows或~/Documents/AirSimLinux目录下的settings.json文件控制。如果该文件不存在AirSim会使用内置默认配置。创建这个文件可以让你精细控制仿真。一个基础的settings.json示例如下{ SettingsVersion: 1.2, SimMode: Multirotor, // 仿真模式Multirotor多旋翼, Car, ComputerVision ClockSpeed: 1.0, // 仿真时钟倍率1.0为实时1.0加速 Vehicles: { Drone1: { // 你的无人机名称 VehicleType: SimpleFlight, // 物理模型SimpleFlight简单稳定, PX4更真实 DefaultVehicleState: Armed, // 默认状态Armed, Disarmed PawnPath: , // 自定义无人机模型路径 EnableCollisionPassthrough: false, // 碰撞穿透 EnableCollisions: true, // 启用碰撞检测 AllowAPIAlways: true, // 总是允许API控制 RC: { RemoteControlID: 0 }, Sensors: { // 传感器配置 Lidar1: { SensorType: 6, Enabled: true, NumberOfChannels: 16, // 16线激光雷达 Range: 100.0 // 探测范围100米 }, Gps1: { SensorType: 3, Enabled: true }, Imu1: { SensorType: 2, Enabled: true } } } }, CameraDefaults: { CaptureSettings: [ { ImageType: 0, // 0Scene(RGB), 2DepthPlanner, 3DepthPerspective, 5SurfaceNormals Width: 640, Height: 480, FOV_Degrees: 90 } ] } }常用配置项解读SimMode: 如果你主要玩无人机就设为Multirotor。ClockSpeed: 算法测试时可以设为5.0或10.0来加速仿真节省时间。但注意物理模拟可能会不稳定。VehicleType:SimpleFlight是一个内置的、非常稳定的四旋翼控制器适合快速验证。PX4则通过MavLink协议连接一个真实的PX4飞控软件在环SITL能测试更真实的飞控行为但配置更复杂。传感器配置在Sensors部分你可以添加或修改传感器。例如要启用双目相机需要添加两个Camera类型的传感器并设置不同的X偏移来模拟基线。修改settings.json后需要重启AirSim仿真场景才能生效。6.2 常见问题与解决方案速查表以下是我在学习和教学中遇到的一些典型问题及解决方法问题现象可能原因解决方案运行client.confirmConnection()超时1. 仿真器未启动。2. 防火墙/杀毒软件拦截。3. 端口被占用。1. 确认Blocks.exe等仿真窗口已打开。2. 暂时关闭防火墙或添加出入站规则允许41451端口。3. 重启电脑或查找占用41451端口的进程。Python脚本报错ModuleNotFoundError: No module named airsimPython客户端未安装或不在当前Python环境。1. 在终端输入pip list查看是否有airsim。2. 确保在正确的conda/virtualenv环境中运行脚本。无人机对控制指令无反应1. 未调用enableApiControl(True)。2. 未调用armDisarm(True)。3. 无人机已坠毁或卡住。1. 确保脚本中按顺序调用了enableApiControl和armDisarm。2. 在仿真器中按R键重置无人机位置。获取的图像是黑色的或扭曲的1. 相机未启用或视角被遮挡。2. 图像数据解析错误。1. 检查settings.json中相机配置或尝试切换相机索引如1。2. 检查图像解析代码确认reshape的参数是(height, width, 3)。使用moveToPositionAsync无人机乱飞或位置不准坐标系理解错误。牢记NED坐标系X北Y东Z地向下为正高度为负。检查你的目标点Z值是否为负数。编译AirSim时出现WinSDK或MSBuild错误Visual Studio安装不完整或版本不对。用Visual Studio Installer确保安装了“使用C的桌面开发”工作负载和Windows 10 SDK。UE4编辑器中找不到AirSim菜单AirSim插件未正确复制到UE4插件目录。确认已将编译后的AirSim文件夹复制到了UE_4.27\Engine\Plugins\Marketplace\下并重启UE4编辑器。运行预编译场景包闪退1. 系统缺少运行库。2. 显卡驱动过旧。3. 项目路径包含中文。1. 安装VC Redistributable。2. 更新显卡驱动。3. 将场景包放在全英文路径下。6.3 性能优化与实用技巧关闭不必要的渲染提升帧率在仿真窗口按键Tab键上方打开控制台输入t.MaxFPS 120可以解锁帧率限制。输入r.ScreenPercentage 50可以降低渲染分辨率大幅提升帧率适合跑纯算法时使用。改变天气与时间通过API可以动态改变环境测试算法鲁棒性。# 设置天气参数0-1 client.simSetWeatherParameter(airsim.WeatherParameter.Rain, 0.8) # 大雨 client.simSetWeatherParameter(airsim.WeatherParameter.Fog, 0.4) # 薄雾 # 设置时间24小时制 client.simSetTimeOfDay(18, True) # 下午6点第二个参数是是否动态推移记录与回放数据AirSim支持记录整个飞行的状态和传感器数据。在settings.json中启用RecordUIVisible: true仿真运行时左下角会出现录制按钮。这对于事后分析、生成数据集非常有用。使用ROS如果你已有的算法基于ROSAirSim也提供了ROS包 (airsim_ros_pkgs)可以将无人机状态、传感器数据以ROS话题的形式发布并订阅控制指令。这为将现有ROS算法迁移到高保真仿真中提供了桥梁。走到这里你已经完成了从零搭建AirSimUE4仿真环境到用Python编写第一个自主飞行脚本的全过程。这套工具链的强大之处在于它为你提供了一个介于游戏级真实感和科研实用性之间的完美沙盒。你可以用它快速验证一个视觉算法的想法测试一条复杂的巡检航线或者单纯地享受在虚拟世界中自由飞行的乐趣。接下来试着修改正方形航线的顶点让它飞一个“8”字或者尝试接入一个简单的计算机视觉库如OpenCV让无人机跟踪仿真环境中的某个彩色物体。探索的乐趣才刚刚开始。

相关新闻