☰
Autoware 与 AWSIM 端到端仿真:基于 Docker Compose 的 e2e_simulator 容器化桥接指南
2026/10/2 15:17:37 网站建设 项目流程
  • 自动驾驶

【免费下载链接】autoware

Autoware - the world's leading open-source software project for autonomous driving

项目地址:https://gitcode.com/GitHub_Trending/au/autoware
点击查看免费下载

导读

本文围绕 docker/examples/demos/awsim/README.md 展开,讲解如何在 Docker 容器中运行 Autoware 侧程序、通过 ROS 2 图与宿主机(或局域网内其他主机)上运行的 AWSIM Unity 仿真器建立端到端(End-to-End,E2E)仿真链路。读完本文,你将掌握 AWSIM 演示场景的完整前置条件、一键启动命令、docker-compose.yaml中每个关键配置项的作用,以及如何修改车辆模型、传感器套件和地图路径来自定义仿真。

AWSIM 演示场景是什么

AWSIM 是 TIER IV 出品的 Unity 自动驾驶仿真器,负责渲染高保真场景并提供传感器仿真数据;本仓库的 awsim 演示则是"Autoware 一侧"的容器化桥接端。其核心职责是:

  • 以network_mode: host方式共享宿主机网络栈,使容器内 Autoware 的 DDS 流量能够直接与宿主机上的 AWSIM 通信;
  • 启动autoware_launch包中的e2e_simulator.launch.xml,装载车辆模型、传感器套件与地图数据,完成端到端仿真链路。

需要注意,AWSIM 本身并不运行在这个容器里——它运行在宿主机(或局域网内的其他机器)上,容器只是 Autoware 侧的桥接端。

前置条件(Prerequisites)

根据原文档,运行该演示需要满足以下条件:

  1. NVIDIA GPU 与 NVIDIA Container Toolkit:仿真涉及 GPU 渲染与 CUDA 推理,容器必须以 NVIDIA runtime 启动;
  2. Shinjuku 地图数据:解压到宿主机~/autoware_data/maps/Shinjuku-Map/map;
  3. 感知模型数据:存放在宿主机~/autoware_data/ml_models目录下;
  4. AWSIM 已在宿主机运行,并且已经接入 ROS 2 图(即能被 Autoware 节点发现);
  5. Docker Compose v2:用于按docker-compose.yaml编排容器。

其中第 2、3 项的数据目录正是后续volumes:挂载的宿主来源;第 4 项要求 AWSIM 端与容器端使用一致的 RMW 实现与 DDS 配置,否则即使网络互通也无法互相发现。

一键启动:Run 命令详解

xhost +local:docker cd docker/examples/demos/awsim HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose run --rm awsim
  • xhost +local:docker:允许容器访问宿主机的 X11 显示服务,供 RViz 等 GUI 界面使用;
  • HOST_UID=$(id -u) HOST_GID=$(id -g):将宿主当前用户的 UID/GID 注入容器,docker-entrypoint.sh 会据此用usermod -u/groupmod -g把容器内aw用户重新映射为宿主 UID/GID,避免挂载卷上的文件出现权限问题;
  • docker compose run --rm awsim:前台运行awsim服务,--rm保证容器退出即被删除,不会堆积残留容器。

几个实用细节:

  • 如果宿主机 UID/GID 恰好是1000,可以省略环境变量前缀,因为 docker-compose.yaml 中HOST_UID/HOST_GID默认值为1000(${HOST_UID:-1000});
  • 当启动的 launch 进程退出后,容器并不会立刻销毁——因为command末尾执行了exec bash,会先进入一个 bash shell,方便你检查现场状态(话题、日志、节点列表等);按Ctrl+D退出 bash 后容器才随之退出并被--rm清理。

docker-compose.yaml 逐项拆解

完整文件位于 docker/examples/demos/awsim/docker-compose.yaml,核心配置如下:

services: awsim: image: ghcr.io/autowarefoundation/autoware:universe-cuda-jazzy privileged: true runtime: nvidia network_mode: host stdin_open: true tty: true environment: - DISPLAY=${DISPLAY} - NVIDIA_DRIVER_CAPABILITIES=all - NVIDIA_VISIBLE_DEVICES=all - HOST_UID=${HOST_UID:-1000} - HOST_GID=${HOST_GID:-1000} - QT_X11_NO_MITSHM=1 volumes: - /tmp/.X11-unix:/tmp/.X11-unix:rw - type: bind source: ${HOME}/autoware_data/maps target: /home/aw/autoware_data/maps bind: create_host_path: false - type: bind source: ${HOME}/autoware_data/ml_models target: /home/aw/autoware_data/ml_models bind: create_host_path: false deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] command: - bash - -c - | ros2 launch autoware_launch e2e_simulator.launch.xml \ vehicle_model:=sample_vehicle \ sensor_model:=awsim_sensor_kit \ map_path:=/home/aw/autoware_data/maps/Shinjuku-Map/map exec bash

各配置项的作用如下表:

