AirSim/Cosys-AirSim 游戏开发(二)使用自定义场景

在实际的开发过程中很少会只用 AirSim 自带的 Blocks 场景,通常需要用到自定义的一些环境和模型,依托于强大的 UE 引擎可以较为逼真地完成场景渲染。这篇博客记录了如何从头开始导入一个自定义场景并加载 AirSim 插件。

【Note】:由于 UE Editor 和商店的版本迭代,有些按钮或工具位置会有变动,我这里使用的是 5.5.1 + UE5 的组合。

核对以下软件版本:

  • Windows 10;
  • UE Launcher + UE5;
  • Visual Studio 2022;
  • AirSim / Cosys-AirSim;

当前所有操作都在Windows上完成,后面会介绍 PX4 和 MAVLINK 在不同设备上通讯

因为我本身不是做 UE 的,只是工作中需要用到 UE,这篇博客是站在一个机器人算法工程师角度展开,因此部分内容可能不太专业,如果存在错误还请在评论区留言,我会在第一时间处理。


1. 从 Epic 商店中选择场景素材

虽然可以直接从浏览器的方式进入商店,但我个人习惯从本地的 Launcher 进入商店,可以少占用一个浏览器的收藏位。

启动 Epic Game Launcher 后按照顺序执行以下操作:

  1. 进入 “库” 标签页;
  2. 下拉到软件最下面找到 “Fab 库” 的位置;
  3. 点击黄色的 “请访问 Fab.com” 链接;

在这里插入图片描述

2025年06月05日 的在线商店长下面这个样子:

在这里插入图片描述

往下拉一些找到 Environments 标签,这个标签里都是可下载的环境,对于初学 AirSim 来说里面的免费资源足够折腾了。

在这里插入图片描述

进入页面后可以在上方的 Price 筛选器中勾选 Free 筛选出免费的场景素材:

在这里插入图片描述

这里以 Downtown West Modular Park 资源为例,选中并点击进去:

在这里插入图片描述

因为我已经将这个资源添加到我的库里了,所以页面右侧显示 “已添加”,如果你之前没有操作过应该可以看见 Add to My Library 按钮,点击并添加到自己的库中,然后刷新页面就可以看见 View in Launcher 按钮。

【Note】:在我写这篇博客的时候点击 View in Launcher 按钮只会自动打开 Epic Launcher,并不会自动添加到本地,需要点击 View in My Library 按钮后手动下载。

在这里插入图片描述

在弹出的 Epic Launcher 中有时候会自动刷新,如果你没看见新加的场景则可以手动刷新一下:

在这里插入图片描述

因为这里添加的是 素材 而不是 工程,所以我们需要自己新建一个工程并将这个素材添加到工程中。


2. 新建一个空白工程

在上一步的 Epic Launcher 中选择右上角的 启动 Unreal Engine 5.5.1 按钮先将UE引擎启动。

【Note】:这里每个人安装的 UE 引擎版本不一样因此可能会存在差异,但这一步的操作都是为了启动引擎创建新的工程。

在这里插入图片描述

在启动后按照下面的流程新建一个工程:

  1. 点击 SIMULATION 标签;
  2. 选择一个存放工程的位置;
  3. 【可选】在 Project Name 中修改你的工程名,这里我偷懒就不修改了;
  4. 点击 Create 创建工程;

在这里插入图片描述

创建工程按钮被点击后 UE 会进行一些基础元素的编译与构建,这一步会花费一点时间,然后自动弹出以下画面,到达这一步至少说明你的 UE 引擎都正常,没有缺少必要的库或文件。

在这里插入图片描述


3. 将场景添加到工程中

3.1 下载资源库场景

先将上面弹出的操作界面关闭,回到 Epic Launcher 中点击 添加到工程 按钮

