CARLA 车辆精细碰撞体生成全流程:Raycast 碰撞体与 Physics 碰撞体制作指南
CARLA 车辆精细碰撞体生成全流程:Raycast 碰撞体与 Physics 碰撞体制作指南
本教程面向 CARLA 自动驾驶仿真平台的进阶使用者,讲解如何为车辆生成比默认碰撞体更精确的碰撞边界(collider)。生成后的碰撞体既可以作为物理碰撞体参与动力学计算与碰撞检测,也可以作为次级碰撞体,让基于射线投射(raycast)的传感器(如 LIDAR)采集到更准确的数据,并可将成果提交回社区内容仓库供所有用户使用。读完本文,你将掌握「手动建模低密度网格 + UE 挂载」与「VHACD 凸包分解 + 物理资产导入」两条完整且可落地的碰撞体制作路线,并理解它们在 CARLA 源码层面的实际作用机制。
CARLA 提供了两条生成新碰撞体的路线,二者并不完全等价:
- Raycast 碰撞体(Raycast colliders)——需要一定的 3D 建模基础。为车辆追加一个次级碰撞体(secondary collider),使 LIDAR 等基于射线投射的传感器获取更精确的点云数据。
- Physics 碰撞体(Physics colliders)——源自社区贡献者 yankagan 的成果,利用 VHACD(Volumetric Hierarchical Approximate Convex Decomposition,体积层次近似凸分解)算法自动生成凸包网格,无需手工逐面建模。该网格作为车辆的主碰撞体,同时服务于物理计算与传感器检测(除非另有次级碰撞体)。
两条路线最终都以 Unreal Engine(UE)资产的形式集成进 CARLA,并被内容仓库接纳,供整个社区共享。关于内容贡献流程可参考 贡献指南。
一、Raycast 碰撞体:为传感器精度而生的次级网格
Raycast 碰撞体的核心思路是:在车辆 Blueprint 中挂载一个低密度但贴合车身的静态网格,作为射线检测专用碰撞体。CARLA 的射线类传感器(例如 RayCastLidar)在运行时以 FHitResult 记录射线与场景的撞击点,再经由 ComputeDetection 换算为传感器局部坐标下的点云数据(见 RayCastLidar.cpp)。这意味着射线命中的是碰撞体而非渲染网格——碰撞体越贴合真实车形,LIDAR 点云越能反映车辆的真实轮廓,这正是本路线存在的意义。
1-导出车辆 FBX
首先需要拿到车辆原始网格作为建模参考。本教程以导出一辆 CARLA 自带车辆为例。
- 1.1 在 UE 中打开 CARLA 工程,进入
Content/Carla/Static/Vehicles/4Wheeled/<model_of_vehicle>目录(<model_of_vehicle>替换为具体车型名,例如audiTT)。 - 1.2 对
SM_<model_of_vehicle>(静态网格资产)按右键 → 导出,将车辆网格导出为 FBX 文件。
2-生成低密度网格
- 2.1 打开任意 3D 建模软件,以导出的原始网格为参考,手动建模一个**低面数(low density)**且与原始造型保持一致的简化网格。
- 2.2 将新网格另存为 FBX,命名为
sm_sc_<model_of_vehicle>.fbx。例如奥迪 TT 对应sm_sc_audiTT.fbx。
注意:对于车轮、车顶、挡泥板等附加部件,新网格必须相当精确地贴合其几何轮廓——用简单的立方体(cube)粗略代替是无法达到效果的。贴合度直接决定 LIDAR 点云在细节处的可信度。
3-将网格导入 UE
- 3.1 回到 UE 中的 CARLA 工程,再次进入
Content/Carla/Static/Vehicles/4Wheeled/<model_of_vehicle>。 - 3.2 在该目录上按
右键 → 导入,选择上一步导出的SM_sc_<model_of_vehicle>.fbx完成导入。
4-将网格挂载为碰撞体
- 4.1 进入
Content/Carla/Blueprints/Vehicles/<model_of_vehicle>,打开名为BP_<model_of_vehicle>的车辆蓝图。 - 4.2 在蓝图中选中名为
CustomCollision的组件,在Static mesh属性中填入第 3 步导入的SM_sc_<model_of_vehicle>网格。
- 4.3 点击工具栏上的
Compile编译蓝图并保存更改。
注意:对于摩托车、自行车等车型,同样使用
CustomCollision组件替换车辆自身的碰撞网格即可。
完成以上四步后,该车辆的射线检测(如 LIDAR)将使用这个低密度贴合网格作为命中判定依据。需要说明的是,CARLA 中的射线类传感器默认走碰撞查询通道,其命中结果完全取决于场景中各类碰撞体的分布,因此本路线对传感器数据质量的影响是直接而显著的。
二、Physics 碰撞体:基于 VHACD 的自动凸包分解
Physics 碰撞体路线源于社区贡献者 yankagan 的成果(同时致谢 Francisco E 关于在 UE 中导入自定义碰撞的教程)。其核心流程为:在 UE 中定义车轮碰撞 → 导出车辆骨骼网格 FBX → 在 Blender 中用 VHACD 生成凸包边界 → 导出 FBX → 导回 UE 并写入物理资产(Physics Asset)、建立关节约束。该方法得到的碰撞体直接参与 PhysX 物理计算与碰撞检测。
0-前置条件
- 从源码构建 CARLA:参考 构建 CARLA(Linux 平台可参考 Linux UE5 构建,Windows 平台参考 Windows UE5 构建)。
- Blender 2.80 或更新版本:开源免费 3D 建模软件,可从官网下载。
- Blender 的 VHACD 插件:该插件基于 V-HACD 库实现,可自动将选中物体近似分解为一系列凸包(convex hulls)的组合,这是 UE 碰撞体对计算效率的基本要求。
提示:若你是 Blender 新手,建议先系统学习 Blender 基础操作再开始本流程,凸包分解阶段的建模质量直接决定最终行驶质感。
1-在 Unreal Editor 中为车轮定义自定义碰撞
Step 1 (UE 中) —— 为车轮添加碰撞边界。这一步的详细操作可参考随附视频演示(见 tuto_D_colliders_01.jpg 截图),其目的是让车轮拥有平滑、准确的独立碰撞边界。
在 CARLA 源码中,车轮碰撞行为由 CarlaWheeledVehicle 控制,其中 PhysicsControl.UseSweepWheelCollision 决定车轮是否使用扫掠式碰撞检测(见 CarlaWheeledVehicle.cpp),而车辆网格组件统一采用 "Vehicle" 碰撞预设(SetCollisionProfileName("Vehicle"))。清晰、平滑的车轮碰撞边界是避免车辆在路面"颠簸、卡顿"的关键。
2-将车辆导出为 FBX
Step 2 (UE 中) —— 将车辆的骨骼网格(Skeletal Mesh)导出为 FBX。
- 2.1 进入
Content/Carla/Static/Vehicles/4Wheeled/<model_of_vehicle>。 - 2.2 对
SM_<model_of_vehicle>按右键 → 导出,导出车辆网格为 FBX。
3 至 4-导入 Blender 并创建自定义边界
Step 3 (Blender 中) —— 将上一步导出的 FBX 导入 Blender。
Step 4 (Blender 中) —— 添加凸包网格,构成新的碰撞边界(这是 UE 出于计算效率提出的要求)。这是整条流程中最难的一步:
- 如果直接对整车整体选中运行 VHACD,生成的碰撞边界会粗糙且混乱,包含大量尖锐棱边,车辆在路面上行驶时会产生明显抖动。
- 车轮周围必须有平滑的边界;直接用凸分解处理车身,后视镜等细节也会失真。
- 对计算机视觉(传感器检测)而言,车辆细节至关重要,因此该步骤拆分为两部分:
4.1 先切除车轮底部、侧后视镜和车身顶部区域,用 VHACD 工具为剩余主体生成第一块边界;再切除车身底部一半,为上半部分车体生成第二块边界。
4.2 单独选中侧后视镜,用 VHACD 工具分别为其生成独立边界。
警告:务必非常小心地命名物体。每个边界对象的命名必须以
UCX_开头,其余部分必须与原始网格名称完全一致。UE 正是依靠UCX_命名约定自动识别碰撞网格的,命名不符将导致碰撞体无法被识别或关联错误。
5-从 Blender 导出 FBX
Step 5 (Blender 中) —— 将自定义碰撞边界导出为 FBX。
- 5.1 只选中原始车辆以及所有新建的碰撞对象。
- 5.2 在导出菜单中勾选
selected objects(仅导出选中对象),并在类型中只勾选Mesh。
6 至 8-导入碰撞体并定义物理
Step 6 (UE 中) —— 将新的 FBX 作为静态网格(Static Mesh)资产导入 CARLA 工程。
Step 7 (UE 中) —— 将自定义碰撞体导入到该车辆对应的**物理资产(Physics Asset)**中,使其真正参与物理计算。
Step 8 (UE 中) —— 创建约束(Constraints)连接不同关节,并定义所有部件的物理属性。
物理资产在 CARLA 中的作用不止于物理模拟:在 Tagger.cpp 中,CARLA 会通过 GetLabelByPath(Component->GetPhysicsAsset()) 依据骨骼网格的物理资产路径为其赋予语义标签,从而影响语义分割传感器(Semantic Segmentation)的分类结果。因此物理资产的正确性还会间接影响传感器语义数据。
三、两条路线如何选择与协同
| 对比维度 | Raycast 碰撞体 | Physics 碰撞体 |
|---|---|---|
| 建模方式 | 手动低面数建模 | VHACD 自动凸包分解 |
| 技能要求 | 基础 3D 建模 | Blender 操作 + VHACD 使用 |
| 服务对象 | 次级碰撞体,主要提升 LIDAR 等射线传感器精度 | 主碰撞体,同时服务物理计算与传感器检测 |
| 命名约定 | SM_sc_<车型>.fbx 资产挂载于 CustomCollision 组件 |
Blender 对象名以 UCX_ 开头且与原始网格同名 |
| 关键风险 | 网格需贴合轮毂等细节,不能以立方体敷衍 | 整车凸分解会产生锐边导致行驶抖动,需分区处理 |
在实际项目中,两条路线可以组合使用:先用 Physics 碰撞体保证车辆物理行为真实稳定,再叠加 Raycast 碰撞体为 LIDAR 点云补充更精细的轮廓信息。从源码结构看,RayCastLidar 每次物理 tick 都会执行一次全通道射线模拟(见 RayCastLidar.cpp),碰撞体网格的精细程度将直接反映在每一帧点云中,因此在追求感知数据质量的应用(如目标检测、点云分割)中,Raycast 碰撞体的投入是值得的。
四、集成到社区与后续验证
新碰撞体制作完成后,可以将其集成进 CARLA 内容仓库,使整个社区受益。具体贡献规范、目录结构与审核要求请查阅 内容贡献指南。集成后在本地验证时建议:
- 在 UE 中打开车辆蓝图,确认
CustomCollision(或物理资产)已正确挂载且Compile通过; - 运行 CARLA 服务器,在 PythonAPI 中生成该车辆,观察其在不同路面(平路、颠簸、减速带)上的行驶稳定性;
- 挂载一个射线 LIDAR 传感器,对比替换碰撞体前后的点云轮廓与地面回波分布,确认细节精度确有提升;
- 使用语义分割传感器检查车辆标签是否随物理资产路径正确归类。
至此,CARLA 车辆默认碰撞体的替换与升级方法已经完整覆盖:无论你的目标是更真实的物理驾驶,还是更精确的感知数据,都可以依据本文的两条路线动手实践。打开 CARLA 亲自调试吧——遇到任何问题,欢迎前往 CARLA 官方论坛发帖讨论。






