Linux 上 Docker 中的 AirSim#

我们有两个 Docker 选项。你可以构建一个用于运行AirSim Linux 二进制文件的镜像,或者构建一个用于从源代码编译虚幻引擎 + AirSim 的镜像。

二进制文件#

要求:#

构建 Docker 镜像#

  • 以下是默认参数。--base_image:这是我们将安装 AirSim 的基础镜像。我们已经在 Ubuntu 18.04 和 CUDA 10.0 上进行了测试。你可以自行承担风险指定任何 NVIDIA cudagl--target_image 是你 Docker 镜像的所需名称。默认为 airsim_binary,标签与基础镜像相同。
$ cd Airsim/docker;
$ python build_airsim_image.py \
   --base_image=nvidia/cudagl:10.0-devel-ubuntu18.04 \
   --target_image=airsim_binary:10.0-devel-ubuntu18.04
  • 通过以下命令验证你是否拥有一个镜像:$ docker images | grep airsim

在 Docker 容器中运行虚幻二进制文件#

  • 获取一个 Linux 二进制文件或在 Ubuntu 中打包你自己的项目。我们以 Blocks 二进制文件为例。你可以通过运行以下命令下载它
   $ cd Airsim/docker;
   $ ./download_blocks_env_binary.sh

修改它以获取所需的特定二进制文件。

  • 在 Docker 容器中运行虚幻二进制文件,语法如下:
   $ ./run_airsim_image_binary.sh DOCKER_IMAGE_NAME UNREAL_BINARY_SHELL_SCRIPT UNREAL_BINARY_ARGUMENTS -- headless

对于 Blocks,你可以执行 $ ./run_airsim_image_binary.sh airsim_binary:10.0-devel-ubuntu18.04 Blocks/Blocks.sh -windowed -ResX=1080 -ResY=720

  • DOCKER_IMAGE_NAME:与上一步中的 target_image 参数相同。默认情况下,输入 airsim_binary:10.0-devel-ubuntu18.04
  • UNREAL_BINARY_SHELL_SCRIPT:对于 Blocks 环境,它将是 Blocks/Blocks.sh
  • UNREAL_BINARY_ARGUMENTS:对于 AirSim,最相关的是 -windowed-ResX-ResY。点击链接查看所有选项。

  • 在无头模式下运行:在末尾加上 -- headless

    $ ./run_airsim_image_binary.sh Blocks/Blocks.sh -- headless

  • 指定 settings.json

源代码#

要求:#

在 Docker 中构建虚幻引擎:#

  • 要获取虚幻引擎的源代码,请在 Epic Games 网站上注册并将其链接到你的 github 帐户,如此处“所需步骤”部分所述。

    请注意,你不需要执行“第 2 步:在 Linux 上下载 UE4”!

  • 构建虚幻引擎 4.19.2 Docker 镜像。我们将在示例中使用 CUDA 10.0。$ ue4-docker build 4.19.2 --cuda=10.0 --no-full

    • [可选] $ ue4-docker clean 以释放一些空间。详细信息在此处
    • ue4-docker 支持 NVIDIA 的 cudagl dockerhub 上此处列出的所有 CUDA 版本。
    • 请参阅此页面,了解使用 ue4-docker 进行高级配置。
  • 磁盘空间

在 UE4 Docker 容器中构建 AirSim:#

  • 构建 AirSim Docker 镜像(它位于我们刚刚构建的虚幻镜像之上)。以下是默认参数。
    • --base_image:这是我们将安装 AirSim 的基础镜像。我们已在 adamrehn/ue4-engine:4.19.2-cudagl10.0 上进行了测试。有关其他版本,请参阅 ue4-docker
    • --target_image 是你的 Docker 镜像的所需名称。默认为 airsim_source,标签与基础镜像相同。
$ cd Airsim/docker;
$ python build_airsim_image.py \
   --source \
   ----base_image adamrehn/ue4-engine:4.19.2-cudagl10.0 \
   --target_image=airsim_source:4.19.2-cudagl10.0

