第一次跑 Habitat 的时候,我差点在安装阶段就放弃了——不是报错,是报错报得太抽象。一堆编译日志刷过去,最后抛一个找不到某个库的红色信息,搜索引擎上也翻不到同款问题。后来换了思路,一步步拆开装、分步验证,才发现整条链路其实就那么几件事:装好系统依赖、把 habitat-sim 本体搞进去、把数据集放到它认识的位置、最后跑通 example.py。这篇就把每一步拆开讲,把网上那些语焉不详的坑全填上,目标是让你跟着操作就能看到渲染窗口弹出来。
这篇内容不是跑通一个官方示例就结束了。我会把安装方式分成“快速验证”和“源码编译”两条路线,分别说清楚适合什么人;数据集的下载地址、目录结构、坑点也全部亮出来;最后把 example.py 里每一段关键逻辑拆开,告诉你哪里能改、改成什么效果、出了问题从哪里排查。适合第一次接触具身智能仿真、想在本地把 Habitat 环境跑起来的同学,也适合已经被安装流程折磨到怀疑人生的朋友——你只需要照着做。
1. 先把话说清楚:Habitat 和 example.py 到底是个啥
1.1 这个 example.py 到底做了什么
Habitat 是 Meta 开源的一个 3D 仿真平台,全称叫 Habitat Sim,核心作用是给具身智能研究提供一个可以反复试错的虚拟环境。你在里面放一个机器人 agent,给它配摄像头、深度传感器、碰撞检测,然后让它在房间里走来走去,采集画面和空间数据。
example.py 是 habitat-sim 仓库里自带的最简可运行示例。它做的事情非常朴素:加载一个 3D 场景文件,创建一个机器人体(Habitat 里叫 agent),让这个 agent 在场景里走几步,每一步都通过传感器把“眼睛看到的东西”以数组形式返回。如果一切正常,你会在屏幕上看到一个实时渲染的画面,按键盘方向键或 WASD 可以控制视角移动。
也就是说,它就是一个“最小闭环”:场景加载 -> 传感器初始化 -> 仿真循环 -> 观察输出。虽然代码量不大,但这套流程是 Habitat 所有上层应用的基石。无论是做导航、抓取、语义理解,还是跑强化学习训练,底层都是这套东西在转。所以跑通 example.py 的意义不只是“安装成功”,而是你理解了 Habitat 的数据流转方式,后面写自己的脚本就有底了。
1.2 什么环境最适合跑通它
我在三种环境下试过 Habitat:Ubuntu 20.04、Ubuntu 22.04、Windows 11 的 WSL2。说实话,WSL2 能跑,但你要先搞定图形显示转发,而且性能损耗明显,中间还容易出现奇怪的渲染问题。所以我直接劝你:如果条件允许,准备一台装 Ubuntu 的机器,哪怕是虚拟机都行,体验会顺很多。
硬件方面,example.py 本身对显卡要求不高,一块入门级 NVIDIA 显卡就能流畅渲染。如果你机器上没有 NVIDIA GPU,纯 CPU 也能跑通,就是渲染速度会慢一些,后面我会详细说怎么配置 CPU 模式。
内存建议 16GB 起步,因为场景文件加载和纹理贴图都会吃内存,8GB 也不是不能跑,就是加载大场景时容易卡顿甚至被系统杀掉。硬盘留出至少 20GB 空间,别小看这件事——编译安装时的中间文件、Python 依赖、场景数据文件加起来,空间消耗比你想象中快。
网络方面,你需要能正常访问 GitHub 和官方数据下载地址。整个过程要下载的有源码包、依赖库、场景文件,加起来大概几个 GB。如果你所在网络环境访问国外资源不稳定,建议提前想办法解决。
2. 动手前的环境准备:这一步能省你半天时间
2.1 显卡驱动与 CUDA 版本怎么定
很多人一上来就装 CUDA,其实这是个误区。Habitat 安装时真正需要的是:NVIDIA 显卡驱动已经装好,并且驱动版本支持你打算用的 CUDA 版本。
先跑一条命令看看当前状态:
nvidia-smi输出里右上角会显示 Driver Version 和 CUDA Version。这里要注意,nvidia-smi 显示的 CUDA Version 是驱动支持的最高版本,不代表你系统里装了对应版本的 CUDA 工具包。
实际上,如果你打算用 conda 装 habitat-sim,大部分时候不需要在系统层面单独装 CUDA Toolkit。因为 conda 安装的时候会自动帮你拉一个合适的 CUDA 运行时库进去。真正需要系统 CUDA 的场景是源码编译且要用 GPU 加速,那时候才需要保证编译器能找到 nvcc。
我的建议是:先确认驱动版本在 470 以上,其他先别管,直接往下走。等真遇到编译报错说找不到 CUDA 了,再回头补装。这样能避免装了一大堆用不上的东西,反而把环境搞乱。
2.2 conda 环境与 Python 版本
Habitat 官方对 Python 版本的兼容范围比较宽,但我实测下来 3.8 和 3.9 是最稳的。python 3.10 以上偶尔会遇到某些依赖包还没有预编译 wheel 的情况,得现场编译,平白多等半天。
建议用 conda 新建一个独立环境,避免和系统 Python 或其它项目打架:
conda create -n habitat python=3.9 conda activate habitat这一步是纯防御性操作,但它能救你很多次。Habitat 的依赖相当多,magnum、assimp、numpy、opencv 这些库互相之间有版本要求,如果和别的项目混在一起,往往会出现“我之前还好好的,装完 Habitat 就全坏了”的情况。独立环境隔离了这种风险,即使后面把环境搞废了,conda remove -n habitat --all一下,再来一遍就是。
2.3 系统依赖库安装
这一步是网上教程最容易跳过的部分。很多人直接从“安装 Habitat”开始,结果第一步编译就挂在找不到各种系统库上。你得先把这几个库装好:
sudo apt update sudo apt install -y --no-install-recommends \ libjpeg-dev \ libglm-dev \ libgl1-mesa-dev \ libegl1-mesa-dev \ mesa-utils \ xorg-dev \ freeglut3-dev \ libxrandr-dev \ libxinerama-dev \ libxcursor-dev \ libxi-dev \ libxext-dev逐个说这些是干什么的:libjpeg-dev是处理图像压缩解码的,渲染出的图片要转成图像格式全靠它;libglm-dev是 OpenGL 的数学库,Habitat 的底层渲染引擎 Magnum 依赖它;mesa-utils提供了一些 OpenGL 调试工具;xorg-dev和那几个libx*-dev是 X11 图形界面的开发库,窗口显示、键盘鼠标事件处理都要用它们。
如果你确定自己只需要跑无头模式(比如在服务器上只做数据采集,根本不开窗口),xorg-dev和 freeglut 可以跳过,但我不建议新手这么做——因为你很难保证 example.py 跑起来之后一定不碰图形上下文。全装上也就几十 MB,没必要省这个空间。
2.4 常见环境坑:libGL、numpy、gcc
这三个坑我依次说,都是真实会踩的。
第一个,libGL.so.1 找不到。这个报错一般在 import habitat_sim 时出现,长这样:
ImportError: libGL.so.1: cannot open shared object file: No such file or directory原因很简单:系统里缺少 OpenGL 的运行时库。Ubuntu 22.04 上尤其容易出现,因为系统默认不带 libgl1。解决办法:
sudo apt install libgl1装上之后再 import 就正常了。如果是 WSL 环境,可能还需要补一个libegl1。
第二个,numpy 版本冲突。Habitat 对 numpy 的版本范围很敏感,装完 habitat-sim 之后如果你手动pip install numpy装了个最新版,经常会出现:
ValueError: numpy.dtype size changed, may indicate binary incompatibility我的建议是:不要在安装 Habitat 之后手动升级 numpy。如果其他项目需要新版 numpy,用另一个环境共存。如果这个环境已经手动升级坏了,就pip install "numpy<1.24"回退试试,或者直接删掉环境重建。
第三个,gcc 版本太老。源码编译 Habitat 时编译器版本不够会导致各种莫名其妙的模板报错。Ubuntu 20.04 自带的 gcc 9 基本够用,Ubuntu 22.04 的 gcc 11 也没问题。如果你用的老系统,先升一下:
sudo apt install build-essential装完后确认一下版本:gcc --version,能正常输出版本号就行。
3. 安装 Habitat Sim:两种方式我都替你踩过坑
3.1 方案A:conda 一键安装(适合快速验证)
如果你想快速看到效果,不想折腾编译过程,就用 conda 安装。这条路线我实测最省心,适合第一遍跑通、验证环境、快速上手。
conda install -c conda-forge habitat-sim这一个命令会自动处理大部分依赖。装完后验证一下:
python -c "import habitat_sim; print(habitat_sim.__version__)"能输出版本号(比如 0.2.5 之类的)就说明核心库装好了。
需要注意,conda 默认安装的是 CPU 版本还是 GPU 版本,主要看你的 conda 环境和频道里的构建版本。装完之后你跑 example.py 如果发现只有 CPU 在跑、GPU 占用率为 0,也不用太在意——example.py 这种规模的仿真,CPU 和 GPU 的差距体感没那么明显。真正训练大场景任务时再去翻官方文档,用带 CUDA 后缀的包重装即可。
3.2 方案B:源码编译安装(适合二次开发)
如果你后面打算改 Habitat 源码、调试底层渲染、或者基于它做深度二次开发,就必须走源码编译这条路。源码编译的好处是自己能控制所有编译选项,坏处是一旦翻车,排查时间长。
我的建议是第一遍不要编译,先配好环境,后面真有需求再来。但为了这篇教程的完整,我把我验证过的编译流程写出来。
第一步,拉源码:
git clone https://github.com/facebookresearch/habitat-sim.git cd habitat-sim如果你网络访问 GitHub 比较慢,可以考虑换国内镜像,或者用一些代理加速工具,核心是让git clone能完整拉下来。源码包很大,包含了很多子模块。
第二步,切换到稳定分支。默认分支是主分支,可能处于开发状态,不是最新的稳定版。建议先看下已有标签:
git tag git checkout v0.2.5选一个你看到的稳定版本即可,v0.2.5 是官方文档里写明的推荐版本。
第三步,安装 Python 依赖并编译:
pip install -r requirements.txt python setup.py build_ext --parallel 8 pip install -e .--parallel 8表示用 8 个线程并行编译,如果你的 CPU 核心多,可以调大数字,编译会快不少。整个编译过程大概要 10-20 分钟,期间会下载一些第三方依赖源码(Magnum、Assimp 等),耐心等就行。
源码编译最常见的失败点在两个地方:一是下载第三方依赖时网络中断,二是 GCC 版本太老导致 C++ 模板编译报错。前者多试几次,后者就去升级 build-essential。
3.3 验证安装是否成功
不管你用哪种方式装的,装完都做一遍这个验证:
conda activate habitat python -c "import habitat_sim; print(habitat_sim.__version__); print(habitat_sim.__file__)"如果顺利打印出版本号和库文件路径,恭喜,核心安装这一步完成了。如果报错,对照 2.4 节说的几个坑检查。
另外建议顺手装一个 jupyter 和 matplotlib,后面调试、看图片数据会用到:
pip install jupyter matplotlib4. 数据集下载与目录结构:很多人卡在这一步
4.1 测试场景数据集去哪下
Habitat 本身没有自带场景文件。example.py 运行时需要加载一个 3D 场景,比如一个房间的模型。官方提供了一个轻量级测试场景包,专门给新手跑通流程用,下载地址是官方 CDN。
mkdir -p data wget https://dl.fbaipublicfiles.com/habitat/TestScenes.tar.gz tar -xzf TestScenes.tar.gz这个压缩包大概几百 MB,解压后得到habitat-test-scenes目录。里面包含几个 .glb 格式的 3D 模型文件,比如apartment_1.glb、skokloster-castle.glb,这些就是 example.py 要加载的场景。
下载时注意,这个 CDN 在国外,国内网络可能很慢。如果卡住,就用一些支持断点续传的下载工具,比如wget -c继续下载,或者用别的下载方式先拉到本地再解压。
4.2 目录结构怎么摆
Habitat 对数据目录有约定,不是随便放就行。最稳的方案是在你执行 example.py 的目录下建立标准结构:
你的工作目录/ ├── data/ │ └── scene_datasets/ │ └── habitat-test-scenes/ │ ├── apartment_1.glb │ ├── skokloster-castle.glb │ └── ... ├── example.py └── ...其他文件注意中间那层scene_datasets不能省。Habitat 在定位场景数据集时,会按照 scene_datasets 这个路径约定去找。你如果直接把 glb 文件放在data/下,它大概率会找不到。
这个目录结构不是随便定的,设计目的是为了兼容未来更复杂的数据集引用方式。比如你后面用到 Matterport3D、Gibson、Replica 这些数据集时,也是按它们各自的目录名往下接。现在养成好习惯,后面省事。
4.3 路径配置容易踩的坑
最大的坑是:example.py 使用的场景路径可能是相对路径,也可能内部硬编码了默认路径。你从仓库克隆下来的 example.py,脚本启动时的工作目录决定了相对路径的起点。所以运行 example.py 时,最好始终在仓库根目录下执行,确保 data 目录就在当前目录下。
如果你下载的场景文件放错位置,运行时会报类似:
Failed to load scene file: /your/path/data/scene_datasets/habitat-test-scenes/apartment_1.glb这种报错已经很明确了,就是在告诉你它没找到这个文件。处理方法不是去翻代码,而是直接把报错信息里的路径和你的实际文件路径对照,把文件放到它期望的位置,或者修改脚本里的 scene 路径。
另外一个坑是别用中文目录或带空格的目录。Magnum 底层加载文件路径时有时对特殊字符处理不好,会遇到莫名其妙加载失败。老老实实用英文小写路径,省心。
5. 手把手跑通 example.py
5.1 找到 example.py 并看懂关键参数
先找到 example.py 文件。如果你是从源码克隆的 habitat-sim 仓库,它通常在:
examples/tutorials/example.py(部分旧版本放在examples/example.py,位置不影响核心逻辑。)
用编辑器打开它,核心的配置都在一个settings字典里。这个字典很长,但新手重点关注这几个字段:
scene:场景文件路径。把它指向你下载的 .glb 文件位置。width和height:传感器图像的宽高,默认一般是 640x480。sensor_specifications:传感器配置列表,决定你要用哪些传感器,比如 RGB 相机、深度相机、语义分割相机。
你不需要完全读懂这个脚本,但至少要知道 scene 字段在哪里改——因为不同版本的 example.py 默认场景文件不同,如果你的场景文件名对不上,第一步就会加载失败。
5.2 正式运行:命令行参数逐个说
确认场景路径没问题后,回到仓库根目录,确保 conda 环境是激活的,然后运行:
python examples/tutorials/example.py如果一切正常,你会看到日志开始输出一些加载信息,然后弹出一个窗口,里面是渲染出来的房间画面。这一步通常需要几秒到十几秒,取决于你的硬件性能。
这个脚本会加载场景、创建 agent、然后循环执行仿真步进。每一步都会生成传感器观察数据,脚本会把这些数据实时显示在窗口里。你可以用鼠标拖拽视角,或者按键盘上的方向键控制 agent 在房间里移动。
如果你只需要调试,不想每次都被弹窗打断,可以设置日志级别:
export HABITAT_SIM_LOG=error python examples/tutorials/example.py这会关掉大部分冗余日志,只在出错时输出信息,看起来清爽很多。如果连错误日志都想输出到文件,就加一句2>&1 | tee run.log,不过 eb 一般不用。
5.3 无显卡环境怎么跑
没有 NVIDIA GPU,或者你用的是虚拟机,也不用慌。Habitat 可以用 CPU 渲染模式跑通 example.py,虽然慢一些,但验证流程完全够用。
纯 CPU 环境的关键在于:Magnum 渲染引擎需要一个图形上下文。如果你有显示器、用的是桌面 Linux 系统,那直接跑就行,系统会自动用 Mesa 软件渲染。如果你是在服务器上、通过 SSH 连接、没有显示器,就需要用 xvfb 这类虚拟显示工具来模拟一个显示器:
sudo apt install xvfb xvfb-run -a python examples/tutorials/example.pyxvfb-run会创建一个虚拟的 X 服务器,让 Habitat 以为有显示器可以用,从而正常创建渲染上下文。这样即使没有显卡、没有物理显示器,example.py 也能跑通,只是画面你没有直接看到。想验证图像数据是否正常,可以稍微改一下脚本,把生成的观察图像用 cv2.imwrite 存成 PNG 文件,跑完去查看。
5.4 跑通之后该看什么、能改什么
第一次跑通就只是窗口弹出来、画面能动,其实你还没真正理解这套系统。我建议你做几个小实验,把数据流摸清楚:
- 花几分钟读一下 example.py 中观察数据的生成逻辑。在循环里,
observations是一个字典,包含各个传感器的输出。打印一下observations["rgb"].shape,你会看到类似(480, 640, 3)的输出,这是 RGB 图像的 numpy 数组表示。 - 把
settings里 width 改成 1280、height 改成 720,重新跑,观察画面清晰度变化和帧率变化。你会直观理解分辨率对仿真性能的影响。 - 打开
examples/tutorials目录下的 Jupyter Notebook 文件(如果有),官方有很多教学 Notebook,跟着走一遍,比只看 example.py 学到的多得多。
experiment 完之后,你会发现,example.py 本质上就是一个“套壳”示例。真正有价值的是它调用 habitat_sim.Simulator、创建 Agent、获取 observations 的那套 API。掌握了这套 API,你就可以自己写一个脚本,加载任意场景、给 agent 配任意传感器组合、控制它做任意动作。
6. 常见问题与排查技巧实录
6.1 安装阶段报错对照表
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
libGL.so.1: cannot open shared object file | 缺 OpenGL 运行时 | sudo apt install libgl1 |
No module named 'habitat_sim' | conda 环境没激活,或安装失败 | 检查conda activate habitat,重新安装 |
CMake Error: could not find any instance of ... | 系统库缺失 | 回到第 2.3 节,把所有 apt 包装齐再试 |
error: command 'gcc' failed with exit status 1 | 缺编译工具链 | sudo apt install build-essential |
ValueError: numpy.dtype size changed | numpy 版本冲突 | pip install "numpy<1.24"或重建环境 |
安装阶段大部分问题都是缺库。遇到 CMake 报错不要急着搜代码,先看它提示缺的是什么模块,然后回去补 apt 包,90% 都能解决。
6.2 运行阶段报错对照表
| 报错信息 | 原因 | 解决办法 |
|---|---|---|
Failed to load scene file | 场景路径不对 | 按报错路径放置文件,或改 settings 中 scene 字段 |
AttributeError: 'Simulator' object has no attribute ... | 版本 API 不匹配 | 检查 habitat-sim 版本与 example.py 来源是否一致 |
Could not create EGL context | GPU 环境配置问题 | 尝试设置export HABITAT_SIM_EGL=0,或改用 xvfb-run |
Segmentation fault | 数据集损坏或路径错误 | 重新解压 TestScenes;确认路径无空格和中文 |
| 窗口闪退 | 显卡驱动或 OpenGL 版本问题 | 更新显卡驱动;使用 CPU 渲染模式测试 |
运行阶段的报错往往比安装阶段更隐蔽,因为问题出在运行时的资源加载或 GPU 初始化环节。遇到段错误(Segmentation fault)时,优先怀疑数据集和解压过程,其次是路径里的特殊字符。这个经验我踩过很多次,都在不知不觉中被文件名里的一个空格坑了。
6.3 独家避坑心得
除了上面的对照表,我再写几条别人很少提的建议。
第一,刚安装完别急着跑大场景。TestScenes 里那些小房间适合验证,但如果你一开始就加载一个几 GB 的大场景,加载时间、内存占用都会干扰你判断“到底有没有装对”。先用最小的场景跑通,再逐步换大的。
第二,不要忽略 conda 环境激活。每次开新终端跑 Habitat,第一句一定是conda activate habitat,否则大概率 import 失败或者调用到系统里另一个 Python 的包。这个失误我至少犯过五次,全是血的教训。
第三,日志是排查问题的第一手段。很多新手碰到报错就去搜索引擎复制粘贴,其实 habitat-sim 的日志信息已经把原因写得很清楚了。我建议把export HABITAT_SIM_LOG=error放在工作配置里,但需要排查细节时,就改成=debug看看完整上下文。
第四,编译安装时如果中途失败,重试之前先清理缓存。rm -rf build和find . -name "*.so" -delete这两条命令能解决很多“脏编译”导致的诡异报错。有时候问题根本不在代码,而是之前的半成品产物在捣乱。
第五,跑 example.py 时如果画面很暗,多半不是 bug,而是场景本身的光照设置如此。有些测试场景的光照确实偏暗,你可以适当调整渲染相机的曝光参数,或者在脚本里临时加一个环境光源,别在隧道里反复折腾。
写在最后
一路折腾到这里的你,已经具备了自己写 Habitat 脚本的基本能力了。我个人的体会是,安装过程最磨人的不是技术难度,而是网上教程各说各话、版本混乱,导致你根本不知道哪个是对的。所以在这篇里我特意把快速安装和源码编译分开写,其中 conda 方案是我最推荐新手先试的,源码编译则适合确定要深入改源码的人。
如果你后面发现 example.py 跑通了但跑得很慢,不要立刻怀疑安装有问题,先看看是不是在纯 CPU 模式下,再检查场景文件是不是太大。如果是训练机器人导航这类的任务,我建议再往前走一步,去了解 habitat-lab 这个上层框架——它封装了训练循环、数据集加载、baseline 算法,能让你的研究工作高效很多。但从零开始把 example.py 跑通这件事,永远是绕不开的第一步。