在这里插入图片描述
在弹出的页面中按照以下顺序操作:

  1. 勾选 显示所有工程
  2. 选择刚才创建的工程 MyProject
  3. 如果你的引擎和我的一样是 UE 5.5.1 那么需要以兼容的形式运行,在 选择版本 中选择一个版本号差距最小的;
  4. 点击 添加到工程

在这里插入图片描述

确认后 Epic Launcher 会自动下载这个资源,等待下载完成即可:

在这里插入图片描述

下载完成后会自动打开新建的工程,这里建议先将下载好的资源备份一份,以免误操作导致损坏文件导致重新下载。位置就在你的工程目录下的 Content 文件夹中,以我的路径为例 C:\Users\Lucks\Desktop\AirSim-Self-Env\MyProject\Content

在这里插入图片描述

3.2 导入场景到操作界面中

返回到 UE Editor 中开始导入场景,按照下面的步骤依次操作:

  1. 打开 左下角 的资源抽屉 Content Drawer
  2. 将左侧文件目录展开,这里使用的是 Downtown_West
  3. 进入到 Maps 文件夹中;
  4. 双击 Demo_Enviroment 等待场景加载完成;

【Note】:不同的资源文件在第3、4步可能存在文件选择差异,但只要是制作合规的场景都有 Level 标签

通常情况下会自动递归加载需要的场景文件,如果你发现显示的不全可以手动进入 Sub-Level 文件加载一些其他场景,这个资源里的子文件中有不同的天空背景,感兴趣的可以多尝试下。

在这里插入图片描述

在场景正确加载后必须检查一下是否可用,点击上方绿色的 Play 按钮进入环境,想要退出的话点击 Esc 即可结束仿真。

在这里插入图片描述

3.3 设置工程默认关卡

在确认环境能正确加载并运行后 Ctrl + S 保存,此时如果你直接退出,然后再在 Launcher 中打开的话仍然显示的是空白场景,这是因为没有设置 默认关卡,按照下面的步骤设置默认关卡:

  1. 在上方工具栏中点击 Edit,然后在下拉菜单栏中点击 Project Settings
  2. 弹出窗口的左侧选择 Maps & Models
  3. Default Maps 中的 Editor Starup Map 中选择 Demo_Enviroment 场景;
  4. 在下面的 Game Default Map 中也选择 Demo_Enviroment 场景;

经过上述操作后下一次打开就是默认的这个场景了。

在这里插入图片描述


4. 创建空的 C++ 类

【Note】:有些工程自带一个空的 C++类 就不需要执行这一步,如果你的下拉菜单中 Generate Visual Studio Project 是灰色不可选中的,那么需要手动创建。这个类基本用不上,是为了引导 UE 生成 Visual Stuido 工程用的。

点击上方工具栏中的 Tools ,在下拉菜单中选择 New C++ Class

在这里插入图片描述

在弹出的页面中点击 Next

在这里插入图片描述

类名可以随意起,用默认也无所谓,点击 Create Class

在这里插入图片描述

等走完进度条后先不要打开编辑器,选择 No 即可:

在这里插入图片描述

此时你的 工程目录下应该会自动生成一个 MyProject,.sln 文件:

在这里插入图片描述

然后关闭 Editor 准备编译 AirSim 插件。


5. 编译 AirSim 插件

这里无论你使用的是 AirSim 还是 Cosys-AirSim 都需要先找到对应的插件位置,但好在两个库的结构基本一致,所以 UE 插件路径也相似。

5.1 复制 Plugins/AirSim 文件夹

我这里以我用的 Cosys-AirSim 为例,其 UE 插件位置在 C:\Users\Lucks\Desktop\Cosys-AirSim\Unreal\Plugins

在这里插入图片描述
然后前往你的工程目录,我这里是 C:\Users\Lucks\Desktop\AirSim-Self-Env\MyProject,如果你的工程目录中有 Plugins 文件夹则直接进去并粘贴上一步复制的 AirSim 文件夹,如果没有就手动创建并复制进去。

在这里插入图片描述

5.2 编辑 MyProject.uproject 文件

