空地一体协同智能载具虚拟仿真实验教程(Ubuntu / OpenHUTB)
本教程在 Ubuntu 上带你在 OpenHUTB/hutb 官方包 中跑通“地面车辆 + 无人机”的空地一体实验:先看到车机同框,再按六个模块完成场景构建、感知决策、无人机、空地协同、交通场景和 AI 辅助开发。
路径说明(务必先看):模拟器安装入口始终使用 OpenHUTB 主页的
https://openhutb.github.io/dl.sh,本文没有改成其他下载源。教程里有两套脚本根目录,不能混用: -hutb/PythonAPI/...:dl.sh下载的模拟器包,空地一体脚本和 8 个分步教程在PythonAPI/examples/air/。 -doc/src/...:OpenHUTB/doc文档仓库,感知、规划、交通类示例脚本在这里,不在hutb/PythonAPI/examples/。air_doc 上 Carla-Air 0.1.7 预编译包使用
CarlaAir.sh和examples/,目录布局与本教程的 hutb 包不同;本教程仍按 OpenHUTB 主页的 hutb 包编写。
实验基本信息
| 项目 | 内容 |
|---|---|
| 实验名称 | 空地一体协同智能载具虚拟仿真实验 |
| 操作系统 | Ubuntu 18.04 / 20.04 / 22.04(64 位) |
| 面向专业 | 人工智能、机器人工程、低空经济 |
| 实验课时 | 课程 32 学时,实验 16 学时 |
| 实验模块 | 6 个模块、29 个交互步骤 |
| 知识点 | 8 个 |
| 仿真底座 | OpenHUTB/hutb(已集成 Carla + AirSim 空地一体与无人机插件) |
| 开源许可 | MIT |
学习目标
完成本实验后,你将能够:
- 理解 OpenHUTB/hutb 中 Carla 与 AirSim 单进程空地一体仿真的基本架构,说清两者如何共享同一世界、同一套物理与传感器时间戳。
- 独立启动仿真环境,完成路网生成、场景保存、车辆与无人机连接。
- 配置相机、激光雷达、毫米波雷达等传感器,完成目标检测、点云可视化与多传感器数据采集。
- 编写 Python 脚本控制车辆与无人机,完成路径跟踪、航点飞行、多机编队与空地协同任务。
- 基于路口流量、车均延误、饱和度、排队长度、覆盖率、冲突次数等指标评价方案,并完成一次复测迭代。
- 按开源协作规范提交代码与文档,使用 GitHub Copilot 辅助读文档、改脚本、排查报错。
先修知识
- Python 基础:变量、循环、函数、常用库(numpy、matplotlib 均可)。
- Linux 基础:终端、路径、环境变量、
pip/venv。 - ROS2 基础:节点、话题、服务的基本概念;没学过可先看平台前置微课。
- 控制与机器学习基础:PID、状态估计、目标检测的基本概念。
你将完成
- 启动 OpenHUTB/hutb,看到车辆与无人机在同一个世界中运行。
- 跑通 4 分屏传感器画面:RGB、深度图、语义分割、LiDAR 鸟瞰。
- 观察无人机跟踪地面车辆、天气切换、车机时间戳对齐。
- 按六个模块完成 29 个交互步骤,并提交实验报告与指标表。
开始前
硬件
- Ubuntu 18.04 / 20.04 / 22.04,64 位。
- 推荐 NVIDIA RTX 2070 及以上、显存 8 GB 及以上。
- 内存 16 GB 及以上;磁盘至少预留 50 GB。
- 已安装 NVIDIA 驱动,终端执行
nvidia-smi能看到显卡信息。 - 只有核显或 8 GB 内存的机器可以看文档、写脚本,但跑模拟器会非常卡。
软件
- Git、Python 3.7+、pip、VS Code。
- 不需要单独下载额外发行包:下面的
dl.sh会下载 OpenHUTB/hutb 官方包,其中已集成空地一体与无人机插件。 - 浏览器(用于看文档和 GitHub)。
- 能访问 GitHub;如果无法访问,请使用可用的网络环境。
系统依赖
sudo apt update
sudo apt install -y git wget curl tar unzip build-essential python3-pip
Ubuntu 环境检查
在开始前,先确认以下命令都能正常输出:
nvidia-smi
python3 --version
python3 -m pip --version
git --version
nvidia-smi没有输出:先装 NVIDIA 驱动并重启。pip3找不到:先装python3-pip,或改用python3 -m pip。python3版本低于 3.7:先升级 Python。
第一次学习不要从数字孪生开始。 数字孪生需要编译 HUTB,最重、最容易卡;先跑模块二—五,最后再做模块一和数字孪生。
脚本目录约定
下面命令里的脚本分布在不同的目录,每条命令先 cd 到对应目录,不要假设当前目录:
| 脚本 | 正确位置 |
|---|---|
| 空地一体展示脚本(quick_start_showcase、air_ground_sync、drone_car_chase、demo_drive_and_fly) | hutb/PythonAPI/examples/air/ |
| 8 个分步教程(01_hello_world 等) | hutb/PythonAPI/examples/air/ |
| hutb 自带示例(generate_traffic、manual_control 等) | hutb/PythonAPI/examples/ |
| 相机、边界框、点云、路径点脚本(rgb_camera_example、sensor_bounding_box、3d_lidar、waypoint_follow) | doc/src/examples/(OpenHUTB/doc 仓库) |
| 检测、轨迹、选点、规划、导航、交通指标脚本(object_detection、Drive、locate_moving、main_v4_VO、automatic_control_revised、traffic_indicators、signal_control、auto_signal_control、spectator) | doc/src/course/...(OpenHUTB/doc 仓库) |
| AirSim 多机示例(multi_agent_drone、add_drone、hello_drone) | air 仓库的 PythonClient/multirotor/ |
hutb/PythonAPI/examples/ 里没有 rgb_camera_example.py、sensor_bounding_box.py、3d_lidar.py、waypoint_follow.py、traffic_indicators.py、spectator.py 这些文件,不要在这里找。以你本地发行包/仓库的实际路径为准;找不到时先 ls 看目录。
快速开始:30 分钟看到“车机同框”
下面以 Ubuntu 上的 OpenHUTB/hutb 官方包为例。所有命令都在终端里执行;首次运行需要联网下载依赖。
1. 下载 OpenHUTB/hutb 官方包
curl -fsSL -o dl.sh https://openhutb.github.io/dl.sh && chmod +x dl.sh && ./dl.sh
如果这一步报
BadZipFile,先不要反复重试;这是下载到的包不完整/服务器没有预编译包,排查方法见文末“常见问题”。
脚本会下载模拟器包;解压后进入生成的目录(通常叫 hutb,以实际解压结果为准):
cd hutb
2. 启动模拟器
chmod +x CarlaUE4.sh
./CarlaUE4.sh
第一次启动会加载地图,比较慢,属正常现象。
3. 安装 Python 接口
python3 -m pip install PythonAPI/carla/dist/hutb-*.whl
python3 -m pip install pygame numpy
如果提示找不到文件,先确认 PythonAPI/carla/dist/ 下确实有 hutb-*.whl。
4. 运行车机展示(另开一个终端)
cd <你的 hutb 目录>
python3 PythonAPI/examples/air/quick_start_showcase.py
你应该看到:一辆车在城市中自动巡航,无人机从空中追踪;4 分屏同时显示 RGB、深度图、语义分割、LiDAR 鸟瞰;天气自动轮换。按 N 手动切天气,按 Esc 退出。
这个脚本本身不支持 WASD 接管驾驶(源码里只注册了
N和ESC)。要键盘驾驶,另开终端运行python3 PythonAPI/examples/air/drive_vehicle.py,那个脚本才是WASD驾驶、Space手刹、R倒车。
5. 运行空地同步
python3 PythonAPI/examples/air/air_ground_sync.py
左右分屏中,地面车辆与空中无人机处于同一世界、同一场天气;按 N 切换天气,按 Esc 退出。
成功标志
- 车与无人机出现在同一画面。
- 4 路传感器画面同时刷新。
- 切换天气时,地面和空中同时变化。
- 没有端口占用、API 版本不匹配的报错。
六个实验模块
| 模块 | 内容 | 关键脚本 / 操作 | 对应步骤 |
|---|---|---|---|
| 模块一 | 环境与数字孪生底座 | 启动模拟器、OSM 生成路网、保存地图 | 1—3 |
| 模块二 | 自动驾驶感知—决策—控制 | 相机、边界框、点云、目标检测、路径跟踪 | 4—12 |
| 模块三 | 无人机与低空资产 | 双客户端连接、起飞、多机、倾斜摄影 | 13—17 |
| 模块四 | 空地协同 | 车机分屏、联合展示、无人机跟踪车 | 18—19 |
| 模块五 | 交通场景与多载具协同 | 交通流、路口指标、信号控制、多机巡检 | 20—25 |
| 模块六 | 协作与 AI 辅助开发 | Fork、分支、Copilot、Pull Request | 26—29 |
模块一:环境与数字孪生底座(建议最后做)
目标:把真实路网变成仿真场景,并保存为可重复载入的地图。
- 启动模拟器服务端并连接客户端:
cd <你的 hutb 目录>
./CarlaUE4.sh
再用 config.py 加载地图(在 hutb 包根目录执行):
python3 PythonAPI/util/config.py -m Town01
-
由 OpenStreetMap 生成路网:打开数字孪生工具(CarlaTools 内容中的
UW_OnRoadMainWidget),填入 OSM 网址或导入本地.osm,框选区域后点击生成。2×2 km² 约需 10 分钟。 -
加载生成场景并保存:
# 在 hutb 包根目录
python3 PythonAPI/util/config.py -x *.xodr
如果按文档仓库的写法运行,则要先进入 OpenHUTB/doc 仓库根目录,再执行 python3 src/util/config.py -x *.xodr;src/ 是 doc 仓库的目录,不在 hutb 包里。
保存地图可能耗时 1 小时以上;保存后在编辑器中检查车道与路口。
这一步依赖 HUTB 编译。第一次做建议在教师演示后完成,不要自行硬编。
模块二:自动驾驶感知—决策—控制
目标:让车辆“看得见、判得准、走得稳”。
# 以下脚本在 OpenHUTB/doc 仓库的 src/ 下运行;不是 hutb/PythonAPI/examples/
cd <你的 doc 仓库>/src
# 4. 多路相机(先另开终端运行 examples/manual_control.py 生成 hero)
python3 examples/rgb_camera_example.py --host localhost --port 2000 --rolename hero
# 5. 三维边界框(同样需要 hero)
python3 examples/sensor_bounding_box.py --host localhost --port 2000 --rolename hero --view above --distance 100 --res 800x600 --fov 90
# 6. 激光雷达点云(需要 hero 与 Open3D)
python3 examples/3d_lidar.py --host localhost --port 2000 --rolename hero --keep_ego_vehicle
# 7. YOLOv3 目标检测(在脚本目录运行,weights/ 与 cfg/ 是相对路径)
cd course/object_detection
python3 object_detection.py
cd ../..
# 8. 路径点跟踪(先在 hutb 终端运行 python3 PythonAPI/util/config.py -m Town01;json 路径相对 doc/src)
python3 examples/waypoint_follow.py --host localhost --port 2000 --rolename hero --map Town01 --json_file examples/data/town01_waypoints.json --sync --fixed_delta_seconds=0.05 --spawn --visualize --camera_follow
# 9. 轨迹跟踪(湖工商场景;先运行 examples/generate_traffic.py)
python3 course/trajectory_tracking/Drive.py
# 10. 地图选点移动
python3 course/locate_moving.py
# 11. 路线规划(同级有 motion_primitve.py / basic_PID.py,必须在本目录运行)
cd course/Motion_Planning
python3 main_v4_VO.py
cd ../..
# 12. 校园轨迹(--s/--e 可取 北门、西门、楚枫桥、楚枫轩、日新楼、体育馆、湘江楼、科技楼)
python3 course/navigation/automatic_control_revised.py --s 北门 --e 西门 --speed 5
这些脚本依赖
OpenHUTB/doc仓库的src/,hutb 包里没有course/。rgb_camera_example.py、sensor_bounding_box.py、3d_lidar.py需要先在另一个终端运行manual_control.py生成hero车辆,否则会报Actor hero not found。object_detection.py还需要自行准备weights/yolov3.weights(仓库只带cfg/)。Drive.py、automatic_control_revised.py、traffic_indicators.py、spectator.py依赖湖工商场景。
成功标志:相机画面同步、边界框与车辆对齐、点云能看出道路与车辆轮廓、检测框随视角变化、车辆能沿路点或规划路径行驶。
模块三:无人机与低空资产
目标:连接 Carla 与 AirSim 双客户端,完成起飞、多机添加和航拍建模。
-
启动 OpenHUTB/hutb 模拟器,加载校园地图(如
Town10HD),分别连接 Carla 客户端(端口2000)和 AirSim 多旋翼客户端(端口41451)。 -
基础飞行与分步教程:
cd <你的 hutb 目录>
python3 PythonAPI/examples/air/01_hello_world.py
python3 PythonAPI/examples/air/05_drone_takeoff.py
- 继续完成天气、交通流、无人机起飞等示例:
python3 PythonAPI/examples/air/02_weather_control.py
python3 PythonAPI/examples/air/03_spawn_traffic.py
多机示例见 air 仓库的 PythonClient/multirotor/:multi_agent_drone.py、add_drone.py、hello_drone.py 都在这里,不在 hutb 包的 PythonAPI/examples/air/ 里。如果还没克隆 air 仓库,或当前包内没有这些脚本,先完成单车/单机示例。
- 倾斜摄影与三维重建:用手机或相机固定焦距绕建筑拍摄约 60 张、相邻重叠度不低于 70% 的照片,按 Meshroom 教程完成 SfM、深度图、网格与纹理,导出
.obj;也可按air_3d文档用 ContextCapture 重建校园建筑。
成功标志:无人机能起飞/悬停/降落;多机能独立控制;重建模型能导入虚幻引擎。
模块四:空地协同
目标:让无人机和地面车辆在同一世界协同。
# 左右分屏:同一场雨、同一个世界
python3 PythonAPI/examples/air/air_ground_sync.py
# 四路传感器 + 无人机追踪车辆
python3 PythonAPI/examples/air/quick_start_showcase.py
# 无人机跟踪地面车辆
python3 PythonAPI/examples/air/drone_car_chase.py
# 一个脚本同时驱动车辆与无人机
python3 PythonAPI/examples/air/demo_drive_and_fly.py
成功标志:两侧位姿与传感器时间戳逐帧对齐(坐标对齐误差 0.0000 m);无人机能稳定跟踪车辆并回传机载画面;切换天气两侧同步。
模块五:交通场景与多载具协同
目标:在交通场景中加入多架无人机,评价车—机耦合效果。
实验按 20 项算法测试矩阵组织:感知 5、定位与地图 3、规划与决策 3、控制 1、交通 3、无人机与协同 3、学习 2。下面的交通脚本同样在 OpenHUTB/doc 仓库的 src/ 下执行,不在 hutb/PythonAPI/examples/。
cd <你的 doc 仓库>/src
# 生成车流与行人(hutb 包里也有同名脚本,但这里用 doc 仓库的版本)
python3 examples/generate_traffic.py -n 50 -w 20 --safe
# 统计路口指标(依赖湖工商场景;脚本内固化了两个路口坐标)
python3 course/traffic_indicators.py
# 手动信号控制:先启动 Flask 服务,再发请求
python3 course/signal_control.py
# 浏览器或 curl 请求:
# http://127.0.0.1:5000/set_traffic_light?traffic_id=-5&color_id=3&color_time=30
# 自动感应控制(做对比实验时用)
python3 course/auto_signal_control.py
# http://127.0.0.1:5000/set_traffic_light
# 四个预设路口视角轮换(不是多机分区巡检)
python3 course/spectator/spectator.py
traffic_indicators.py 和 spectator.py 都需要湖工商场景,且 traffic_indicators.py 的路口范围写死在脚本里(桐梓坡路—西二环、桐梓坡路—望岳);没有该场景时,脚本可能能连上模拟器但指标没有意义。
再做两组对比:
- 改变车辆数(20、50、100 辆),记录排队长度、车均延误、饱和度。
- 改变无人机数量(1、2、3 架),记录覆盖率、任务完成时间、空地冲突次数。
成功标志:改配时后指标实时变化;多机增加时覆盖率上升,冲突次数随分配规则变化,能找到饱和度/协同负载的拐点。
模块六:协作与 AI 辅助开发
目标:按开源协作流程提交成果,并用大模型辅助开发。
- Fork 并克隆仓库,新建分支(把
你的用户名、仓库名换成实际值,例如hutb或doc):
git clone https://github.com/你的用户名/仓库名.git
cd 仓库名
git switch -c docs-fix-contribution-steps
git status
git diff
-
按 GitHub Copilot 文档启用 Copilot,在 VS Code 中登录,让它解释一段 OpenHUTB 文档中的调用链。
-
让模型补全或改写
examples中的示例脚本(如增加传感器、改变车速),在模拟器中运行验证,逐行核对改动。 -
提交:
git add 你实际修改的文件
git diff --cached
git commit -m "docs: 说明本次修改"
git push -u origin docs-fix-contribution-steps
把 你实际修改的文件 换成实际文件名(如 CONTRIBUTING.md),不要照抄占位符。贡献指南要求 git add 具体文件,而不是 git add .;提交前用 git diff --cached 再核对一次。创建目标为 OpenHUTB 的 Pull Request,按评审意见修改后合并,并提交实验报告与指标对比表。
实验报告要求
实验报告建议包含以下内容:
- 实验环境:操作系统、显卡、Python 版本、OpenHUTB/hutb 版本。
- 过程记录:每个模块的关键命令、运行截图、遇到的问题与解决办法。
- 指标表:路口流量、车均延误、饱和度、排队长度;多机实验的覆盖率、任务完成时间、冲突次数。
- 结果分析:不同参数下指标如何变化,是否与预期一致;失败情形的原因与改进。
- 成果链接:代码分支、Pull Request、实验数据或录屏(如有)。
报告以“能复现、能解释、有证据”为标准,不接受只有截图、没有指标与分析的报告。
结果与评价
完成实验后,你应该能复现以下结果:
- 数字孪生:路网可保存、可重复载入;2×2 km² 生成约 10 分钟,保存约 1 小时。
- 感知:雨雾/夜间下检测框数量和置信度下降;点云远处变稀疏。
- 控制:步长越小、采样越密,轨迹误差越小。
- 无人机:多机分层飞行时,覆盖率、冲突次数可比较;中等联合配置约
19.8±1.1 FPS。 - 空地协同:车机时间戳逐帧对齐,坐标误差
0.0000 m。 - 交通场景:流量上升时排队、延误、饱和度上升,可找临界流量。
成绩构成:
| 维度 | 权重 | 看什么 |
|---|---|---|
| 参与度 | 40% | 前测/出勤、角色承担、Commits、Issues 讨论、PR 数量与审核评论 |
| 提交规范性 | 20% | 分支命名、提交信息、PR 描述、代码风格、文档格式 |
| 作业质量 | 40% | 步骤完成度、指标表与复算、实验报告、创新与复测 |
等级:不及格、及格、中、良、优。
常见问题
Q:只有核显/8 GB 内存能跑吗? 可以看文档、写脚本,跑模拟器会非常卡。建议用带 NVIDIA 独显、16 GB 内存以上的机器做模块三—五。
Q:运行 ./dl.sh 报 BadZipFile?
dl.sh 只是下载器,真正的模拟器包由它从服务器拉取。报 BadZipFile 通常不是 Ubuntu 的问题,而是下载到的文件不是完整 zip:服务器返回了 404/HTML 页面、下载中断,或网络加速器改写了内容。
按下面顺序排查:
- 重新执行一次
./dl.sh,不要连续重试十几次。 - 找到刚下载的 zip,检查它是不是真的 zip:
find ~ -name '*.zip' -mmin -30 -ls
file 下载到的.zip
unzip -t 下载到的.zip
file显示 HTML/ASCII:下载到的是网页,不是包。-
unzip -t报错:包不完整,重新下载或换网络。 -
如果服务器上只有源码、没有预编译包,
dl.sh解决不了:向老师/学长要 Ubuntu 预编译包(整个hutb目录),或申请实验室机器;不要在 8 GB 核显笔记本上从源码编译 UE4.26。 - 如果老师给了压缩包,解压后直接运行
CarlaUE4.sh,不需要再跑dl.sh。
Q:运行 ./CarlaUE4.sh 提示 Permission denied?
先赋予执行权限:chmod +x CarlaUE4.sh,再运行。
Q:nvidia-smi 找不到命令?
说明 NVIDIA 驱动没装好;先装驱动、重启,再确认 nvidia-smi 能输出显卡信息。
Q:pip install hutb-*.whl 找不到文件?
先确认你在 hutb/PythonAPI/carla/dist/ 下能看到 hutb-*.whl;没有就重新运行 ./dl.sh 或检查下载是否完整。
Q:端口被占用?
Carla 用 2000,AirSim 用 41451;先关掉旧进程,再重启。
Q:数字孪生为什么最后做? 它需要编译 HUTB,依赖 UE4.26、Ubuntu 编译工具链和较大的磁盘/内存;先把轻量模块跑通,再碰它。
Q:GitHub 打不开? 先检查网络与代理设置;如果仍然失败,换一个网络环境再试,并把完整报错记录下来。
参考
- 模拟器下载入口(保持不变):https://openhutb.github.io/dl.sh
- OpenHUTB/hutb:https://github.com/OpenHUTB/hutb
- OpenHUTB/doc 文档仓库:https://github.com/OpenHUTB/doc
- 文档站:https://openhutb.github.io/doc/
- 空域文档:https://openhutb.github.io/air_doc/
- 交通教程参考:https://openhutb.github.io/doc/tutorials/
- 空地一体(Carla-Air 0.1.7):https://openhutb.github.io/air_doc/dev/Carla_Air/
- AirSim Ubuntu 构建(air_doc):https://openhutb.github.io/air_doc/build_linux/
- HUTB/Carla Ubuntu 构建(doc):https://openhutb.github.io/doc/build_linux/
- 多车辆:https://openhutb.github.io/air_doc/multi_vehicle/
- 图像 API:https://openhutb.github.io/air_doc/image_apis/
- 贡献指南(渲染页):https://openhutb.github.io/.github/CONTRIBUTING/
- 贡献指南(源文件):https://github.com/OpenHUTB/.github/blob/master/CONTRIBUTING.md