一、概述

在官方实现的AirSim中有一个Block的工程可以通过MavLink协议遥控无人机的飞行,但是Block的场景比较单调,缺少真实性。所以可以更换不同的场景来运行AirSim
原来的Block场景:

更换后的场景:

二、下载场景

  1. 在【虚幻商城】中找到自己喜欢的场景,然后下载到一个目录下面,记得路径不能有中文,否则会编译出错。

  2. 双击*.uptoject打开
    点击菜单【文件】-》【生产Visual Studio 2019项目】

  3. CarGame根目录下面也就是CarGame.uproject同一级目录新建文件夹Plugins

  4. 把下载的D:\002_UE4\AirSim-1.5.0-windows\Unreal\Environments\Blocks\Plugins下的AirSim复制到CarGame/Plugins下面

  5. 使用文本编辑器打开CarGame.uproject添加AirSim插件模块

{"FileVersion": 3,"EngineAssociation": "4.26","Category": "Samples","Description": "","Modules": [{"Name": "VehicleGame","Type": "Runtime","LoadingPhase": "Default"},{"Name": "VehicleGameLoadingScreen","Type": "Runtime","LoadingPhase": "PreLoadingScreen"}],"Plugins": [{"Name": "PhysXVehicles","Enabled": true},{"Name": "RawInput","Enabled": true},{"Name": "AirSim","Enabled": true}],"TargetPlatforms": ["MacNoEditor","WindowsNoEditor"],"EpicSampleNameHash": "2902796019"
}
  1. 右键点击CarGame.uproject ->Generate Visual Studio project files
  2. 双击打开【CarGame.sln】就可以看到AirSim已经添加到工程中了。

