4、物理引擎对比:Carla基于Unreal Engine的物理模拟、LGSVL基于Unity的物理模拟、碰撞检测与车辆动力学差异

聊到自动驾驶仿真,物理引擎这块儿,我个人的看法是——它决定了你的仿真到底有多“真”。

Carla和LGSVL,一个基于Unreal Engine,一个基于Unity。这两大游戏引擎的物理模拟,说白了就是两个不同的“物理世界”。你想想看,游戏引擎本身就不是为自动驾驶设计的,但咱们硬是把它拉来干活。所以,理解它们的差异,能帮你少踩很多坑。

4.1 物理引擎的底层差异

先说说Carla这边。它用的是Unreal Engine 4的物理系统,底层是NVIDIA PhysX。PhysX在刚体动力学、碰撞检测上做得非常成熟。我最早接触Carla时,第一感觉就是——轮胎和地面的摩擦感很“沉”,有点像真车。

为什么会这样?因为Unreal的物理引擎默认对质量、惯性、摩擦系数这些参数做了比较精细的建模。你调一个轮胎的摩擦系数,车子的过弯表现就会有明显变化。我个人习惯在Carla里做车辆动力学标定时,会先调轮胎的纵向摩擦和侧向摩擦,这两个参数直接影响车辆的加速和转向响应。

LGSVL这边,用的是Unity的物理引擎,底层也是PhysX(Unity从2019版本开始集成了自家的DOTS物理,但LGSVL主要用的还是传统PhysX)。不过,Unity的物理系统在默认参数上,和Unreal有一些微妙的差别。

核心差异点:

  • 时间步长(Timestep):Unreal默认物理步长是60Hz,Unity默认是50Hz。别小看这10Hz的差距,在高速碰撞场景下,Carla的碰撞检测会更细腻一些。
  • 求解器迭代次数:Unreal默认的约束求解迭代次数比Unity多。这意味着Carla在处理多物体碰撞时,稳定性更好。
  • 摩擦模型:两者都用了库仑摩擦模型,但Unreal对静摩擦和动摩擦的过渡处理更平滑。

我记得有一次,我在LGSVL里做泊车仿真,车子轻轻蹭到路沿,结果直接弹飞了。排查了半天,发现是Unity的碰撞体边缘处理不够平滑,加上物理步长偏低,导致碰撞瞬间的冲量计算出了问题。嗯,这里要注意——如果你在LGSVL里做低速碰撞场景,建议把物理步长调到60Hz以上。

4.2 碰撞检测的差异

碰撞检测,说白了就是判断两个物体有没有“碰到”。但自动驾驶仿真里的碰撞检测,比游戏里复杂得多。

Carla的碰撞检测,我总结一下:精度高,但开销大。它默认使用离散碰撞检测(Discrete Collision Detection),对于高速运动的车辆,偶尔会出现“穿透”现象。不过Carla提供了连续碰撞检测(CCD)的选项,开启后能有效避免穿透。代价是性能下降明显。

LGSVL这边,碰撞检测的默认配置更偏向性能。Unity的物理引擎在处理大量物体时,会做一些“偷懒”的优化,比如碰撞体的简化、碰撞检测的跳过等。这在游戏里没问题,但在自动驾驶仿真里,可能会漏掉一些细微的碰撞。

我的建议:

如果你做的是高速场景(比如高速公路上的紧急避让),建议用Carla,它的CCD更可靠。如果你做的是低速场景(比如园区、停车场),LGSVL完全够用,而且性能更好。

我曾经在Carla里做过一个测试:两辆车以80km/h的相对速度对向行驶,然后让它们轻微擦碰。Carla的CCD能准确捕捉到每一次接触,而LGSVL在同样设置下,有大约5%的概率会出现穿透。这个概率不高,但在自动驾驶测试中,5%的漏检是不能接受的。

4.3 车辆动力学的差异

车辆动力学,这是仿真里最核心的部分。Carla和LGSVL都提供了车辆动力学模型,但实现方式完全不同。

Carla的车辆动力学模型,是基于一个简化的自行车模型(Bicycle Model)加上轮胎的Pacejka魔术公式。它考虑了纵向力、侧向力、横摆力矩、悬挂系统等。我个人觉得,Carla的动力学模型更接近真实的车辆动力学仿真软件(比如CarSim、IPG CarMaker)。

LGSVL的车辆动力学模型,相对简单一些。它用的是基于刚体动力学的简化模型,轮胎模型是线性的。说白了,就是假设轮胎的侧偏刚度是常数,不考虑轮胎的非线性特性。这在低速、小转向角的情况下没问题,但一旦到了极限工况(比如急转弯、湿滑路面),LGSVL的模型就不太准了。

对比项 Carla(Unreal) LGSVL(Unity)
轮胎模型 Pacejka魔术公式(非线性) 线性轮胎模型
悬挂系统 支持独立悬挂、扭力梁 简化弹簧阻尼模型
空气动力学 支持(可配置阻力、升力) 不支持
传动系统 支持发动机、变速箱、差速器 简化扭矩模型
转向系统 支持阿克曼转向、转向比可调 简化转向模型

你看这个表格,差距还是挺明显的。Carla的动力学模型,基本上覆盖了真实车辆的主要子系统。而LGSVL的模型,更像是一个“玩具车”级别的简化。

避坑指南:

我曾经在LGSVL里做车辆横向控制算法的验证,发现同样的PID参数,在LGSVL里表现很好,但放到真车上就完全不行。后来分析发现,LGSVL的线性轮胎模型忽略了轮胎的非线性特性,导致控制器的鲁棒性被高估了。所以,如果你要做控制算法的验证,建议用Carla,或者至少用LGSVL时,把轮胎模型换成非线性的(LGSVL支持自定义动力学插件)。

4.4 实际项目中的选择建议

说了这么多,到底该选哪个?我的看法是:看你的需求

  • 如果你做的是感知算法开发:LGSVL的物理引擎够用,而且它的传感器仿真(尤其是LiDAR)做得不错。
  • 如果你做的是规划控制算法开发:建议用Carla,它的动力学模型更真实,能帮你发现更多问题。
  • 如果你做的是整车级仿真:Carla是更好的选择,它的物理引擎和动力学模型更接近真实车辆。
  • 如果你需要快速原型验证:LGSVL的部署更简单,上手更快。

嗯,最后说一句。物理引擎这东西,没有绝对的好坏。关键是你得知道它的局限性。我在项目里经常是Carla和LGSVL混着用——用Carla做高保真的动力学验证,用LGSVL做大规模的感知数据采集。两者互补,效果更好。

下一章,我会聊聊传感器仿真的差异。这个话题更有意思,因为传感器仿真直接决定了你的算法能不能“看到”真实的世界。