配置项作用与说明
image: ...universe-cuda-jazzy运行时镜像:包含预编译的 Autoware Universe 与 CUDA 运行时(构建链路见 docker-bake.hcl 的universe-cudatarget 与 universe-cuda.Dockerfile),适用于 Jazzy 发行版 + GPU 环境
privileged: true赋予容器宿主机级权限,让入口脚本可以执行 DDS 所需的系统级网络调优(见下文)
runtime: nvidia使用 NVIDIA Container Runtime,配合NVIDIA_DRIVER_CAPABILITIES=all使 CUDA/graphics/video 能力全部可用
network_mode: host必需的:共享宿主机网络栈,使 AWSIM 的 DDS 流量能到达容器。原文档明确指出,移除它会直接破坏连接
stdin_open/tty保持交互式终端,配合exec bash实现退出 launch 后进入 shell 检查状态
DISPLAY=${DISPLAY}透传宿主 DISPLAY,供 RViz 等 GUI 使用
HOST_UID/HOST_GID交给入口脚本做用户重映射,避免挂载卷权限问题
QT_X11_NO_MITSHM=1禁用 Qt 的 MIT-SHM 共享内存(跨容器边界不可用),防止 RViz 崩溃
volumes: /tmp/.X11-unix挂载 X11 socket,实现 GUI 转发
bind create_host_path: false关键细节:若挂载源目录不存在,Compose 默认会以 root 创建该目录,导致aw用户无权写入;置为false则改为直接报错,保护数据目录不被误创建
deploy.resources.reservations.devices声明 GPU 设备预留(driver: nvidia、count: all、capabilities: [gpu]),是 Compose 语法下请求 GPU 的推荐方式

入口脚本与运行时行为

容器镜像的 entrypoint 位于 docker/docker-entrypoint.sh,在用户命令之前执行了如下工作:

  1. 用户重映射:读取HOST_UID/HOST_GID并修改aw用户的 UID/GID;
  2. DDS 网络调优:开启 loopback 接口的 multicast(ip link set lo multicast on),并设置net.core.rmem_max、net.ipv4.ipfrag_time、net.ipv4.ipfrag_high_thresh等系统参数——这些操作需要--privileged(或NET_ADMIN能力),失败时仅打印警告而不会阻塞启动;
  3. 环境 sourcing:依次加载/opt/ros/${ROS_DISTRO}/setup.bash,且当AUTOWARE_RUNTIME=1时加载/opt/autoware/setup.bash(运行时镜像在 universe-cuda.Dockerfile 中通过ENV AUTOWARE_RUNTIME=1设置);
  4. 降权执行:最终通过gosu "${USERNAME}" "$@"以aw用户身份运行command中的 launch 命令。

Launch 命令参考与自定义

服务实际执行的启动命令为:

ros2 launch autoware_launch e2e_simulator.launch.xml \ vehicle_model:=sample_vehicle \ sensor_model:=awsim_sensor_kit \ map_path:=/home/aw/autoware_data/maps/Shinjuku-Map/map
  • vehicle_model:车辆模型,默认sample_vehicle,可按需替换为自己的车辆配置;
  • sensor_model:传感器套件,默认awsim_sensor_kit,这是为 AWSIM 输出的传感器数据定制的套件;
  • map_path:地图路径,注意这里是指容器内路径/home/aw/autoware_data/maps/Shinjuku-Map/map,它通过volumes:挂载映射到宿主机~/autoware_data/maps/Shinjuku-Map/map。

自定义方式:直接编辑 docker-compose.yaml 的command:块即可调整 launch 参数(车辆模型、传感器套件、地图路径)。若想更换 ROS 发行版,可把image:标签从universe-cuda-jazzy换成其他发行版(如universe-cuda-humble),或指向本地构建的镜像;docker run等效命令及完整参数对照表可参见 docker/README.md 的 Usage 一节。

常见问题排查

  • 容器内看不到 AWSIM 节点:优先检查network_mode: host是否被移除、双方 RMW 实现与 DDS 域是否一致,以及宿主机 AWSIM 是否已加入 ROS 2 图;
  • 挂载目录报错或无法写入:确认宿主~/autoware_data/maps、~/autoware_data/ml_models已存在,并保持create_host_path: false以阻止 root 误创建目录;
  • RViz 白屏或崩溃:确认已执行xhost +local:docker并设置QT_X11_NO_MITSHM=1;
  • CUDA 相关错误:确认宿主机安装了 NVIDIA Container Toolkit,且容器以runtime: nvidia启动。

小结

AWSIM 演示为 Autoware 提供了一个即插即用的端到端仿真入口:一条docker compose run命令即可把容器内的 Autoware 桥接到宿主机上的 AWSIM,通过e2e_simulator.launch.xml完成车辆、传感器与地图的装载。理解network_mode: host、用户重映射与create_host_path: false这三个"隐藏细节",是稳定跑通该演示的关键。

  • 自动驾驶

【免费下载链接】autoware

Autoware - the world's leading open-source software project for autonomous driving

项目地址:https://gitcode.com/GitHub_Trending/au/autoware
点击查看免费下载

相关推荐

上一篇:零基础快速上手RVC WebUI:十分钟训练专属AI歌手的完整实战指南
下一篇:在 Apple Silicon 上运行 Stable Diffusion:Core ML 模型转换、量化压缩与端侧推理实战指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询