三.配置编译

  1. 在工程目录下新建一个项目命名:SelfDemo(自定义的实例),添加一个空的MainCpp.cpp文件。
    把AirSim-1.5.0-windows\HelloSpawnedDrones\HelloSpawnedDrones.cpp,中的内容全部复制过来。
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.#include "common/common_utils/StrictMode.hpp"
STRICT_MODE_OFF
#ifndef RPCLIB_MSGPACK
#define RPCLIB_MSGPACK clmdep_msgpack
#endif // !RPCLIB_MSGPACK
#include "rpc/rpc_error.h"
STRICT_MODE_ON#include "vehicles/multirotor/api/MultirotorRpcLibClient.hpp"
#include "common/common_utils/FileSystem.hpp"
#include <iostream>
#include <chrono>
#include <cstdlib>
#include <thread>void runSingleClient(uint16_t port, int ordinal)
{using namespace msr::airlib;const char host[] = "localhost";float timeout_s = 60;try{MultirotorRpcLibClient *client = new MultirotorRpcLibClient(host, port, timeout_s);std::cout << "Confirming connections..." << std::endl;client->confirmConnection();std::string vehicle_name = "UAV_" + std::to_string(ordinal);std::cout << "Vehicle name:" << vehicle_name << std::endl;Pose pose(Vector3r(0, 5.0f * (ordinal + 1), 0), Quaternionr(0, 0, 0, 0));client->simAddVehicle(vehicle_name, "simpleflight", pose, "");// This is a bit crude, but give it a moment to settle on the ground, else takeoff will failstd::this_thread::sleep_for(std::chrono::duration<double>(2));// moveByVelocityZ is an offboard operation, so we need to set offboard mode.client->enableApiControl(true, vehicle_name);client->armDisarm(true, vehicle_name);auto ground_pos = client->getMultirotorState(vehicle_name).getPosition();float groundZ = ground_pos.z(); // current position (NED coordinate system).  float takeoff_timeout = 5;std::cout << "Initiating takeoff for " << vehicle_name << "..." << std::endl;client->takeoffAsync(takeoff_timeout, vehicle_name)->waitOnLastTask();std::cout << "Completed takeoff for " << vehicle_name << "..." << std::endl;const float speed = 3.0f;// switch to explicit hover mode so that this is the fallback when // move* commands are finished.std::cout << "Initiating hover for " << vehicle_name << "..." << std::endl;client->hoverAsync(vehicle_name)->waitOnLastTask();std::cout << "Completed hover for " << vehicle_name << "..." << std::endl;auto position = client->getMultirotorState(vehicle_name).getPosition();float duration = 1;float z = position.z(); // current position (NED coordinate system).  // Altitude difference between each platform, in metersconst float altitude_delta = 1.0f;z -= ordinal * altitude_delta;float timeout = 10.0f;client->moveToZAsync(z, speed, timeout, YawMode(), -1.0f, 1.0f, vehicle_name)->waitOnLastTask();std::cout << "Completed move to z " << z << " for " << vehicle_name << "..." << std::endl;std::cout << "Flying in a 10m box pattern at 3 m/s velocity" << std::endl;const float size = 5.0f;duration = size / speed;DrivetrainType drivetrain = DrivetrainType::ForwardOnly;YawMode yaw_mode(true, 0);position = client->getMultirotorState(vehicle_name).getPosition();std::cout << "Position of " << port << ": " << position << std::endl;z = position.z(); // current position (NED coordinate system).  std::cout << "moveByVelocityZ(" << speed << ", 0, " << z << "," << duration << ")" << std::endl;client->moveByVelocityZAsync(speed, 0, z, duration, drivetrain, yaw_mode, vehicle_name);std::this_thread::sleep_for(std::chrono::duration<double>(duration));std::cout << "moveByVelocityZ(0, " << speed << "," << z << "," << duration << ")" << std::endl;client->moveByVelocityZAsync(0, speed, z, duration, drivetrain, yaw_mode, vehicle_name);std::this_thread::sleep_for(std::chrono::duration<double>(duration));std::cout << "moveByVelocityZ(" << -speed << ", 0, " << z << "," << duration << ")" << std::endl;client->moveByVelocityZAsync(-speed, 0, z, duration, drivetrain, yaw_mode, vehicle_name);std::this_thread::sleep_for(std::chrono::duration<double>(duration));std::cout << "moveByVelocityZ(0, " << -speed << "," << z << "," << duration << ")" << std::endl;client->moveByVelocityZAsync(0, -speed, z, duration, drivetrain, yaw_mode, vehicle_name);std::this_thread::sleep_for(std::chrono::duration<double>(duration));client->moveToZAsync(groundZ - 0.5f, speed, timeout, YawMode(), -1.0f, 1.0f, vehicle_name)->waitOnLastTask();std::cout << "Hovering..." << std::endl;client->hoverAsync(vehicle_name)->waitOnLastTask();client->enableApiControl(true, vehicle_name);std::cout << "Landing..." << std::endl;client->landAsync(timeout, vehicle_name)->waitOnLastTask();std::this_thread::sleep_for(std::chrono::duration<double>(5));std::cout << "Disarming..." << std::endl;client->armDisarm(false, vehicle_name);std::cout << "Done!..." << std::endl;delete client;std::this_thread::sleep_for(std::chrono::duration<double>(50));}catch (rpc::rpc_error&  e){std::string msg = e.get_error().as<std::string>();std::cout << "Exception raised by the API, something went wrong." << std::endl << msg << std::endl;}
}int main(int argc, char *argv[])
{using namespace msr::airlib;uint16_t rpc_port = 41451;int num_platforms = 1;std::cout << "argc is " << argc << std::endl;if (argc > 1){std::cout << "Num plats string: " << argv[1] << std::endl;num_platforms = static_cast<uint16_t>(std::stoi(argv[1]));}std::cout << "First port is " << rpc_port << std::endl;std::cout << "Num platforms: " << num_platforms << std::endl;std::cout << "Making clients..." << std::endl;try{std::cout << "Press Enter to begin..." << std::endl;std::cin.get();std::vector<std::thread> clientThreads;// Count down, so the first one can easily go the highest (without knowing count)int client_ordinal = num_platforms - 1;for (int i = 0; i < num_platforms; i++){clientThreads.push_back(std::thread(runSingleClient, rpc_port, client_ordinal));client_ordinal--;std::this_thread::sleep_for(std::chrono::duration<double>(0.1));}for (auto &toJoin : clientThreads){toJoin.join();}}catch (rpc::rpc_error&  e){std::string msg = e.get_error().as<std::string>();std::cout << "Exception raised by the API, something went wrong." << std::endl << msg << std::endl;}return 0;
}
  1. 选择配置项,注意:一定要选Debug x64

  2. 配置包含目录

  3. 配置附加库目录

  4. 添加附加依赖项

    如果配置正确的话,一次就会编译成功!

四、运行CarGame

编译CarGame

如果电脑配置不高的话,可能需要一段时间。编译完成以后按【Ctrl+F5】运行,发现弹出以下对话框。


解决办法:打开ue->【文件】-》【烘焙Windows的内容】

经过一段较长时间的运行,完成以后,
设置游戏模式,在【世界场景设置】-》游戏模式重载:AirSimGameMode

使用【独立进场游戏】运行

弹出对话框选择载具【是】汽车【否】无人机,我们选择无人机。
然后运行【SelfDemo】选中项目【SelfDemo】按【Ctrl+F5】运行。点击【回车】就可以运行无人机了

aaa

UE4在新的场景中调用AirSim相关推荐

  1. [unreal4入门系列之十] UE4添加角色到场景中

    现在我们已经有了一个场景并且运行了,我们需要添加一个角色到场景中.要这样做,我们必须从UE4的GameFramework类继承它. 一. 打开上次创建的关卡 如果你已经关闭了项目,并且保存了上次创建的 ...

  2. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类

    Q1:python函数里的数组如何在函数外调用出来 使用返回值的方法有两种: 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子: l = [1,2,3,4,5] d ...

  3. .net中调用esb_都是应用集成,ESB和集成引擎对医疗业务场景的“口味”为何不同?...

    前言:本文由浙江省台州医院刘祉呈撰写,详细说明了集成平台核心中间件集成引擎(IE)与ESB在医疗信息化场景中的各自特点及优劣,并辅以翔实的图文业务流程场景.看完之后能对ESB和集成引擎两者有更深入的了 ...

  4. [unreal4入门系列之八] 使用VS编译UE4编辑器并添加物体到场景中

    接下来,我们将会创建一个放置我们的游戏角色的基本场景. 编译UE4编辑器 1) 现在,我们创建一个空白的UE4项目来开始.首先点击桌面的Epic Games Launcher,打开启动器,点击左上角的 ...

  5. 20 虚幻4【UE4】场景中模型高亮轮廓

    20.UE中如何使得模型再场景中高亮 1.场景的世界大纲搜索Post Process Volume(后期处理体积) 如果没有则需要在[放置Actor]中搜索,然后放到场景中 2.选中[Post Pro ...

  6. 新中新二代身份证dll调用,报尝试读取或写入受保护的内存,这通常指示其他内存已损坏 这个错 ...

    新中新二代身份证dll调用问题:调用这个dll时, 到这个方法: Syn_ReadMsg(nPort, 0, ref CardMsg),就报尝试读取或写入受保护的内存.这通常指示其他内存已损坏 这个错 ...

  7. UE4 学习记录八 给场景中添加背景音乐和动画音效,运动加速效果

    这只是用来记录我学习UE4过程的,可能帮不到你,先说声抱歉.为了防止误导他人,请勿转载,请勿转载,请勿转载. 本文的主题是给场景中添加背景音乐和动画的音效.总章目录(https://blog.csdn ...

  8. Ue4 一个场景中多个玩家之间切换控制权

    目录 蓝图实现在最后 将要操控的玩家放入场景中 选中要切换的角色直接拖到关卡蓝图中(按住Ctrl多选) 在细节面板中选择一个角色将possess设为player 0,这个角色就是进入关卡默认控制的角色 ...

  9. UE4 虚幻引擎,蓝图Custom Event自定义事件,Call In Editor 在编辑器中调用

    1.在Blueprint蓝图中,Custom Event自定义事件的Details细节面板中,打开Call In Editor编辑器中调用. 2.在Map关卡中的的Details细节面板,就可以直接点 ...

最新文章

  1. 源码分析-GLSurfaceView的内部实现
  2. OPENCV3读取avi,解决返回NULL问题
  3. C++绝不在构造和析构过程中调用virtual函数
  4. Linux下远程桌面连接windows
  5. java第五章 多线程_java多线程编程核心技术——第五章总结
  6. flutter对比Android绘制流程,Flutter与android的对比---View
  7. 小白系列之51单片机的入门速成法
  8. python selenium下载,在python中通过Selenium Webdriver下载文件
  9. 【Elasticsearch】es 快照 snapshot 操作实战
  10. GridView position = 0重复加载的问题
  11. Entity Framework 学习初级篇7--基本操作:增加、更新、删除、事务(转)
  12. PCS7串级PID如何连线控制汽包水位三冲量
  13. 网络流量监测IP雷达 1.0
  14. TP-Link路由器端口映射8081端口的Nexus服务外网无法访问的解决办法
  15. IOS 开发 Cache文件夹缓存的清理封装(包括WebKit缓存/SDImageCache缓存),都提供了相应的接口.
  16. 爬虫系列——做爬虫必备:各大网站蜘蛛UA
  17. Android Studio调用百度地图(二):实现地图显示后台定位和步行导航
  18. Java版SLG游戏 竜退治2
  19. LOL进游戏,游戏界面全黑(不是进入峡谷)解决办法(亲测)
  20. 调用后台接口返回报错前端隐藏提示_前端异常监控解决方案研究(转)

热门文章

  1. cygwin 编译linux内核,Cygwin编译ARM Linux内核
  2. java统计文章中单词出现的次数
  3. OpenStack 企业私有云的若干需求(5):主流硬件支持、云快速交付 和 SLA 保证
  4. 图像分割——边缘检测——边缘连接的局部处理(Matlab)
  5. 三种方法解决 IDEA乱码问题
  6. kail 工具使用(一) ddos 攻击
  7. 可以通过限定ip来限制用户重复登录么_王者荣耀2020皮肤返场投票活动地址 五周年限定皮肤返场投票开启公告...
  8. 『原创』WM利用Google Weather API获取天气预报
  9. 自己做的ppt放到其他电脑上没有声音
  10. 焦点分析 | 沸腾的5G:华为三星们嗨了,用户却还没来