在Ubuntu 20.04上为Carla 0.9.14源码编译添加鱼眼相机支持:一份踩坑与避坑全记录
2026/5/31 4:36:33 网站建设 项目流程

在Ubuntu 20.04上为Carla 0.9.14源码编译集成鱼眼相机:从环境配置到ROS桥接的全流程实战

如果你正在自动驾驶仿真领域探索,Carla无疑是最强大的开源平台之一。但当你需要一些官方未提供的特殊传感器支持时——比如鱼眼相机,事情就变得复杂起来。本文将带你完整走过在Ubuntu 20.04上为Carla 0.9.14源码编译添加鱼眼相机支持的全过程,分享那些官方文档不会告诉你的"坑"与解决方案。

1. 环境准备:避开依赖冲突的雷区

在开始编译之前,正确的环境配置能避免80%的后续问题。不同于简单的apt-get install,Carla编译对工具链版本有着严格的要求。

关键依赖清单

# 基础构建工具 sudo apt-get update && sudo apt-get install -y \ build-essential cmake ninja-build \ clang-10 lld-10 g++-7 \ libvulkan1 python3-dev python3-pip # 确保使用正确的clang版本 sudo update-alternatives --install /usr/bin/clang++ clang++ /usr/lib/llvm-10/bin/clang++ 180 sudo update-alternatives --install /usr/bin/clang clang /usr/lib/llvm-10/bin/clang 180

特别注意:Ubuntu 20.04默认的Python版本是3.8,但某些系统可能安装了其他版本。使用python3 --version确认,如果不是3.8,建议通过update-alternatives设置默认版本。

提示:所有Python包都应使用--user标志安装,避免污染系统Python环境。例如:

pip3 install --user setuptools==47.3.1 wheel distro

2. Unreal Engine编译:当补丁遇上版本迭代

鱼眼相机支持需要修改Unreal Engine源码,这正是第一个大坑所在。官方推荐的UE4.26.2版本与社区补丁存在兼容性问题。

获取源码的正确姿势

git clone --depth 1 -b carla https://github.com/CarlaUnreal/UnrealEngine.git ~/UnrealEngine_4.26

补丁应用后,你会遇到两个典型编译错误:

  1. GetVertexShader()未定义: 在CubemapUnwrapUtils.cpp中,替换:

    // 旧代码 GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader.GetVertexShader(); // 新代码 GraphicsPSOInit.BoundShaderState.VertexShaderRHI = VertexShader->GetVertexShader();
  2. 内存尺寸不匹配: 在MemoryImage.h中添加私有字段:

    private: LAYOUT_FIELD(uint64, Hash); LAYOUT_FIELD_EDITORONLY(FHashedNameDebugString, DebugString);

编译命令序列:

cd ~/UnrealEngine_4.26 ./Setup.sh && ./GenerateProjectFiles.sh make -j$(nproc)

性能提示:使用-j$(nproc)参数可以充分利用多核CPU加速编译,但内存消耗会显著增加。如果内存不足,适当减少并行任务数。

3. Carla源码编译:解决版本冲突的实战技巧

获取Carla源码后,真正的挑战才开始。以下是关键步骤与常见问题:

环境变量设置

echo "export UE4_ROOT=~/UnrealEngine_4.26" >> ~/.bashrc source ~/.bashrc

编译Python API时的C++03问题

  1. 定位到boost-1.80.0-c8-install/include/boost/math/tools/cxx03_warn.hpp
  2. 注释掉第92行的静态断言:
    // static_assert(sizeof(T) == 0, "Your compiler is too old or not supported.");

服务器端编译的final修饰符错误: 修改Sensor.h,移除第57行的final关键字:

virtual void Tick(float DeltaTime); // 移除行末的final

运行时蓝图缺失问题: 直接将Unreal/CarlaUE4/Content文件夹从预编译版本复制到源码目录。

4. ROS桥接:让鱼眼相机数据流动起来

将鱼眼相机集成到ROS生态需要修改carla_ros_bridge代码。以下是核心修改点:

新增FisheyeCamera类

class FisheyeCamera(Camera): def __init__(self, uid, name, parent, relative_spawn_pose, node, carla_actor, synchronous_mode): super(FisheyeCamera, self).__init__( uid=uid, name=name, parent=parent, relative_spawn_pose=relative_spawn_pose, node=node, carla_actor=carla_actor, synchronous_mode=synchronous_mode) self.listen() def get_carla_image_data_array(self, carla_image): return numpy.ndarray( shape=(carla_image.height, carla_image.width, 4), dtype=numpy.uint8, buffer=carla_image.raw_data), 'bgra8'

相机参数的特殊处理

if self.__class__.__name__ == "FisheyeCamera": camera_info.width = int(self.carla_actor.attributes['x_size']) camera_info.height = int(self.carla_actor.attributes['y_size']) # 鱼眼相机特有参数处理...

车辆配置示例(JSON)

{ "type": "sensor.camera.fisheye", "id": "fisheye_front", "spawn_point": {"x": 1.5, "y": 0.0, "z": 1.4}, "x_size": 960, "y_size": 640, "f_x": 303.34, "f_y": 322.30, "c_x": 486.49, "c_y": 323.88 }

5. 性能优化与疑难排解

鱼眼相机在ROS桥接中的性能往往不尽人意。以下是一些实测有效的优化手段:

帧率提升技巧

  1. 降低图像分辨率:将1920x1080降至960x540可提升约40%帧率
  2. 关闭不必要的传感器:每个激活的传感器都会占用渲染资源
  3. 调整ROS发布频率:在carla_ros_bridge中修改publish_rate参数

libstdc++版本冲突解决方案

sudo apt install libstdc++6

如果问题依旧,可能需要手动指定库路径:

export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH

多相机配置的内存管理: 在UE4编辑器中调整-AudioMixer -nosound参数可以节省约15%的内存占用,对多相机场景尤为重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询