运行 AirSim 容器#

  • 运行我们构建的 AirSim 源镜像
   ./run_airsim_image_source.sh airsim_source:4.19.2-cudagl10.0

语法是 ./run_airsim_image_source.sh DOCKER_IMAGE_NAME -- headless -- headless:添加此后缀以在可选的无头模式下运行。

  • 在容器内部,你可以在 /home/ue4 下看到 UnrealEngineAirSim
  • 在容器内启动虚幻引擎:ue4@HOSTMACHINE:~$ /home/ue4/UnrealEngine/Engine/Binaries/Linux/UE4Editor
  • 指定 airsim settings.json
  • 继续阅读 AirSim 的 Linux 文档

[杂项] 在 airsim_source 容器中打包虚幻环境#

  • 我们以 Blocks 环境为例。在以下脚本中,通过 project 指定你的虚幻 uproject 文件的完整路径,并通过 archivedirectory 指定你希望二进制文件放置的目录。
$ /home/ue4/UnrealEngine/Engine/Build/BatchFiles/RunUAT.sh BuildCookRun -platform=Linux -clientconfig=Shipping -serverconfig=Shipping -noP4 -cook -allmaps -build -stage -prereqs -pak -archive \
-archivedirectory=/home/ue4/Binaries/Blocks/ \
-project=/home/ue4/AirSim/Unreal/Environments/Blocks/Blocks.uproject

这将在 /home/ue4/Binaries/Blocks/ 中创建一个 Blocks 二进制文件。你可以通过运行 /home/ue4/Binaries/Blocks/LinuxNoEditor/Blocks.sh -windowed 来测试它。

指定 settings.json#

airsim_binary Docker 镜像:#

  • 我们将主机上的 PATH/TO/Airsim/docker/settings.json 映射到 Docker 容器的 /home/airsim_user/Documents/AirSim/settings.json
  • 因此,我们可以通过修改 run_airsim_image_binary.sh 中的以下代码片段来加载任何设置文件,只需修改 PATH_TO_YOUR/settings.json
nvidia-docker run --runtime=nvidia -it \
      -v $PATH_TO_YOUR/settings.json:/home/airsim_user/Documents/AirSim/settings.json \
      -v $UNREAL_BINARY_PATH:$UNREAL_BINARY_PATH \
      -e SDL_VIDEODRIVER=$SDL_VIDEODRIVER_VALUE \
      -e SDL_HINT_CUDA_DEVICE='0' \
      --net=host \
      --env="DISPLAY=$DISPLAY" \
      --env="QT_X11_NO_MITSHM=1" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      -env="XAUTHORITY=$XAUTH" \
      --volume="$XAUTH:$XAUTH" \
      --rm \
      $DOCKER_IMAGE_NAME \
      /bin/bash -c "$UNREAL_BINARY_COMMAND"

注意: Docker 版本 >=19.03(使用 docker -v 检查)原生支持 Nvidia GPU,因此使用 --gpus all 标志运行,如下所示:

docker run --gpus all -it \
    ...

airsim_source Docker 镜像:#

  • 我们将主机上的 PATH/TO/Airsim/docker/settings.json 映射到 Docker 容器的 /home/airsim_user/Documents/AirSim/settings.json
  • 因此,我们可以通过修改 run_airsim_image_source.sh 中的以下代码片段来加载任何设置文件,只需修改 PATH_TO_YOUR/settings.json
   nvidia-docker run --runtime=nvidia -it \
      -v $(pwd)/settings.json:/home/airsim_user/Documents/AirSim/settings.json \
      -e SDL_VIDEODRIVER=$SDL_VIDEODRIVER_VALUE \
      -e SDL_HINT_CUDA_DEVICE='0' \
      --net=host \
      --env="DISPLAY=$DISPLAY" \
      --env="QT_X11_NO_MITSHM=1" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      -env="XAUTHORITY=$XAUTH" \
      --volume="$XAUTH:$XAUTH" \
      --rm \
   $DOCKER_IMAGE_NAME