回到你的工程目录中使用文本编辑器打开你的 MyProject.uproject 文件并进行编辑:

在这里插入图片描述

然后在 “Plugins” 元素中添加以下字段:

{"Name": "AirSim","Enabled": true	
}

修改完成就保存并关闭。

在这里插入图片描述

5.3 生成 Visual Studio 工程文件

回到工程目录中,右键点击 MyProject.uproject 在弹出的菜单中选择 Generate Visual Studio project file 等待生成结束。

在这里插入图片描述


[可选] 6. 配置 Visual Studio 工程

如果你想要在这个工程上验证一下官方的无人机起降Demo可以按照下面的流程进行,官方 Demo 的核心是里面的一个 cpp 文件,执行了无人机起飞、运动几米、拍照、降落这几个动作。

在上面工程文件成功生成后就可以双击打开 MyProject.sln 启动 Visual Stuido:

在这里插入图片描述

6.1 新建一个空白工程

右键 Games 然后在 Add 中新建一个空白工程 New Project
在这里插入图片描述

在弹出的窗口中直接选择 Empty Project 就够用了,我这里给工程起名为 SelfDemo

在这里插入图片描述

6.2 复制 HelloSpawnedDrones.cpp 文件

前往你的 AirSim 或 Cosys-AirSim 的安装路径,找到 HelloSpawnedDrones.cpp 文件,这个文件就是用来生成一个可用的无人机入口,对于我而言这个文件在 C:\Users\Lucks\Desktop\Cosys-AirSim\HelloSpawnedDrones\HelloSpawnedDrones.cpp

在这里插入图片描述

然后将这个文件复制到刚才新建的空白工程目录下 Source\MyProject 文件夹中,对我而言就是在路径 C:\Users\Lucks\Desktop\AirSim-Self-Env\MyProject\SelfDemo

在这里插入图片描述

在 Visual Stduo 中将这个文件添加到项目中,浏览文件将其加入到编译队列里:

在这里插入图片描述

6.3 设置工程为启动项

右键新建的工程,并在弹出的菜单中选择 Set as Startup Project

在这里插入图片描述

然后就是传统的配置 Visual Stduio 项目步骤了。

6.4 添加包含目录

找到你刚才复制进来的 Plugins/AirSim 的插件文件夹,并将以下三个路径复制进去:

  • Plugins\AirSim\Source\AirLib\include;
  • Plugins\AirSim\Source\AirLib\deps\eigen3;
  • Plugins\AirSim\Source\AirLib\deps\rpclib\include;

在这里插入图片描述

效果如下:

在这里插入图片描述

6.5 添加附加库目录

附加库目录需要根据当前编译条件修改,本质是下面三个路径:

  • Plugins\AirSim\Source\AirLib\lib
  • Plugins\AirSim\Source\AirLib\deps\rpclib\lib
  • Plugins\AirSim\Source\AirLib\deps\MavLinkCom\lib

在这里插入图片描述

次数还需要手动修改路径末尾的信息,为上面的路径添加 $(Platform)\$(Configuration) 结尾,最终效果如下:

在这里插入图片描述

6.6 添加附加依赖项

添加附加依赖项基本和上面一致,将 *.lib 加上即可:

在这里插入图片描述
最终效果如下:

在这里插入图片描述


7. 编译工程

7.1 编译 Visual Studio 工程

Debug + x64 的组合编译工程 MyProject

在这里插入图片描述

如果编译有报错,大概率是 6.46.56.6 没有配置好,仔细检查路径是否正确。

如果确认上面的配置都没有问题,但仍然报错没有找到头文件,你需要去 MyProject 中查看是不是把 HelloSpawnedDrones.cpp 文件放到了工程里,这个文件应该在新建的项目中添加。

7.2 编译 UE 工程

双击打开 MyProject.uproject 然后点击确认即可。

在这里插入图片描述
等待 UE Editor 完全启动后在右上角点击 Settings -> World Settings

