DReyeVR:基于CARLA的VR驾驶模拟器,集成眼动追踪的开源研究平台
发布时间:2026/8/11 5:04:17 作者:尧图编辑部 阅读量:1,286

1. 项目概述当驾驶模拟器遇上VR与眼动追踪如果你正在从事驾驶行为、人机交互或自动驾驶相关的研究并且对如何在高度沉浸的虚拟环境中收集精确的、第一人称的交互数据感到头疼那么DReyeVR这个开源项目很可能就是你一直在寻找的答案。简单来说DReyeVR是一个基于知名自动驾驶模拟器CARLA构建的扩展项目它巧妙地将虚拟现实VR和眼动追踪技术整合进来把一个原本以“上帝视角”观察的驾驶模拟器变成了一个你可以“坐进去”、用眼睛和身体去感知的虚拟驾驶舱。我第一次接触这个项目时就被它的设计思路打动了。传统的驾驶模拟研究要么依赖昂贵的专业模拟器要么只能通过屏幕和鼠标键盘进行数据维度单一沉浸感也差。DReyeVR的出现相当于用开源的方式为学术界和工业界的研究者提供了一个功能强大、成本相对可控的“瑞士军刀”。它的核心价值在于“民主化”——让没有百万预算的实验室也能开展需要高精度眼动和交互数据的驾驶行为研究。项目基于CARLA 0.9.13和Unreal Engine 4.26这意味着你不仅能获得一个物理逼真的驾驶环境还能利用CARLA已有的丰富场景、交通流和传感器模型在这个基础上叠加VR和眼动数据层实现112的效果。2. 核心功能与硬件生态解析2.1 沉浸式驾驶体验的三大支柱DReyeVR并非简单地将CARLA的画面投射到头显里它从底层重构了交互逻辑。其核心体验建立在三个支柱上第一支柱完全可驾驶的VR自我车辆Ego Vehicle。这是整个项目的基石。它不是一个简单的模型替换而是一个集成了SteamVR追踪、完整车辆动力学和交互界面的复合体。当你戴上头显你进入的是一个拥有完整仪表盘速度表、档位指示器、转向灯、可动态旋转的方向盘与真实方向盘输入同步、以及逼真后视镜和侧视镜的驾驶舱。引擎的轰鸣声、转向灯的咔嗒声都是“自我中心”的即声音会根据你的头部位置和车辆状态动态变化这种听觉反馈对建立空间感和沉浸感至关重要。第二支柱高精度眼动追踪集成。这是DReyeVR区别于其他VR驾驶模拟器的杀手锏。项目目前深度集成了HTC Vive Pro Eye头显及其SRanipal SDK能够以高频率捕获双眼的凝视射线、瞳孔位置、瞳孔直径和眼睛开合度等数据。想象一下在研究分心驾驶时你不仅能知道驾驶员看了哪里还能知道他看了多久、瞳孔是否放大可能表示认知负荷甚至他是否眨眼可能表示疲劳。这些数据通过项目自定义的EgoSensor传感器以与CARLA原生传感器相同的方式序列化和流式传输可以无缝对接PythonAPI进行分析或通过ROS桥接发送到其他系统。第三支柱与CARLA生态的深度兼容。这是DReyeVR能快速投入研究应用的关键。它没有另起炉灶而是选择成为CARLA的“超级模组”。这意味着完全兼容CARLA PythonAPI和ScenarioRunner你之前写的用于控制交通流、生成复杂场景的Python脚本几乎可以无缝迁移。支持CARLA录制与回放系统不仅能录制车辆轨迹还能录制HMD头显的位姿、方向以及EgoSensor的所有数据。你可以像回放电影一样复现整个实验过程并从任意角度分析被试者的眼动和行为。可与CARLA的AI控制器进行控制权切换实现“人在环”或“机器在环”的混合实验比如研究自动驾驶系统接管请求时驾驶员的反应和视线转移模式。2.2 硬件支持矩阵与选型建议选择硬件是项目落地的第一步。DReyeVR官方给出了一个清晰的兼容性列表但我们需要深入理解其背后的原因设备/功能Windows 支持Linux 支持MacOS 支持核心依赖与说明VR头显 (基础)✅ (推荐)✅❌依赖SteamVR运行时。任何SteamVR兼容的头显如Valve Index, 多数WMR设备理论上都支持基础VR功能。HTC Vive Pro Eye (眼动)✅❌❌眼动追踪的当前唯一官方选择。依赖HTC的SRanipal SDK和Tobii的底层固件两者均为Windows专有。Meta Quest 2 (Via Link)✅❌❌可通过Oculus Link或Air Link以PCVR模式运行支持基础VR但无眼动追踪。Quest Pro等具备眼动功能的设备因SDK不同需要社区贡献适配。罗技方向盘 (G923等)✅⚠️ (可能)❌依赖项目自带的LogitechWheelPlugin该插件基于官方Windows SDK开发。Linux下可通过new-lg4ff等内核模块驱动但力反馈和高级功能无法保证。键盘鼠标✅✅✅通用输入全平台支持。注意关于眼动追踪的“硬伤”。目前眼动功能被锁定在Windows HTC Vive Pro Eye的组合上这主要是因为眼动硬件厂商Tobii的固件和SDK是闭源且平台限定的。社区中一直有在Linux上破解支持的讨论但均未形成稳定方案。如果你的研究核心是眼动那么Windows工作站是唯一稳妥的选择。如果你的重点是VR交互本身那么Linux也是一个高性能且稳定的选项。硬件选型实操心得头显选择如果预算充足且眼动是刚需直接选择HTC Vive Pro Eye。如果仅需VR沉浸感Valve Index在视野和刷新率上体验更佳且对Linux支持更好。Quest系列作为一体机方便演示和移动但通过串流会增加延迟对精确研究可能不利。方向盘选择罗技G系列G29, G923是性价比之选且插件支持完善。如果追求更高仿真度图马思特或Fanatec等品牌需要自行验证驱动兼容性可能需要修改或重写LogitechWheelPlugin。PC配置重点投资显卡RTX 3070及以上和CPU单核性能因UE4特性。VR渲染分辨率高且DReyeVR的后视镜是实时渲染的“性能杀手”配置不足会导致帧率过低引发眩晕。3. 从零开始环境搭建与项目编译全流程3.1 系统准备与CARLA基础环境搭建DReyeVR是CARLA的扩展因此第一步是搭建一个正确的CARLA开发环境。官方明确要求CARLA 0.9.13和Unreal Engine 4.26。版本必须严格匹配否则编译必然失败。步骤1获取CARLA 0.9.13源码# 克隆CARLA仓库并切换到0.9.13标签 git clone https://github.com/carla-simulator/carla.git cd carla git checkout 0.9.13踩坑记录切勿使用master分支或其他版本。CARLA不同版本间的UE4插件和API变动很大DReyeVR的补丁文件是针对0.9.13特定版本生成的。步骤2安装Unreal Engine 4.26这是最易出错的环节。CARLA推荐使用Epic Games启动器安装UE4.26但为了编译我们需要源码构建。更可靠的方法是使用CARLA官方提供的编译脚本它会自动处理UE4的依赖和补丁。# 在carla根目录下运行其提供的UE4集成脚本 ./Update.sh这个脚本会下载一个特定版本的UE4.26源码约几十GB并自动应用CARLA所需的补丁。整个过程耗时很长且需要稳定的网络环境。如果中间失败可以尝试手动下载UE4.26源码但配置编译环境非常复杂不推荐新手尝试。步骤3构建CARLA LibCarla和PythonAPI# 构建LibCarlaC客户端库 make LibCarla # 构建PythonAPIPython客户端 make PythonAPI完成以上步骤后你应该能成功运行CarlaUE4.shLinux或CarlaUE4.exeWindows打开一个空的UE4编辑器并且能通过PythonAPI/examples中的示例脚本连接上模拟器。这是验证CARLA环境是否正常的标志。3.2 集成DReyeVR插件与编译当基础CARLA环境就绪后就可以将DReyeVR“嫁接”上去了。步骤1克隆DReyeVR仓库并放置不要直接将DReyeVR克隆到CARLA目录内。正确的做法是将DReyeVR仓库克隆到与carla目录同级的位置。# 假设你的工作目录是 ~/projects/ cd ~/projects/ git clone https://github.com/HARPLab/DReyeVR.git # 此时目录结构应为 # ~/projects/ # ├── carla/ (CARLA 0.9.13) # └── DReyeVR/ (DReyeVR插件)步骤2应用DReyeVR补丁DReyeVR通过一个Setup.sh脚本Windows下为Setup.ps1自动将必要的文件复制到CARLA目录并应用一些代码修改。cd ~/projects/DReyeVR # Linux/Mac ./Setup.sh # Windows (以管理员身份打开PowerShell) .\Setup.ps1这个脚本会做以下几件事将DReyeVR/下的CarlaUE4/、PythonAPI/等目录中的内容合并到CARLA的对应目录中。将Plugins/目录复制到carla/Unreal/CarlaUE4/Plugins/下。修改部分CARLA源文件以集成新的传感器和车辆类。重要提示运行此脚本前务必备份你的CARLA目录或者确保你使用的是全新的、未修改的0.9.13版本。因为该脚本会覆盖CARLA的原生文件。步骤3重新编译CARLA集成DReyeVR后应用补丁后需要重新编译CARLA的UE4项目以及LibCarla。cd ~/projects/carla # 重新构建UE4项目这会打开UE4编辑器进行编译 make launch # 在打开的UE4编辑器中等待着色器编译完成可能很久然后关闭编辑器。 # 重新构建LibCarla和PythonAPI make LibCarla make PythonAPI如果一切顺利编译将不会有错误。此时你的CARLA已经变成了一个“增强版”具备了DReyeVR的所有功能。3.3 专用插件安装与Python环境配置DReyeVR的一些高级功能需要额外的第三方插件。1. 眼动追踪插件 (仅Windows)前往HTC Vive开发者网站下载SRanipal SDK。将其解压后你会找到一个Plugins文件夹。需要手动将其中与SRanipal相关的插件文件.dll和.json等复制到carla/Unreal/CarlaUE4/Plugins/DReyeVR/Binaries/Win64/目录下。具体步骤请参考Docs/Install.md因为SDK版本更新可能导致路径变化。2. 罗技方向盘插件DReyeVR仓库的Plugins/目录下已经包含了预编译的LogitechWheelPlugin。Setup脚本应该已经将其部署到位。你只需确保在Windows设备管理器中正确安装了罗技G-Hub或旧版驱动系统能识别到你的方向盘。3. Python环境配置为了运行DReyeVR增强的PythonAPI示例建议创建一个独立的Conda环境。conda create -n dreyevr python3.7 conda activate dreyevr cd ~/projects/carla pip install -r PythonAPI/carla/requirements.txtDReyeVR扩展了PythonAPI增加了一些新的类如DReyeVREgoVehicle和数据类型如EyeTrackerData。你可以在carla/PythonAPI/carla/下找到这些新增的文件。4. 核心功能使用与数据采集实战4.1 启动与初体验进入VR驾驶舱编译完成后启动方式与原生CARLA略有不同需要指定一个特殊的UE4地图参数来加载DReyeVR的Pawn角色。cd ~/projects/carla # Linux ./CarlaUE4.sh -carla-settingsConfig/DReyeVRConfig.ini /Game/Carla/Maps/Town10HD -game # Windows CarlaUE4.exe -carla-settingsConfig/DReyeVRConfig.ini /Game/Carla/Maps/Town10HD -game关键参数解析-carla-settingsConfig/DReyeVRConfig.ini指定DReyeVR的配置文件里面可以设置默认车辆、是否启用眼动等参数。/Game/Carla/Maps/Town10HD指定启动的地图。Town10HD是DReyeVR示例中常用的地图。-game以游戏模式直接运行而不是打开UE4编辑器。启动后戴上你的VR头显。你应该会直接出现在一辆车的驾驶座上。此时你可以头部移动环顾驾驶舱内部查看仪表、后视镜。使用键盘鼠标W/A/S/D控制油门转向鼠标控制视角在VR中可能不直观。使用方向盘如果已连接方向盘和踏板应该立即生效并有力反馈。查看眼动光标如果眼动已启用你会看到一个代表你凝视点的小光标reticle投射在虚拟世界中。4.2 通过PythonAPI控制与采集数据DReyeVR的强大之处在于你仍然可以用Python脚本自动化整个实验流程。下面是一个简化的示例展示如何连接模拟器、生成一辆DReyeVR自我车辆并读取眼动数据。import carla from carla import DReyeVREgoVehicle # 导入DReyeVR扩展的类 # 1. 连接客户端 client carla.Client(localhost, 2000) client.set_timeout(10.0) world client.get_world() # 2. 获取DReyeVR自我车辆的蓝图 # 注意这里不是普通的vehicle.*而是特殊的ego_vehicle类型 ego_bp world.get_blueprint_library().find(ego_vehicle.dreyevr_ego_vehicle) # 3. 设置生成点并生成车辆 spawn_point carla.Transform(carla.Location(x100, y200, z1.0), carla.Rotation()) ego_vehicle world.spawn_actor(ego_bp, spawn_point) # 4. 获取并监听EgoSensor数据 # EgoSensor是附着在ego_vehicle上的一个特殊传感器 sensor_list ego_vehicle.get_sensors() for sensor in sensor_list: if sensor.type_id sensor.ego: # 寻找EgoSensor ego_sensor sensor break # 定义一个回调函数来处理每一帧的传感器数据 def ego_sensor_callback(data): # data是DReyeVR自定义的DReyeVRData类型 print(fFrame: {data.frame_num}) print(f Throttle: {data.throttle:.2f}, Brake: {data.brake:.2f}, Steering: {data.steering:.2f}) # 眼动数据 eye_data data.eye_tracker if eye_data.is_valid: # 检查眼动数据是否有效例如用户是否在注视范围内 combined_gaze eye_data.combined_gaze # 双眼融合的凝视射线起点和方向 print(f Gaze Origin: {combined_gaze.origin}, Direction: {combined_gaze.direction}) # 你可以通过射线投射raycast来确定用户正在看世界中的哪个物体 # hit_actor world.cast_ray(combined_gaze.origin, combined_gaze.direction) # if hit_actor: # print(f Looking at: {hit_actor.type_id}) # 开始监听数据流 ego_sensor.listen(ego_sensor_callback) # 5. 运行你的实验场景例如使用ScenarioRunner # ... 此处可以插入交通流生成、NPC车辆控制等代码 ... # 6. 实验结束后清理 ego_sensor.stop() ego_vehicle.destroy()这个脚本展示了数据流的核心链路从虚拟世界中的车辆到集成的EgoSensor再到Python客户端。你获取的data对象是一个宝库包含了车辆控制输入、HMD位姿和完整的眼动数据。4.3 录制与回放重现完整实验过程DReyeVR完美继承了CARLA的录制/回放系统并对其进行了增强使其能够录制EgoSensor的所有数据。录制# 开始录制指定文件名 client.start_recorder(my_experiment.log) # ... 运行你的实验 ... # 结束录制 client.stop_recorder()这个.log文件不仅记录了所有车辆、行人的轨迹还记录了EgoSensor的每一帧数据。回放与分析# 重新加载录制文件 client.replay_file(my_experiment.log, start10, duration30) # 从第10秒开始回放30秒 # 在回放过程中你可以像实时一样访问ego_vehicle和ego_sensor # 更强大的是你可以使用“快照”功能跳转到任意帧进行详细分析 snapshot world.get_snapshot() frame_id snapshot.frame # 你可以根据frame_id从录制文件中精确提取出那一时刻所有的眼动、车辆状态数据用于离线分析。回放时你可以自由切换观察视角如第三人称跟随、无人机视角结合当时驾驶员的眼动光标直观地分析“他在看哪里为什么没看到那个危险”。这是进行事故分析和行为研究的利器。5. 高级配置与自定义开发指南5.1 配置文件详解DReyeVRConfig.iniConfig/DReyeVRConfig.ini文件是调整DReyeVR运行时行为的主要入口无需重新编译。以下是一些关键参数[/Script/DReyeVR.DReyeVRGameMode] ; 是否启用VR模式。如果设为false将以桌面模式运行用于调试。 bEnableVRtrue ; 默认的自我车辆蓝图。你可以创建自己的车辆蓝图并在此指定。 DefaultEgoVehicle/Game/DReyeVR/EgoVehicle/BP_EgoVehicle.BP_EgoVehicle_C ; 是否在开始时自动占据自我车辆。设为false可用于观察AI驾驶。 bAutoPossesstrue [/Script/DReyeVR.DReyeVRSensor] ; 是否启用眼动追踪 bEnableEyeTrackingtrue ; 眼动数据发布频率Hz EyeTrackerFreq120 ; 是否在场景中显示凝视光标 bShowReticletrue [/Script/DReyeVR.DReyeVREgoVehicle] ; 方向盘力反馈强度 SteeringWheelForceFeedback1.0 ; 是否启用真实后视镜性能消耗大 bEnableTrueMirrorstrue修改这些参数后重启模拟器即可生效。这对于快速进行A/B测试比如开启/关闭后视镜对比性能非常方便。5.2 自定义车辆与场景元素DReyeVR鼓励用户扩展。Docs/Tutorials/目录下有一些很好的教程。自定义自我车辆外观在UE4编辑器中打开carla/Unreal/CarlaUE4项目。找到/Game/DReyeVR/EgoVehicle/BP_EgoVehicle这个蓝图。你可以修改其静态网格体换成别的车模调整仪表盘材质甚至添加新的交互元件如按钮。修改后需要在DReyeVRConfig.ini中更新DefaultEgoVehicle路径或在使用PythonAPI生成时指定你的新蓝图。添加自定义路标或目标物 DReyeVR支持添加自定义的3D静态物体CustomActor这些物体可以被录制和回放并且可以被EgoSensor的凝视射线检测到。这对于设计特定的实验任务如让被试寻找特定标志物非常有用。你需要通过C或蓝图创建继承自DReyeVRCustomActor的类并在场景中放置。5.3 性能调优与故障排除VR应用对性能极其敏感。以下是一些关键的调优点后视镜True Mirrors这是最大的性能瓶颈。每个后视镜都是一个独立的、实时渲染的场景摄像机。在DReyeVRConfig.ini中将其关闭(bEnableTrueMirrorsfalse)或减少后视镜的分辨率需要修改蓝图可以极大提升帧率。渲染分辨率与超级采样在SteamVR设置中降低每只眼睛的渲染分辨率。DReyeVR本身不控制这个但它直接决定了GPU负载。CARLA画面设置在UE4编辑器设置或CARLA的QualitySettings.ini中降低阴影质量、后期处理效果、视距等。Foveated Rendering注视点渲染这是一个实验性功能仅在编辑器构建中启用。它可以根据凝视点或固定中心动态降低视野边缘的渲染分辨率。这能显著提升性能但可能会引入视觉瑕疵且目前仅支持NVIDIA VRSS技术。6. 常见问题与排查实录在实际部署和研究中你几乎一定会遇到下面这些问题。这里记录了我踩过的坑和解决方案。Q1: 编译CARLA或DReyeVR时出现“Unreal Build Tool”错误或头文件缺失。A1:这几乎总是环境不干净或版本不匹配导致的。彻底清理运行make clean和make hard-clean。删除carla/Build/和carla/Unreal/CarlaUE4/Intermediate/目录。验证UE4版本确保carla/Unreal/UE4.26目录存在且完整。如果Update.sh失败可以尝试从Epic Games启动器安装UE4.26然后手动创建符号链接但这非常棘手。检查磁盘空间UE4编译需要大量临时空间确保有50GB以上的空闲空间。Q2: 启动后VR头显里显示的是桌面画面而不是沉浸式驾驶舱。A2:这是典型的VR渲染未正确启动。确保启动命令包含了-game参数并且bEnableVRtrue。检查SteamVR是否已正确安装并运行。启动前先打开SteamVR确保头显和基站被识别。在项目设置中确认CarlaUE4的Description-Settings-Stereo Mode被设置为“Stereo Both Eyes”。Q3: 眼动数据eye_data.is_valid始终为False。A3:眼动追踪初始化失败。SRanipal运行时确保已安装SRanipal运行时并在任务管理器中看到SR_*相关的进程在运行。头显佩戴检测Vive Pro Eye需要检测到用户正佩戴着头显才会输出有效数据。确保头显前面的距离传感器没有被遮挡。校准首次使用或更换用户时必须在SteamVR的Vive控制面板中进行眼动校准。不校准或校准不准都会导致数据无效。插件位置再次确认SRanipal的.dll文件已正确复制到Plugins/DReyeVR/Binaries/Win64/目录下。Q4: Python脚本连接超时无法生成ego_vehicle。A4:客户端-服务器通信问题。确保模拟器已启动先运行CarlaUE4看到地图加载完成后再运行Python脚本。检查端口默认是localhost:2000。如果改了端口需要在carla.Client中指定。蓝图名称最容易被忽略的一点。DReyeVR的自我车辆蓝图名是ego_vehicle.dreyevr_ego_vehicle而不是普通的vehicle.tesla.model3。用错蓝图会导致生成失败。Q5: 使用方向盘时没有力反馈或踏板没反应。A5:方向盘插件或驱动问题。安装Logitech G-Hub在Windows上确保安装了最新版G-Hub并能在其中看到你的方向盘设备。检查插件确认LogitechWheelPlugin的dll文件存在于carla/Unreal/CarlaUE4/Plugins/DReyeVR/Binaries/Win64/。游戏内设置有些方向盘需要在游戏的“控制设置”中重新映射轴和按钮。DReyeVR的输入映射主要在C代码中定义如果使用非罗技设备可能需要修改LogitechWheelPlugin的源码。Q6: 帧率很低体验卡顿。A6:性能优化问题。关闭后视镜在配置文件中设置bEnableTrueMirrorsfalse这是提升帧率最有效的方法。降低渲染分辨率在SteamVR视频设置中将每眼分辨率调至100%或更低。简化场景在简单的Town01而不是复杂的Town10HD中测试。更新显卡驱动确保使用为VR优化过的最新版显卡驱动。DReyeVR是一个将前沿学术研究需求工程化实现的优秀范例。它最大的魅力在于将复杂的VR、眼动、车辆动力学集成封装成了一个相对易用的研究平台。虽然初始搭建有一定门槛但一旦跑通它能为你的研究打开一扇新的大门获取到传统方法难以企及的精细数据。我的建议是严格按照官方文档的版本要求耐心完成环境搭建。在实验设计上从小场景开始逐步验证你的数据管道——从信号采集、到数据传输、再到离线分析确保每一个环节都可靠然后再开展正式的大规模实验。这个项目仍在活跃开发中遇到问题时不妨去GitHub的Issues页面看看很可能已经有先驱者遇到了同样的问题并找到了解决方案。