
作者 | 张峻川
编辑 | 李慢慢
出品 | 车路漫漫
大家好,我是峻川。
在去年笔者曾经发过公 众号文章,将Luman AI的3DGS插件集成进CARLA:LumaAI+CARLA=无痛拥有自己的3DGS自动驾驶仿真器,使CARLA能够实时渲染训练好的3DGS模型,而今年,随着NVIDIA NuRec工具链的成熟,CARLA官方也终于将3DGS模型的渲染功能集成进自己最新版本中,形成了一套可用的自动驾驶仿真工具链。这也是本文将要着重复现的内容。
注:NVIDIA的NuRec工具链不仅可以应用到CARLA中,还能集成到旗下Omniverse的其他仿真平台中,例如Isaac Sim,详情可以见笔者的另一篇文章:一文尽览神经渲染(NERF/3DGS)技术在具身仿真框架Isaac Sim中的实现
我们从CARLA的官方github地址:https://github.com/carla-simulator/carla 可以获取其发布的0.9.16版软件,按照官方文档安装编译即可。
在此提醒大家注意,CARLA github仓库中的default分支是ue5-dev,是基于UE5.5开发的最新分支,但并不是0.9.16版,不包含本文所述的NuRec相关功能。0.9.16版仍然是基于UE4开发的。大家从github中获取CARLA代码后可以切换到0.9.16 tag。
在此我选择的是build from source的方式安装编译,运行以下功能的系统配置是操作系统:Ubuntu22.04;GPU:RTX 3090,CPU 40核,内存128GB。
安装编译0.9.16版CARLA后,还需要按照文末参考链接[1]中的描述部署NuRec相关内容:主要是部署一个docker,内部运行Neural Reconstruction Engine,实现3DGS模型渲染的功能;另外就是从NVIDIA的huggingface仓库[2]中下载NuRec工具链所需的制作好的3DGS模型等原始数据。需要注意的是,编译后的CARLA加上对应的UE,再加上刚刚提到的PhysicalAI-Autonomous-Vehicles-NuRec数据集,共会占约300GB的硬盘空间。
Step 2:运行
接下来运行CARLA server,再运行下面这个脚本即可激活功能。该脚本的命令行参数详见文末参考链接[1]。
PythonAPI/examples/nvidia/nurec/example_nurec_replay_save_images.py 效果如下:

图1-UE4运行界面(Server端)和pygame运行界面(Client端)
CARLA server中可以看到脚本启动的world,其中可以看到地图和动态交通参与者,同时脚本还会启动一个pygame窗口,展示实时的NuRec渲染结果:前视、左视和右视图像。脚本可以选择保存这些渲染图像。
NuRec和CARLA联合仿真的架构如下图所示:

图2-NuRec和CARLA联合仿真的架构
example_nurec_replay_save_images.py是一个单纯的数据回放脚本,脚本从PhysicalAI-Autonomous-Vehicles-NuRec数据集的某条切片中提取主车轨迹、动态交通参与者轨迹和地图,在CARLA server中构建一个仿真场景,接下来在每一步的仿真运算中,根据数据切片中的主车轨迹、动态交通参与者轨迹更新CARLA world中的主车位姿和动态交通参与者这些actor的位姿,同时将ego位姿转化为相机位姿,和其他actor的信息一起传输给docker中的NuRec渲染引擎,获取该步的RGB图片。
在CARLA world中的主车以外的actor是根据记录的数据做匹配选择的CARLA actor模型,这些动态交通参与者在CARLA中的位姿是脚本中提取的数据集中记录的轨迹控制的,如下图。

图3-数据集中的目标物和CARLA中的目标物
笔者认为在此基础上进行进一步开发,完全可以实现联合NuRec的闭环仿真,即借助CARLA成熟的工具链体系和3DGS模型渲染实现能够给算法提供高保真度图像的闭环仿真。
首先很显然地,在闭环测试中,自车轨迹可以用算法输出的控制指令更新的主车位姿来代替。重点在于动态交通参与者的位姿是否可编辑,是否和主车可交互。
即使不对动态交通参与者的轨迹进行改动,由于在CARLA world里,这些已经是actor了,因此起码可以进行碰撞检测等操作来丰富闭环测试功能。此外笔者认为对数据集中的动态交通参与者轨迹文件进行预编辑,以形成新的动态场景应该也是可行的。最后,动态交通参与者是否也可以实现单步控制位姿,以实现和主车的实时动态交互,从当前的示例代码来看应该是可以的,毕竟脚本每一步向Neural Reconstruction Engine发送的gRPC请求对象RGBRenderRequest中都包含了dynamic_objects列表。当然,如果被控的主车轨迹和动态交通参与者轨迹和原始数据相差太大,图像重建效果肯定会受很大影响。
最后我们来看PhysicalAI-Autonomous-Vehicles-NuRec数据集每一个切片都包含哪些信息,挑选一个切片直接解压缩,可以看到包含如下文件:

其中包含我们熟悉的map.xodr,用在线的读取OpenDrive地图的工具打开可以看到地图内容,如下所示。

图5-数据集中的OpenDRIVE地图
还有一些usda、usd、nurec后缀的文件,我们有了之前在Isaac Sim中应用NuRec的经验,可以知道这些就是和NuRec渲染3DGS模型有关系的文件了,因此我们打开Isaac Sim,加载default.usda,可以打开这一系列文件,如下所示。

图6-Isaac Sim中加载usda文件
可以看到,这和之前笔者文章中的应用3DGRUT模型的操作类似,模型除了渲染用的volume数据外,还连接了mesh文件,其中最主要的静态背景mesh用meshlab打开的效果如下所示。

图7-meshlab打开mesh文件
不过之前文章中用Isaac Sim打开usda文件加载3DGS模型后,Isaac Sim窗口显示的场景还带有色彩属性,如下图:

图8-Isaac Sim打开usda文件的色彩
这也许是因为CARLA中应用的NuRec和Isaac Sim中应用的NuRec在渲染方法上有一些差异,因为如果我们将数据集中的checkpoint.ckpt去掉,再运行example_nurec_replay_save_images.py,docker中就会报出checkpoint缺失的错误,可见在CARLA中应用NuRec时,模型训练出的checkpoint是必要的。而且图6中我们只看到了静态背景,我们必然需要额外信息来渲染动态物体。
此外数据集中的一些json文件大多是track数据,包含主车轨迹、动态交通参与者轨迹等。
深入了解NuRec数据集之后,我们就可以应用自己的方法来产生更多数据集,如可以选用一些更为先进的重建方法。现行的NuRec数据集在重建效果上还存在大量瑕疵,如下图的地面人行横道线。

图9-NuRec重建技术的人行横道线的瑕疵
更多CARLA相关视频,可关注作者阿b账号:https://space.bilibili.com/357483440

本文参考链接:
https://carla.readthedocs.io/en/latest/nvidia_nurec/
https://huggingface.co/datasets/nvidia/PhysicalAI-Autonomous-Vehicles-NuRec
以上,本文完。