在 AirSim 中使用 SITL¶
空中模拟 是一款基于虚幻引擎开发的无人机、载具等模拟器(他们还试验性地支持 Unity,但目前还没有与 ArduPilot 一起使用)。
它开源、跨平台,可提供出色的物理和视觉逼真模拟。它的开发目的是成为一个人工智能研究平台,用于实验自动驾驶载具的深度学习、计算机视觉和强化学习算法。
目前,AirSim & ArduPilot 支持 Copter & Rover 载具。
已测试过在单台 Linux 机器和 Ubuntu 16.04、18.04 以及在 Windows 10 & 中运行 AirSim 和在 WSL(Ubuntu 18.04)中运行 ArduPilot 的独立机器上进行的集成。AirSim 可以在 MacOS 上运行,但与 ArduPilot 的集成尚未在 MacOS 上进行测试。
AirSim 是在模拟载具上测试和开发基于计算机视觉等系统的绝佳平台。它是一个功能非常丰富的模拟器,具有详细的环境和用于收集数据的应用程序接口(Python、C++、ROS)。请参见 主 Airsim 自述文件 了解详细信息和可用功能。
使用 ArduPilot SITL 运行 AirSim 的演示
便于在页面中导航的主题列表
安装 AirSim¶
二进制文件 可用于 Windows 和 Linux 平台的 AirSim、 v1.3.0
及以后的版本支持 Copter 和 Rover。二进制文件是一种快速简便的方法,无需安装虚幻引擎等即可测试这些功能。只需下载预编译环境并运行即可立即开始使用。有许多不同类型的环境可供选择,其中一些著名的环境包括 LandscapeMountains、City 和 Neighbourhood。
如果您使用的是二进制文件,那么可以直接跳到 将 AirSim 与 ArduPilot 结合使用 节。另请参见 本自述文件 了解一些有用的命令行选项,以提高性能。
为了开发和测试新功能,您必须从源代码构建 AirSim。从源代码构建的设置说明如下。
在 Windows 上构建¶
Windows 设置的主页面是 这里但下面也有说明。检查 页面上的常见问题 如果有任何问题。
构建 AirSim - 按照 AirSim 设置步骤 Visual Studio 软件包并克隆 AirSim。
运行 build.cmd
命令行。这将在 虚幻插件
文件夹,该文件夹可以放入任何虚幻项目中。
在 Linux、MacOS 上构建¶
AirSim 的 Linux & MacOS 设置页面是 这里如果有任何问题,请参阅常见问题。请注意,只有 MacOS 卡塔利娜(10.15) 是支持的。
克隆版本库
git 复制 https://github.网/微软/空中模拟.git建造它
CD 空中模拟 ./设置.吁 ./构建.吁
设置虚幻环境¶
最后,您将需要一个虚幻项目来为您的载具提供环境。AirSim 内置了一个 "Blocks 环境",您可以使用它,也可以创建自己的环境。
为了保持 repo 的合理大小,Blocks 并不是一个非常详细的环境,但它对各种测试一直很有用,也是在这片陌生的土地上站稳脚跟的最简单方法。
参见 AirSim 的 区块设置页面 用于运行环境。
如需使用其他环境,请查看本页末尾的信息。
将 AirSim 与 ArduPilot 结合使用¶
确保您有 设置 ArduPilot SITL如果您已经完成了虚幻环境设置,或者已经下载了二进制文件,请在继续操作前确认这两个文件都可以单独运行。如果您不熟悉 SITL,请参阅 使用 SITL 的实例.
备注
在 UE 编辑器中运行:转到 编辑->编辑器 首选项
在 搜索
盒型 中央处理器
并确保 使用 更少 中央处理器 当 于 背景介绍
未选中。
备注
如果使用 Windows Subsystem for Linux 2 在 Windows 下运行 ArduPilot 和 AirSim,请参见 https://discuss.ardupilot.org/t/gsoc-2019-airsim-simulator-support-for-ardupilot-sitl-part-ii/46395/5 如何连接它们。
AirSim 的 settings.json 文件 指定载具及其各种属性。有关可用选项,请参阅页面。
它存储在以下位置 - Windows: Documents\AirSim
, Linux: ~/Documents/AirSim
文件采用常见的 JSON 格式。首次启动时,AirSim 将创建 settings.json
文件,没有任何设置。
发射旋翼飞行器 SITL¶
使用 ArduCopter 时,设置如下
{
"设置版本";: 1.2,
"LogMessagesVisible";: 真,
"SimMode";: "多旋翼";,
"OriginGeopoint";: {
"纬度";: -35.363261,
"经度";: 149.165230,
"高度";: 583
},
"载具";: {
"旋翼飞行器";: {
"载具类型";: "ArduCopter";,
"UseSerial";: 错误,
"LocalHostIp";: "127.0.0.1",
"UdpIp";: "127.0.0.1",
"UdpPort";: 9003,
"ControlPort";: 9002
}
}
}
备注
早些时候 SitlPort
用来代替 控制端口
在设置中。此更改适用于最新的 AirSim 主版本和二进制文件 v1.3.0 及更高版本。该更新向后兼容,因此即使您使用的是 SitlPort
这样就可以了。
首先启动 AirSim,然后使用以下命令启动 ArduPilot SITL
模拟载具.py -v ArduCopter -f airsim-旋翼飞行器 --游戏机 --地图
备注
最初,如果 ArduPilot SITL 尚未启动,编辑器会在按下播放按钮后挂起(这是由于锁定步进调度)。运行 sim_vehicle.py 就会恢复正常。
关闭时,首先按 "停止 "按钮停止 AirSim 仿真,然后关闭 ArduPilot。如果先关闭 ArduPilot,则 UE 会挂起,您需要强制关闭它。
只需按下 "播放 "按钮,然后启动 ArduPilot 端即可重新启动,无需完全关闭编辑器再重新启动。
发射UGV无人车号 SITL¶
settings.json
使用 ArduRover-
{
"设置版本";: 1.2,
"SimMode";: "载具";,
"OriginGeopoint";: {
"纬度";: -35.363261,
"经度";: 149.165230,
"高度";: 583
},
"载具";: {
"UGV无人车";: {
"载具类型";: "ArduRover";,
"UseSerial";: 错误,
"LocalHostIp";: "127.0.0.1",
"UdpIp";: "127.0.0.1",
"UdpPort";: 9003,
"ControlPort";: 9002,
"自动创建";: 真,
"传感器";: {
"Imu";: {
"传感器类型";: 2,
已启用";: 真
},
"Gps";: {
"传感器类型";: 3,
已启用";: 真
}
}
}
}
}
首先启动 AirSim,然后使用以下命令启动 ArduPilot SITL
模拟载具.py -v 无人车UGV -f airsim-无人车UGV --游戏机 --地图
本页中描述的其他功能等都有针对 Copter 的设置、命令和文件,但也可用于 Rover。某些文件,如脚本和 settings.json
为保持页面的可管理性和可导航性,我们没有为 Rover 添加单独的设置。
您可能需要调整飞行器以便正确使用。 工具/autotest/默认参数 可以直接修改,也可以创建一个新的参数文件,并使用 --添加参数文件
中的选项 sim_vehicle.py
.
使用激光雷达¶
参见 激光雷达设置 了解激光雷达及其在 AirSim 中的属性。
当前 settings.json 发射带有激光雷达的 ArduCopter 的文件
{
"设置版本";: 1.2,
"SimMode";: "多旋翼";,
"OriginGeopoint";: {
"纬度";: -35.363261,
"经度";: 149.165230,
"高度";: 583
},
"载具";: {
"旋翼飞行器";: {
"载具类型";: "ArduCopter";,
"UseSerial";: 错误,
"LocalHostIp";: "127.0.0.1",
"UdpIp";: "127.0.0.1",
"UdpPort";: 9003,
"ControlPort";: 9002,
"自动创建";: 真,
"传感器";: {
"Imu";: {
"传感器类型";: 2,
已启用";: 真
},
"Gps";: {
"传感器类型";: 3,
已启用";: 真
},
"激光雷达1";: {
"传感器类型";: 6,
已启用";: 真,
"NumberOfChannels";: 1,
"PointsPerSecond";: 5000,
"DrawDebugPoints";: 错误,
"每秒旋转次数";: 10,
"VerticalFOVUpper";: 0,
"VerticalFOVLower";: 0,
"HorizontalFOVStart";: 0,
"HorizontalFOVEnd";: 359,
"DataFrame";: "SensorLocalFrame";,
"ExternalController";: 真
}
}
}
}
}
使用激光雷达发射旋翼飞行器
模拟载具.py -v ArduCopter -f airsim-旋翼飞行器 --增加-停止-文件=图书馆/SITL/例子/Airsim/激光雷达.调味料 --游戏机 --地图
默认情况下 BendyRuler 物体规避功能 与激光雷达一起使用时,相关参数可在维基页面上查看,并应根据需要在 lidar.parm
定义
您可以通过设置 绘制调试点
至 真
中的激光雷达传感器设置。请注意,这会大大降低 FPS,甚至可能导致内存问题和版本崩溃。 v1.3.1
及更早。
使用测距仪¶
ArduPilot 中的测距仪在 AirSim 中称为距离传感器。请参见 AirSim 的传感器页面 详细信息,以及 测距仪设置 获取 ArduPilot 方面的信息。
下面是一些设置和参数示例,用于创建一个向前和向下测距仪。请注意,这里只提供了传感器设置,可以很容易地将其替换为 传感器
元素。
"传感器";: {
"Imu";: {
"传感器类型";: 2,
已启用";: 真
},
"Gps";: {
"传感器类型";: 3,
已启用";: 真
},
"距离1";: {
"传感器类型";: 5,
已启用";: 真,
"DrawDebugPoints";: 真,
"偏航/航向";: 0, "投球";: -90, "滚";: 0,
"ExternalController";: 真
},
"距离2";: {
"传感器类型";: 5,
已启用";: 真,
"DrawDebugPoints";: 真,
"ExternalController";: 真
}
}
有关设置字段的详细信息,请参阅 AirSim 传感器页面. 绘制调试点
设置为 真
因为它有助于解决定向问题。设置 外部控制器
至 错误
来禁用向 AP 发送特定传感器数据,但传感器仍然存在。如果您想在现有系统之外使用自己的避障系统,这将非常有用,该设置适用于激光雷达和测距仪。
启用测距仪、 RNGFNDx_TYPE
应设置为 100(SITL)。同时启用两个测距仪的参数为
# 第一个测距仪(AirSim 中的距离传感器),朝下
RNGFND1_TYPE 100
RNGFND1_MIN_CM 0
RNGFND1_MAX_CM 4000
RNGFND1_ORIENT 25
# 第二个,面向前方
RNGFND2_TYPE 100
RNGFND2_MIN_CM 0
RNGFND2_MAX_CM 4000
RNGFND2_ORIENT 0
测距仪可用于避障和精确测量高度。目前,ArduPilot 最多支持 10 个测距仪。
使用遥控手动飞行¶
若要手动飞行,则需要遥控器或遥控装置。
只需将设备插入电脑,它就能正常工作。查看 AirSim 的远程控制页面 了解有关支持设备和常见问题的详细信息。
备注
该功能目前尚未经过正常测试,因此您可能需要修改页面中提到的操纵杆文件或设置一些遥控参数,尤其是在使用不同控制器的情况下。
多车模拟¶
为模拟 2 架旋翼飞行器,添加了一个示例脚本,该脚本将创建 2 个旋翼飞行器实例,并在其中一个实例中启用跟随模式。
settings.json
用于 2 架旋翼飞行器
{
"设置版本";: 1.2,
"SimMode";: "多旋翼";,
"OriginGeopoint";: {
"纬度";: -35.363261,
"经度";: 149.165230,
"高度";: 583
},
"载具";: {
"Copter1";: {
"载具类型";: "ArduCopter";,
"UseSerial";: 错误,
"LocalHostIp";: "127.0.0.1",
"UdpIp";: "127.0.0.1",
"UdpPort";: 9003,
"ControlPort";: 9002
},
"Copter2";: {
"载具类型";: "ArduCopter";,
"UseSerial";: 错误,
"LocalHostIp";: "127.0.0.1",
"UdpIp";: "127.0.0.1",
"UdpPort";: 9013,
"ControlPort";: 9012,
"X";: 0, "Y";: 3, "Z";: 0
}
}
}
按下 "播放",cd 到 ardupilot 目录,然后运行脚本启动 2 个旋翼飞行器实例。您可以选择将装有 GCS 的计算机的 IP 地址指定为第一个参数,默认情况下是 127.0.0.1,这意味着一切都在同一台计算机上。
图书馆/SITL/例子/Airsim/遵循-旋翼飞行器.吁 <;IP>;
附加 MAVProxy
mavproxy.py --师=127.0.0.0.1:14550 --消息来源-系统 1 --游戏机 --地图
这将显示地图,但只有一辆车,请使用 载具
命令来切换载具控制,例如使用 载具 1
及样品; 载具 2
之后,两辆车都会出现在地图上
现在,您可以让第一架飞行器(即 SYSID 1)在制导或自动任务模式下飞行,然后起飞第二架飞行器并将其设置为跟随模式,之后第二架旋翼飞行器将跟随第一架飞行器。
要增加模拟载具的数量,只需修改 NCOPTERS
变量,并在脚本的 settings.json
.
备注
由于 Linux、WSL、Cygwin 等平台之间的网络差异,在进行多载具仿真时可能会出现一些问题。 本讨论主题 在这种情况下,"......
备注
端口之间相差 10 个端口很重要,因为脚本是使用 实例
选项,将 ArduPilot 端口增加 10 个。如需使用不同的端口,请按照页面末尾的说明修改脚本,以指定端口。
多车模拟 ROS¶
使用 ROS 执行多载具任务是一种常见的用例,而 Mavros 则用于与基于 Mavlink 的载具协同工作。一些示例脚本演示了如何在 ArduPilot 中将 Mavros 与多辆载具配合使用。
首先是 multi_vehicle.sh 脚本 启动多个 ArduCopter 二进制文件,每个飞行器使用不同的 SYSID 和端口。使用方法与上述脚本类似
图书馆/SITL/例子/Airsim/多载具.吁 <;IP>;
"这款" multi_uav_ros_sitl.launch 文件 演示了如何编写一个发射文件,用 Mavros 控制多个飞行器。它为每架无人机创建了不同的命名空间,并且根据脚本设置变量的方式,每架无人机都有独立的 SYSID 和端口。启动文件
玫瑰发射 图书馆/SITL/例子/Airsim/multi_uav_ros_sitl.启动
通过连接脚本为每架无人机打开的 TCP 端口,可为每架无人机启动单独的 MAVProxy 实例。如果 Mavros 已在运行,则不能使用 UDP 端口,因为 Mavros 会使用 UDP 端口。
"这款" multi_vehicle.sh
脚本不会启用跟车模式,但如果也需要启用跟车模式,而且所有载具都要显示在同一台 GCS 上,那么就可以按照在 follow-copter.sh
可以添加脚本。
自定义环境¶
有关在 Windows 上使用另一种环境,请参阅 AirSim 的自定义环境设置页面.
Linux操作系统¶
正如上面链接的页面所提到的,Linux 上没有 Epic Games Launcher,这意味着如果你需要使用自定义环境,你需要在 Windows 机器上进行操作。
下载虚幻项目后,只需将项目复制到 Linux 机器上即可。
按照上述步骤操作,直到步骤 6 之后编辑了 .向上项目
文件。编辑完项目文件后,跳过步骤 7、8,直接启动编辑器,方法是进入 UnrealEngine 文件夹并运行以下命令启动虚幻 UnrealEngine/Engine/Binaries/Linux/UE4Editor
.
当虚幻引擎提示打开或创建项目时,选择 "浏览 "并选择自定义环境。然后,继续按照 9 开始的步骤操作。
备注
使用自定义环境时,可能会有多个 球员 开始
物体。在这种情况下,它会随机选择一个,载具就会在空中启动并下落。
您必须删除多余的 球员 开始
物体,并留下一个必须移动到地面附近的物体。请参阅 AirSim 开发人员的精彩视频--"AirSim"。 虚幻 AirSim 设置特别是在 5:00 处,演示了如何删除对象和移动位置。
使用 AirSim API¶
AirSim 的 API 文档 解释了不同的可用 API 及其用法。
目前,ArduPilot 载具不支持通过 AirSim API 控制运动,但任何直接连接到 ArduPilot 而不是使用 AirSim API 的运动控制方法都可以使用,例如 DroneKit & ROS 与 Mavros。
"这款" 图像应用程序接口 已经过测试,可以与 Copter 配合使用。 PythonClient/multirotor
例如 opencv_show.py
.此外,任何用于获取环境信息、与环境交互或甚至收集传感器信息的应用程序接口都可以使用。
还添加了 ROS 封装程序。参见 airsim_ros_pkgs 用于 ROS 应用程序接口,以及 airsim_tutorial_pkgs 的教程。请注意,这里也存在控制载具移动的限制。
备注
并非所有的应用程序接口都已在 Copter 上进行过测试,如果您发现有不工作的地方或希望得到支持,请告知我们。
在不同机器上运行¶
在
settings.json
档案UdpIp
到运行 ArduPilot 的机器的 IP 地址(可使用ipconfig
在 Windows 上、ifconfig
在 Linux 上)。本地主机 IP
是当前运行 AirSim 的机器的 IP 地址,与所使用的网络适配器(如以太网或 WiFi)相关。可设置为0.0.0.0
在所有网络上接收信息
使用
-A
论点sim_vehicle.py
(将后面的参数传递给 SITL 实例),然后是-模拟地址
指定 Airsim 的 IP 地址
举例说明
模拟载具.py -v ArduCopter -f airsim-旋翼飞行器 --游戏机 --地图 -A --模拟-地址=127.0.0.0.1
备注
如果使用 Windows,可能需要禁用 Windows 防火墙才能接收信息
使用不同的端口¶
UdpPort
表示 ArduPilot 接收传感器数据的端口号(即 Airsim 发送数据的端口号)
控制端口
指定 Airsim 接收转子控制信息的电机控制端口
--sim-port-in
应等于传感器端口,即在UdpPort
--模拟端口输出
应等于电机控制端口,即在控制端口
与上述更改 IP 地址类似,使用 -A
将参数传递给 SITL 实例。示例
模拟载具.py -v ArduCopter -f airsim-旋翼飞行器 --游戏机 --地图 -A "--sim-port-in=9003 --sim-port-out=9002"
开发工作流程¶
AirSim 的 开发工作流程页面 解释了在 Windows 上开发 Airsim 的推荐设置。
对于 Linux,在 AirLib 或 Unreal/Plugins 文件夹中更改代码,然后运行 ./build.sh
来重建。此步骤还会将构建输出复制到 Blocks 示例项目中。然后,您可以按照步骤启动虚幻编辑器并启动项目。当提示缺少 .so 文件时,请按 "是 "再次构建。
在报告任何问题之前,请将 ArduPilot 和 AirSim 安装更新到最新的主版本。更新本地 AirSim 代码库后,请确保运行在 虚幻环境设置页面否则,更新将不会反映在模拟中。