在这里插入图片描述

在更新后的右边导航栏中选择 Game Mode 中的 Game Mode Override -> AirSimGameMode

在这里插入图片描述

然后点击 Play 按钮就可以看见无人机生成了:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/web/82617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GPU 图形计算综述 (三):可编程管线 (Programmable Pipeline)

2000年左右,微软在DirectX 8.0中首次提出了Shader Model 1.0和顶点着色器(Vertex Shader)的概念,标志着可编程管线时代的来临。随后,在DirectX 9.0中推出了Shader Model 2.0和像素着色器(Pixel Shader&…

【Go语言基础【3】】变量、常量、值类型与引用类型

文章目录 一、值(Value)与字面量(Literal)1. 值2. 字面量 二、变量(Variable)1. 声明方式2. 赋值方式3. 变量默认值4. 类型与值的匹配 三、常量(Constant)1. 声明方式2. 常量的特性3…

AWS 亚马逊 S3存储桶直传 前端demo 复制即可使用

自己踩过坑不想别人也踩坑了 亚马逊S3存储桶直传前端demo复制即可使用 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0…

Python数据可视化科技图表绘制系列教程(四)

目录 带基线的棒棒糖图1 带基线的棒棒糖图2 带标记的棒棒糖图 哑铃图1 哑铃图2 包点图1 包点图2 雷达图1 雷达图2 交互式雷达图 【声明】&#xff1a;未经版权人书面许可&#xff0c;任何单位或个人不得以任何形式复制、发行、出租、改编、汇编、传播、展示或利用本博…

如何有效删除 iPhone 上的所有内容?

“在出售我的 iPhone 之前&#xff0c;我该如何清除它&#xff1f;我担心如果我卖掉它&#xff0c;有人可能会从我的 iPhone 中恢复我的信息。” 升级到新 iPhone 后&#xff0c;你如何处理旧 iPhone&#xff1f;你打算出售、以旧换新还是捐赠&#xff1f;无论你选择哪一款&am…

[yolov11改进系列]基于yolov11使用SwinTransformer替换backbone用于提高多尺度特征提取能力的python源码+训练源码

【SwinTransformer介绍】 摘要 ViT的缺点&#xff1a; Transformer在语言处理中的基本元素是word token&#xff0c;其特点是语义信息比较密集。而ViT中token的尺度&#xff08;scale&#xff09;是固定的&#xff0c;且视觉token携带的语义信息比语言文字序列差&#xff0c…

NoSQL 之 Redis 配置与优化

目录 一、Redis 介绍 1、关系型数据库与非关系型数据库 &#xff08;1&#xff09;关系型数据库 &#xff08;2&#xff09;非关系型数据库 &#xff08;3&#xff09;非关系型数据库产生背景 2、Redis 基础 &#xff08;1&#xff09;Redis 简介 &#xff08;2&#x…

算法复杂度,咕咕咕

1.数据结构与算法 数据结构是计算机存储&#xff0c;组织数据的方式&#xff0c;指相互之间存在一种或多种特定关系的数据元素的集合。可以理解为形状不同的容器。 算法是定义好的计算过程&#xff0c;取输入值&#xff0c;经过一系列计算方法变成输出值。 &#xff08;推荐…

【Linux】 Linux 进程控制

参考博客&#xff1a;https://blog.csdn.net/sjsjnsjnn/article/details/125581083 一、进程创建 1.1 fork()函数 在linux中fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。进程调用fork&#xff0c;当…

【大模型】MCP是啥?它和点菜、做菜、端菜有啥关系?

什么是 Model Context Protocol (MCP)? Model Context Protocol(模型上下文协议),通俗来说,就是一套用来管理、传递和维护对话或交互中上下文信息的规则和格式标准。 换句话说,MCP定义了模型在处理用户输入和生成回答时,如何理解、保留和传递上下文信息的协议,确保对…

机器学习的数学基础:决策树

决策树 文章目录 决策树决策树的基本思想划分选择信息增益增益率基尼指数 减枝处理回归问题对连续值的处理对缺失值的处理 决策树的基本思想 决策树是基于树结构来进行决策的&#xff0c;通过对问题的判断与决策&#xff0c;得到最终决策。 一般的&#xff0c;决策树包括一个…

基于若依前后分离版-用户密码错误锁定

sys_config配置参数 user.password.maxRetryCount&#xff1a;最大错误次数 user.password.lockTime&#xff1a;锁定时长 //SysLoginController//登录 PostMapping("/login") public AjaxResult login(RequestBody LoginBody loginBody) {AjaxResult ajax AjaxR…

Java线程安全集合类

Java线程安全集合类全面解析 目录 并发集合概述List线程安全实现Set线程安全实现Map线程安全实现Queue线程安全实现总结 并发集合概述 Java提供了多种线程安全的集合类&#xff0c;主要分为两大类&#xff1a; 传统同步集合&#xff1a;通过synchronized关键字实现线程安全…

汇川变频器MD600S-4T-5R5为什么要搭配GRJ9000S-10-T滤波器?

一、变频器的工作原理与电磁干扰 汇川MD600S-4T-5R5变频器是一款紧凑型高性能变频器&#xff0c;适用于三相380V-480V电网&#xff0c;额定电流5.5A&#xff0c;支持矢量控制和多种编码器接口&#xff0c;适用于需要高精度速度和转矩控制的场景&#xff0c;如机器人、电梯、纺…

数学运算在 OpenCV 中的核心作用与视觉效果演示

在计算机视觉中&#xff0c;图像不仅仅是我们肉眼所见的内容&#xff0c;它其实是由数值矩阵组成的“数据”。而在 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;中&#xff0c;正是数学运算赋予了图像处理无限的可能——从基本的滤波、增强到复杂的特征…

【快速预览经典深度学习模型:CNN、RNN、LSTM、Transformer、ViT全解析!】

&#x1f680;快速预览经典深度学习模型&#xff1a;CNN、RNN、LSTM、Transformer、ViT全解析&#xff01; &#x1f4cc;你是否还在被深度学习模型名词搞混&#xff1f;本文带你用最短时间掌握五大经典模型的核心概念和应用场景&#xff0c;助你打通NLP与CV的任督二脉&#xf…

springboot mysql/mariadb迁移成oceanbase

前言&#xff1a;项目架构为 springbootmybatis-plusmysql 1.部署oceanbase服务 2.springboot项目引入oceanbase依赖&#xff08;即ob驱动&#xff09; ps&#xff1a;删除原有的mysql/mariadb依赖 <dependency> <groupId>com.oceanbase</groupId> …

电网“逆流”怎么办?如何实现分布式光伏发电全部自发自用?

2024年10月9日&#xff0c;国家能源局综合司发布了《分布式光伏发电开发建设管理办法&#xff08;征求意见稿&#xff09;》&#xff0c;意见稿规定了户用分布式光伏、一般工商业分布式光伏以及大型工商业分布式光伏的发电上网模式&#xff0c;当选择全部自发自用模式时&#x…

C语言之编译器集合

C语言有多种不同的编译器&#xff0c;以下是常见的编译工具及其特点&#xff1a; 一、主流C语言编译器 GCC&#xff08;GNU Compiler Collection&#xff09; 特点&#xff1a;开源、跨平台&#xff0c;支持多种语言&#xff08;C、C、Fortran 等&#xff09;。 使用场景&…

负载均衡将https请求转发后端http服务报错:The plain HTTP request was sent to HTTPS port

https请求报错&#xff1a;The plain HTTP request was sent to HTTPS port 示例背景描述&#xff1a; www.test.com:11001服务需要对互联网使用https提供服务后端java服务不支持https请求&#xff0c;且后端程序无法修改&#xff0c;仅支持http请求 问题描述&#xff1a; 因…