在 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 的演示

便于在页面中导航的主题列表

  1. 安装 AirSim

  2. 设置虚幻环境

  3. 将 AirSim 与 ArduPilot 结合使用

  4. 发射旋翼飞行器 SITL

  5. 发射UGV无人车号 SITL

  6. 使用激光雷达

  7. 使用测距仪

  8. 使用遥控手动飞行

  9. 多车模拟

  10. 配备多辆载具的 ROS

  11. 自定义环境

  12. 使用 AirSim API

  13. 在不同机器上运行

  14. 调试和开发工作流程

安装 AirSim

二进制文件 可用于 Windows 和 Linux 平台的 AirSim、 v1.3.0 及以后的版本支持 Copter 和 Rover。二进制文件是一种快速简便的方法,无需安装虚幻引擎等即可测试这些功能。只需下载预编译环境并运行即可立即开始使用。有许多不同类型的环境可供选择,其中一些著名的环境包括 LandscapeMountains、City 和 Neighbourhood。

如果您使用的是二进制文件,那么可以直接跳到 将 AirSim 与 ArduPilot 结合使用 节。另请参见 本自述文件 了解一些有用的命令行选项,以提高性能。

为了开发和测试新功能,您必须从源代码构建 AirSim。从源代码构建的设置说明如下。

在 Windows 上构建

Windows 设置的主页面是 这里但下面也有说明。检查 页面上的常见问题 如果有任何问题。

  1. 安装虚幻引擎

  2. 构建 AirSim - 按照 AirSim 设置步骤 Visual Studio 软件包并克隆 AirSim。

运行 build.cmd 命令行。这将在 虚幻插件 文件夹,该文件夹可以放入任何虚幻项目中。

在 Linux、MacOS 上构建

AirSim 的 Linux & MacOS 设置页面是 这里如果有任何问题,请参阅常见问题。请注意,只有 MacOS 卡塔利娜(10.15) 是支持的。

  1. 构建虚幻引擎 - 在 Epic Games 注册后,您需要将 Github 账户与之链接,请参阅以下内容 页码 如何连接。

  2. 构建 AirSim

  1. 克隆版本库

    git 复制 https://github./微软/空中模拟.git
    
  2. 建造它

    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 上进行过测试,如果您发现有不工作的地方或希望得到支持,请告知我们。

在不同机器上运行

  1. settings.json 档案

    1. UdpIp 到运行 ArduPilot 的机器的 IP 地址(可使用 ipconfig 在 Windows 上、 ifconfig 在 Linux 上)。

    2. 本地主机 IP 是当前运行 AirSim 的机器的 IP 地址,与所使用的网络适配器(如以太网或 WiFi)相关。可设置为 0.0.0.0 在所有网络上接收信息

  2. 使用 -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 文件时,请按 "是 "再次构建。

Linux 故障排除

Windows操作系统常见问题

一般常见问题

在报告任何问题之前,请将 ArduPilot 和 AirSim 安装更新到最新的主版本。更新本地 AirSim 代码库后,请确保运行在 虚幻环境设置页面否则,更新将不会反映在模拟中。