- 自动驾驶
【免费下载链接】autoware
Autoware - the world's leading open-source software project for autonomous driving
导读
本文围绕 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)
根据原文档,运行该演示需要满足以下条件:
- NVIDIA GPU 与 NVIDIA Container Toolkit:仿真涉及 GPU 渲染与 CUDA 推理,容器必须以 NVIDIA runtime 启动;
- Shinjuku 地图数据:解压到宿主机
~/autoware_data/maps/Shinjuku-Map/map; - 感知模型数据:存放在宿主机
~/autoware_data/ml_models目录下; - AWSIM 已在宿主机运行,并且已经接入 ROS 2 图(即能被 Autoware 节点发现);
- 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 awsimxhost +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,在用户命令之前执行了如下工作:
- 用户重映射:读取
HOST_UID/HOST_GID并修改aw用户的 UID/GID; - 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能力),失败时仅打印警告而不会阻塞启动; - 环境 sourcing:依次加载
/opt/ros/${ROS_DISTRO}/setup.bash,且当AUTOWARE_RUNTIME=1时加载/opt/autoware/setup.bash(运行时镜像在 universe-cuda.Dockerfile 中通过ENV AUTOWARE_RUNTIME=1设置); - 降权执行:最终通过
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/mapvehicle_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
相关推荐
SQLFluff 自定义规则插件开发实战:基于 sqlfluff-plugin-example 的完整指南
SQLFluff 自定义规则插件开发实战:基于 sqlfluff plugin example 的完整指南 SQLFluff 作为模块化的 SQL 解析、Lin
自动驾驶Flower 容器化联邦学习端到端测试:基于 Docker Compose 部署 SuperLink 与 SuperNode 的最小实践指南
Flower 容器化联邦学习端到端测试:基于 Docker Compose 部署 SuperLink 与 SuperNode 的最小实践指南 本篇技术指南以 F
人工智能联邦学习机器学习深度学习Motrix 桥接端到端测试实战:基于真实 `motrix-cli` 的 MDXP 配对与下载验收指南
Motrix 桥接端到端测试实战:基于真实 motrix cli 的 MDXP 配对与下载验收指南 e2e/bridge/ 是 Motrix 项目中针对 MDX
桌面应用网络后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考