作者 | 张峻川, 编辑 | 李慢慢, 出品 | 车路漫漫
千呼万唤始出来!历时5年,CARLA终于提供了原生的鱼眼相机模型(Wide Angle Lens)!
目前CARLA文档中已经包含了鱼眼相机模型(Wide Angle Lens)的使用说明,绝大部分相关代码都可以从源代码仓库中观察到。(在这以前,CARLA一直没有支持大视角相机模型,网上虽然流传着一些网友自己开源的方法,但都存在着一些问题,比如我之前分享的方法,详见本链接,就存在接缝伪影的问题,非常影响仿真的效果)。本文将介绍CARLA中鱼眼相机模型的使用方法,关键代码的说明,展示鱼眼相机模型的仿真效果。
首先声明:确切来说,CARLA的鱼眼相机模型并不包含在其0.9.16稳定版里,从ue4-dev分支的commit历史可以看到,0.9.16版封版时间是2025年9月16日,但鱼眼相机模型的合入时间是9月18日,将将没有赶上。所以如果要等CARLA的稳定版也包含鱼眼相机模型,恐怕要等下一个UE4稳定版发布了。
现在尝试鱼眼相机模型的下载,需要在ue4-dev分支中拉取合适的版本,因此只能采用源码编译(build from source)的方式使用。
编译后使用make launch的方式运行CARLA的Server服务器,仓库代码中提供了名为manual_control_fisheye.py的client客户端代码,启动后就可以看到鱼眼相机模型的效果了。
示例代码manual_control_fisheye.py的命令行参数如下:
Hello from the pygame community. https://www.pygame.org/contribute.html
usage: manual_control_fisheye.py [-h] [-v] [--host H] [-p P] [-a] [--res WIDTHxHEIGHT] [--filter PATTERN] [--generation G] [--rolename NAME] [--gamma GAMMA] [--fov FOV] [--fov_mask] [--longitude_shift LONGITUDE_SHIFT] [--fov_fade_size FOV_FADE_SIZE] [--model MODEL]
[--k0 K0] [--k1 K1] [--k2 K2] [--k3 K3] [--equirectangular] [--perspective] [--sync]
CARLA Manual Control Client
options:
-h, --help show this help message and exit
-v, --verbose print debug information
--host H IP of the host server (default: 127.0.0.1)
-p P, --port P TCP port to listen to (default: 2000)
-a, --autopilot enable autopilot
--res WIDTHxHEIGHT window resolution (default: 1280x720)
--filter PATTERN actor filter (default: "vehicle.*")
--generation G restrict to certain actor generation (values: "1","2","All" - default: "2")
--rolename NAME actor role name (default: "hero")
--gamma GAMMA Gamma correction of the camera (default: 2.2)
--fov FOV Camera field of view angle (default: 90.0)
--fov_mask Wheter to draw pixels outside the FOV as black (default: "false").
--longitude_shift LONGITUDE_SHIFT
--fov_fade_size FOV_FADE_SIZE
--model MODEL Camera model (default: "perspective")
--k0 K0 k0 parameter for the Kannala-Brandt camera model (default: 0).
--k1 K1 k1 parameter for the Kannala-Brandt camera model (default: 0).
--k2 K2 k2 parameter for the Kannala-Brandt camera model (default: 0).
--k3 K3 k3 parameter for the Kannala-Brandt camera model (default: 0).
--equirectangular Determines whether image rectification will be applied (default: "false")
--perspective Determines whether image rectification will be applied (default: "false")
--sync Activate synchronous mode execution
其中各项参数的解读可以参考官方文档,如图1所示:
[图1]
manual_control_fisheye.py中可以看到使用Python API构建和调用鱼眼相机模型模型的方法,运行示例程序后可以从pygame窗口中直接看到鱼眼相机渲染效果,并切换不同的相机特效,如深度相机、分割相机等。以下是笔者参考真实鱼眼参数,给k0-k3赋值,渲染出的CARLA相机图像:
[图2]
说明:为与真实相机参数尽量对齐,本文中所附所有图像的分辨率都是1920x1536,超出笔者所用屏幕分辨率,因此鱼眼图像底边会出现被裁剪的现象。
此外,本文所有鱼眼图像选择fov_mask = True,即去除fov外的图像内容,且选择fov_fade_size等于默认的0。fov_fade_size的效果如下(fov_fade_size = 3.6):
[图3]
对于鱼眼相机来说,最重要的参数恐怕就是fov了,以下是不同fov下的图像效果对比:
[图4]
显然,随着fov的增大,可见的视野范围随之增大。
接下来对比不同的Lens畸变模型对图像的影响,以下图像均选用fov = 200的参数。 透视投影(perspective):
[图5]
可见对于200的大fov角度,简单的perspective模型已经不能正确投影图像了。
立体投影(stereographic):
[图6]
等距投影(equidistant):
[图7]
等立体角投影(equisolid):
[图8]
正交投影(orthographic):
[图9]
kannala-brandt自定义:(本图使用k0-k3的默认值)
[图10]
以上各个模型的具体畸变计算方法,读者可以参考官方的代码进行深层探索。
原生代码实现了在CARLA中模拟广角、鱼眼和大扭曲相机镜头的系统。为解决此问题,该模型实现采用了立方体贴图方法,具体解释如下:
传感器生成6个标准透视相机,指向所有方向(前、后、左、右、上、下),以捕获整个环境。
它使用一个计算着色器(Compute Shader),基于复杂的数学镜头模型(例如,Kannala-Brandt模型)对这6幅图像进行采样,并将它们拼接成一幅2D输出图像。
总结起来就是,首先对整个环境生成6张“照片”以捕获所有方向场景信息,然后在Shader中执行逆光路计算:对目标鱼眼图像中的每个像素,根据Lens畸变模型计算其光路向量,最终求出光路向量与开始的6张“照片”的交点位置,采样其rgb/深度/分割信息。
备注:由于需要采集6张”照片“,且在计算光路向量时需要迭代计算数值解,因此在相同分辨率下,CARLA的鱼眼相机渲染速度会低于普通相机渲染。笔者进行了简单对比,同样是1920x1536分辨率(使用RTX 3090主机运行CARLA server),普通相机server fps在20左右,换成鱼眼相机后,server的fps会降到10左右。
原生代码的c++结构,类层次结构:
AActor (Unreal)
└── ASensor (Carla)
└── ASceneCaptureSensor_WideAngleLens (管理立方体贴图与计算着色器)
├── ASceneCaptureCamera_WideAngleLens (RGB实现)
└── AShaderBasedSensor_WideAngleLens (非RGB传感器的基类)
├── ADepthCamera_WideAngleLens
├── ASemanticSegmentationCamera_WideAngleLens
└── AInstanceSegmentationCamera_WideAngleLens
着色器内容可详见 CameraModelCommon.ush,WideAngleLens.usf 等文件。
作者寄语:鱼眼相机在自动驾驶中主要用于环视,即获得车身360°近距离的图像信息,用于360全景/自动泊车/交通拥堵辅助等功能应用中,后续笔者也将基于此类功能展开仿真探索,欢迎各位小伙伴的持续关注与加入。
以上,本文完。