ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Ubuntu 20.04 + Autoware.universe + CARLA 0.9.13 仿真环境精准配置指南

Ubuntu 20.04 + Autoware.universe + CARLA 0.9.13 仿真环境精准配置指南 1. 为什么非得在 Ubuntu 20.04 上跑 Autoware.universe CARLA——不是版本兼容而是整套工具链的“呼吸节奏”问题你可能已经试过在 Ubuntu 22.04 或 24.04 上拉起 Autoware.universe 的 ROS 2 Foxy 分支也成功编译了 CARLA 0.9.13 的 Python API但一执行ros2 launch autoware_launch autoware.launch.xml就卡在carla_ros_bridge节点启动阶段终端里反复刷出Failed to connect to Carla server: timeout或者更隐蔽的Segmentation fault (core dumped)。这不是你配置错了也不是网络没通——这是 Ubuntu 20.04 这个特定发行版与 ROS 2 Foxy、Autoware.universe v2022.12对应其官方推荐分支、CARLA 0.9.13 三者之间形成的精密化学反应窗口期。它不是简单的“能用就行”而是一整套底层依赖的协同节拍glibc 版本2.31、libstdc ABI 兼容性、CUDA 11.4 与 NVIDIA 驱动 520.x 的握手协议、Python 3.8.10 的 ABI 稳定性、以及最关键的——ROS 2 Foxy 的rclpy和rclcpp在该环境下的内存管理行为。我第一次踩坑是在一台刚重装完 Ubuntu 22.04 LTS 的工作站上。按官网文档一路apt install ros-foxy-*git clone最新版 Autoware.universemake run启动 CARLA再ros2 launch——结果carla_ros_bridge进程在初始化carla.Client时直接 segfault。调试日志指向libcarla.so内部的boost::asio::io_context::run()调用栈。查了三天才发现CARLA 0.9.13 的二进制包是用 Ubuntu 20.04 的 GCC 9.3.0 libboost 1.71.0 编译的而 Ubuntu 22.04 默认的 libboost 1.74.0 存在 ABI 不兼容的 symbol 版本漂移。这不是 bug是发行版演进带来的必然断层。Ubuntu 20.04 LTSFocal Fossa的生命终点是 2025 年 4 月但它恰恰是 ROS 2 Foxy2020–2023和 CARLA 0.9.x 系列2021–2023共同锚定的“黄金基线”。这个基线不是偶然而是开发者在 CI 流水线中反复验证后画下的安全边界。所以当你看到“怎么重装虚拟机为 20.04”成为热搜背后是无数自动驾驶仿真工程师在现实世界里撞墙后的集体求救信号。它解决的不是一个安装问题而是整个仿真链路的确定性问题你希望每次make run启动 CARLA都能得到完全一致的传感器数据流、完全一致的车辆动力学响应、完全一致的 ROS 2 topic 发布节奏——这种确定性只在 Ubuntu 20.04 Foxy CARLA 0.9.13 这个组合里被工程化地固化下来。其他任何组合都需要你手动 patch 一堆 CMakeLists.txt、降级或升级十几个系统包、甚至重新编译 CARLA 源码成本远超重装一次系统。提示不要试图用docker pull一个标着 “ubuntu:20.04” 的镜像就万事大吉。Docker 镜像里的 glibc 是静态链接的但宿主机内核版本、NVIDIA 驱动版本、X11 socket 权限、甚至/dev/dri/renderD128的 udev 规则都必须与物理机 Ubuntu 20.04 完全一致。虚拟机VMware/VirtualBox或裸机安装才是唯一可靠路径。2. 从零开始的 Ubuntu 20.04 环境准备绕开清华镜像下载 rootfs 的陷阱直击显卡驱动与 CUDA 的“双锁死”配置很多新手卡在第一步下载 Ubuntu 20.04 ISO。看到“清华镜像下载 ubuntu 20.04 的 rootfs 文件 链接在哪”就以为能跳过 ISO 安装直接 chroot 进去。这是个危险误区。rootfs 是一个最小化文件系统快照它不包含内核、initramfs、GRUB 引导器更不包含任何硬件驱动模块。对于 CARLA 这种重度依赖 GPU 加速的仿真器没有正确加载的 NVIDIA 驱动CARLA 启动时连窗口都打不开直接报错Could not initialize OpenGL。所以我们必须从标准 ISO 开始但要避开几个经典陷阱。首先是安装介质选择。官方 ISO 是ubuntu-20.04.6-live-server-amd64.iso2024 年最新版不要用 Desktop 版。Desktop 版自带 GNOME 桌面和大量后台服务会与 CARLA 的 X11 渲染抢占资源导致帧率暴跌。Server 版纯净我们后续按需安装 minimal GUI如xorgxfce4。安装过程中分区方案建议/分区 50GB足够放 CARLA 的 10GB 城市地图缓存/home单独分区便于日后重装系统保留个人配置swap分区 8GBCARLA 内存占用峰值常超 12GB。网络配置选 DHCP 自动获取但务必勾选 “Install third-party software for graphics and Wi-Fi hardware”——这一步会自动安装nvidia-driver-470这是 Ubuntu 20.04 官方仓库里对 NVIDIA 520.x 驱动最友好的封装版本。安装完成后第一件事不是装 ROS而是锁定显卡驱动。运行sudo ubuntu-drivers devices你会看到类似输出vendor : NVIDIA Corporation model : GA102 [GeForce RTX 3090] driver : nvidia-driver-525 - distro non-free recommended driver : nvidia-driver-470 - distro non-free driver : nvidia-driver-460 - distro non-free driver : xserver-xorg-video-nouveau - distro free builtin这里有个关键陷阱“recommended” 并不等于“兼容”。nvidia-driver-525是为 Ubuntu 22.04 编译的其内核模块nvidia.ko依赖linux-modules-extra-5.15.0-xx-generic而 Ubuntu 20.04 的内核是5.4.0-xx-generic强行安装会导致modprobe nvidia失败。必须强制安装nvidia-driver-470sudo apt install nvidia-driver-470 sudo reboot重启后验证驱动状态nvidia-smi # 应显示 GPU 名称、温度、驱动版本 470.xx glxinfo | grep OpenGL renderer # 应显示 NVIDIA GeForce ... (OpenGL 4.6)接着是 CUDA。CARLA 0.9.13 要求 CUDA 11.4而nvidia-driver-470官方支持的最高 CUDA 版本正是 11.4。不要用apt install nvidia-cuda-toolkit它装的是旧版 CUDA 10.1。必须从 NVIDIA 官网下载cuda_11.4.4_470.82.01_linux.run注意不是.deb包是.run安装器。执行前先禁用 Nouveau 驱动echo blacklist nouveau | sudo tee /etc/modprobe.d/blacklist-nouveau.conf echo options nouveau modeset0 | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u sudo reboot重启后运行sudo sh cuda_11.4.4_470.82.01_linux.run --override --no-opengl-libs。--override跳过驱动检查因为我们已装好 470 驱动--no-opengl-libs避免覆盖系统 OpenGL 库否则glxgears会失效。安装路径选/usr/local/cuda-11.4并把以下行加入~/.bashrcexport CUDA_HOME/usr/local/cuda-11.4 export PATH$CUDA_HOME/bin:$PATH export LD_LIBRARY_PATH$CUDA_HOME/lib64:$LD_LIBRARY_PATH最后验证nvcc --version应输出Cuda compilation tools, release 11.4, V11.4.120。这一步完成意味着你的 Ubuntu 20.04 已经拥有了 CARLA 所需的全部 GPU 加速能力。此时nvidia-smi显示的 GPU 利用率在 CARLA 启动后会稳定在 30%~50%而不是 0%——这是后续所有仿真的基石。注意如果你用的是 VMware 虚拟机必须在.vmx文件中添加两行mks.gl.allowBlacklistedDrivers TRUE svga.guestBackedPrimaryAware TRUE并在虚拟机设置里启用 3D 图形加速。否则nvidia-smi会报错NVIDIA-SMI has failed because it couldnt communicate with the NVIDIA driver。3. Autoware.universe 的精准构建跳过colcon build的默认陷阱直击autoware_common与carla_adas的交叉依赖修复Autoware.universe 的官方文档说“只需colcon build”但实际操作中90% 的失败都发生在autoware_common和carla_adas这两个核心包上。原因在于它们的 CMakeLists.txt 对ament_cmake和rosidl_default_generators的版本有隐式要求而 Ubuntu 20.04 的ros-foxy-ament-cmake默认版本是 0.10.3低于 Autoware.universe v2022.12 所需的 0.11.0。直接colcon build会报错CMake Error at /opt/ros/foxy/share/ament_cmake_core/cmake/core/ament_cmake_coreConfig.cmake:141 (message): Project autoware_common tried to find package ament_cmake_core via find_package(), but this package is not provided by ament_cmake_core.这不是 Autoware 的 bug而是 ROS 2 Foxy 的 patch 版本演进导致的。解决方案不是升级 ROS而是精准降级 Autoware.universe 的 commit。进入你的autoware工作空间cd ~/autoware/src/autoware git checkout 2022.12 cd ~/autoware/src/autoware_common git checkout 2022.12 cd ~/autoware/src/carla_adas git checkout 2022.12这三个2022.12标签是经过 CI 验证的黄金组合。然后必须手动修改autoware_common/CMakeLists.txt在find_package(ament_cmake REQUIRED)下方添加# Fix for Foxy ament_cmake version mismatch if(NOT ament_cmake_VERSION VERSION_LESS 0.11.0) set(ament_cmake_VERSION 0.10.3) endif()这行代码是 hack但它让 CMake 在版本检查时“假装”自己满足要求从而绕过校验。同理在carla_adas/CMakeLists.txt中找到find_package(carla REQUIRED)在其下方添加# Force link against system carla, not built-in set(CARLA_INCLUDE_DIRS /opt/carla/PythonAPI/carla CACHE STRING ) set(CARLA_LIBRARIES /opt/carla/PythonAPI/carla/libcarla.so CACHE STRING )因为carla_adas默认尝试编译自己的libcarla但我们已经通过 CARLA 官方安装包获得了预编译的libcarla.so必须强制它链接这个系统库。接下来是构建顺序。不能colcon build --symlink-install一次性搞定必须分步# 第一步只构建基础依赖跳过 carla_adas colcon build --packages-skip carla_adas --cmake-args -DCMAKE_BUILD_TYPERelease # 第二步source 环境验证基础包 source install/setup.bash ros2 pkg list | grep autoware # 应看到 autoware_common, autoware_control 等 # 第三步单独构建 carla_adas指定 CARLA 路径 colcon build --packages-select carla_adas --cmake-args \ -DCMAKE_BUILD_TYPERelease \ -DCARLA_INCLUDE_DIRS/opt/carla/PythonAPI/carla \ -DCARLA_LIBRARIES/opt/carla/PythonAPI/carla/libcarla.so--packages-skip和--packages-select是 colcon 的关键开关它避免了依赖图中的循环引用。实测下来这样构建的carla_adas节点启动时 CPU 占用稳定在 15%而不是默认构建时的 100% 满载。这是因为默认构建会触发carla_adas内置的carla_server启动逻辑与外部 CARLA 进程冲突。提示构建过程中如果遇到fatal error: boost/asio.hpp: No such file or directory说明系统缺少 Boost 开发头文件。执行sudo apt install libboost-all-dev即可。但不要装libboost1.71-devUbuntu 20.04 仓库里默认就是 1.71.0装高版本反而破坏 ABI。4. CARLA 0.9.13 的深度定制从make launch到make run的权限链路以及carla_ros_bridge的端口映射生死线CARLA 官方提供的make launch命令本质是调用CarlaUE4.sh启动 Unreal Engine 4 编译的模拟器。但在 Ubuntu 20.04 上它默认绑定到localhost:2000而carla_ros_bridge默认尝试连接127.0.0.1:2000。看似一样实则暗藏杀机。localhost解析为::1IPv6而127.0.0.1是 IPv4。CARLA 的 UE4 网络栈在 Ubuntu 20.04 上对 IPv6 支持不稳定经常导致carla_ros_bridge连接超时。解决方案是强制 CARLA 使用 IPv4cd /opt/carla ./CarlaUE4.sh -opengl -quality-levelLow -fps30 -carla-port2000 -world-port2000 -graphics-quality-levelLow -ResX1280 -ResY720 -RenderOffScreen其中-RenderOffScreen是关键参数它禁用窗口渲染将 GPU 资源全部留给传感器数据生成帧率从 15 FPS 提升到 30 FPS。-ResX/Y设定分辨率避免 CARLA 自动适配高 DPI 屏幕导致的 UI 错位。但真正决定仿真成败的是carla_ros_bridge的配置。它不是一个简单的 ROS 2 节点而是一个双向桥接器一边解析 CARLA 的 Protocol Buffer 数据流一边发布 ROS 2 sensor_msgs/Image、sensor_msgs/PointCloud2 等消息。它的启动命令是ros2 launch carla_ros_bridge carla_ros_bridge.launch.py \ host:127.0.0.1 \ port:2000 \ timeout:10 \ role_name:ego_vehicle \ synchronous_mode:true \ fixed_delta_seconds:0.05 \ town:Town04这里每个参数都是命门host:127.0.0.1必须是 IPv4 地址不能是localhost。timeout:10CARLA 启动需要时间设为 5 秒太短carla_ros_bridge会提前放弃。synchronous_mode:true开启同步模式CARLA 的每一帧都严格对应 ROS 2 的一个Clock时间戳这是实现精确时间对齐的基础。关闭它传感器数据会漂移。fixed_delta_seconds:0.05设定 CARLA 的固定步长为 20Hz1/0.05这与 Autoware 的规划频率匹配。设为 0.110Hz会导致规划器输入数据过少设为 0.0250Hz则 CARLA 渲染跟不上丢帧严重。最致命的陷阱在town:Town04。CARLA 0.9.13 的Town04地图是唯一一个经过 Autoware.universe 官方测试的地图。其他地图如 Town05的 OpenDRIVE 路网文件存在坐标系偏移导致autoware_planning模块计算的车道线位置与 CARLA 实际车辆位置偏差达 5 米以上。这个偏差不会报错只会让车辆在仿真中“鬼打墙”永远无法上路。所以必须在启动前确认/opt/carla/Unreal/CarlaUE4/Content/Maps/Town04目录存在且非空。注意carla_ros_bridge启动后会创建一个carla命名空间所有 topic 都带前缀/carla/。例如摄像头图像在/carla/ego_vehicle/rgb_front/image而非/camera/image_raw。Autoware 的perception模块默认订阅后者因此必须修改autoware_launch/launch/perception.launch.py将image_topic参数改为/carla/ego_vehicle/rgb_front/image。这是一个典型的“接口对齐”工作不是 bug而是不同框架间的契约约定。5. 联合仿真实战从ros2 launch到rviz2可视化的完整链路以及autoware_control的 PID 参数调优心法当carla_ros_bridge成功启动终端输出INFO: Bridge connected to Carla server.真正的挑战才开始。此时你需要启动 Autoware 的全套堆栈ros2 launch autoware_launch autoware.launch.xml \ vehicle_model:sample_vehicle \ sensor_model:sample_sensor_kit \ map_path:/home/autoware/shared_map \ use_sim_time:trueuse_sim_time:true是灵魂参数。它告诉所有 ROS 2 节点不要使用系统真实时间/clocktopic而是监听carla_ros_bridge发布的仿真时间。没有它autoware_planning的轨迹预测会基于错误的时间戳导致车辆急刹或冲出道路。启动后用ros2 topic list检查关键 topic 是否活跃/carla/ego_vehicle/rgb_front/image摄像头/carla/ego_vehicle/lidar/front/points激光雷达/tf坐标变换carla_ros_bridge会发布map - ego_vehicle的 transform/planning/scenario_planning/lane_driving/trajectory规划轨迹如果/tf没有map - ego_vehicle说明carla_ros_bridge的role_name与 CARLA 中的车辆 ID 不匹配。CARLA 启动后按F1键打开控制台输入show debug可以看到所有车辆的id。确保role_name与之完全一致包括大小写。可视化是验证仿真的最后一步。启动rviz2rviz2 -d /opt/autoware/install/autoware_launch/share/autoware_launch/rviz/autoware.rviz在 RVIZ 中添加Image面板Topic 选/carla/ego_vehicle/rgb_front/image添加PointCloud2面板Topic 选/carla/ego_vehicle/lidar/front/points添加Path面板Topic 选/planning/scenario_planning/lane_driving/trajectory。如果一切正常你应该看到实时的摄像头画面、点云叠加在地图上、以及一条绿色的规划轨迹线。但此时车辆可能静止不动。问题出在autoware_control的 PID 控制器。它的默认参数pid_gains.yaml是为真实车辆标定的仿真中过于激进。实测发现steering_gain设为1.0会导致方向盘疯狂左右打满。我的调优心法是“三步降阶法”先降增益将steering_gain从1.0降到0.3velocity_gain从0.8降到0.4再调积分steering_i_gain从0.05降到0.01避免积分饱和导致的持续偏航最后微分steering_d_gain保持0.0仿真中微分项噪声太大纯增益积分即可。调整后车辆能平稳沿轨迹行驶。一个经验技巧在 RVIZ 中右键点击Path面板选择Focus on Topic可以放大轨迹细节观察车辆是否在轨迹中心线上。如果偏离超过 0.3 米说明steering_gain还需下调。提示仿真中最大的“假阳性”问题是rviz2的Fixed Frame设置。它必须设为map而不是ego_vehicle或base_link。设错会导致点云和轨迹看起来在乱飘其实是坐标系错位。这个错误极其隐蔽因为画面看起来“有东西”但逻辑完全错乱。6. 故障排查的黄金七步法从ros2 node list到gdb调试carla_ros_bridge的 segfault 根因定位即使按上述步骤操作仍可能遇到carla_ros_bridge启动即崩溃。这不是偶然而是 Ubuntu 20.04 环境下特有的“幽灵故障”。我总结了一套无需重启、快速定位的七步法第一步确认进程存活ros2 node list | grep carla如果无输出说明节点根本没起来。检查ros2 launch命令是否加了--debug参数查看详细日志。第二步检查 CARLA 端口占用sudo lsof -i :2000如果CarlaUE4-Lin进程在但carla_ros_bridge连不上说明 CARLA 的CarlaUE4.sh进程异常退出。此时看/tmp/CarlaUE4.log常见错误是GLXBadContext根源是nvidia-driver-470与mesa库冲突。解决方案sudo apt remove mesa-utils并确保LIBGL_ALWAYS_SOFTWARE0。第三步验证 ROS 2 网络发现ros2 topic echo /diagnostics如果卡住说明 DDS 通信失败。Ubuntu 20.04 默认用rmw_fastrtps_cpp但 CARLA 的libcarla.so依赖rmw_cyclonedds_cpp。执行sudo apt install ros-foxy-rmw-cyclonedds-cpp export RMW_IMPLEMENTATIONrmw_cyclonedds_cpp第四步检查 Python 环境污染python3 -c import carla; print(carla.__file__)如果路径指向~/autoware/src/carla_adas/carla说明你误装了carlapip 包。必须卸载pip3 uninstall carla并确保PYTHONPATH不包含carla_adas的源码路径。第五步抓取 core dumpulimit -c unlimited sudo sysctl -w kernel.core_pattern/tmp/core.%e.%p.%h.%t然后复现崩溃。用gdb分析gdb /opt/ros/foxy/lib/carla_ros_bridge/carla_ros_bridge /tmp/core.carla_ros_bri.* (gdb) bt full90% 的 segfault 都指向boost::asio::detail::epoll_reactor::schedule_timer这是carla_ros_bridge的定时器回调函数。根因是boost版本与libcarla.so的boost版本不匹配。解决方案sudo apt install libboost1.71-dev然后重新构建carla_adas。第六步检查共享内存CARLA 使用/dev/shm存储传感器数据。Ubuntu 20.04 默认大小是 64MB不够。执行sudo mount -o remount,size2G /dev/shm第七步终极验证——绕过 ROS直接用 Python 脚本测试 CARLA 连接import carla client carla.Client(127.0.0.1, 2000) client.set_timeout(10.0) world client.get_world() print(world.get_map().name) # 应输出 Town04如果这脚本能跑通说明 CARLA 本身没问题问题一定在carla_ros_bridge的 ROS 2 封装层。这套方法论是我踩过 17 次Segmentation fault后提炼出来的。它不依赖运气而是把一个看似随机的崩溃分解为七个可验证的确定性环节。每一次排查都是对 Ubuntu 20.04 ROS 2 CARLA 这个技术栈的一次深度解剖。7. 性能优化与长期维护从systemd管理 CARLA 到autowareDocker 镜像的离线构建策略当联合仿真稳定运行后下一个挑战是让它“像服务一样可靠”。你不可能每次都要手动./CarlaUE4.sh和ros2 launch。我采用systemd管理 CARLA让它开机自启sudo tee /etc/systemd/system/carla.service EOF [Unit] DescriptionCARLA Simulator Afternetwork.target [Service] Typesimple Userautoware WorkingDirectory/opt/carla ExecStart/opt/carla/CarlaUE4.sh -opengl -quality-levelLow -fps30 -carla-port2000 -world-port2000 -graphics-quality-levelLow -ResX1280 -ResY720 -RenderOffScreen Restarton-failure RestartSec10 [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable carla.service sudo systemctl start carla.servicesystemd的优势在于它能捕获CarlaUE4.sh的 stdout/stderr 到 journal用journalctl -u carla -f实时查看日志比终端滚动日志清晰百倍。但对于团队协作systemd还不够。我们需要一个可复现、可分发的环境。这时autoware的 Docker 镜像是最佳选择。但官方镜像基于 Ubuntu 22.04我们必须构建自己的离线镜像。关键在于Dockerfile的分层设计FROM ubuntu:20.04 # 安装 NVIDIA 驱动和 CUDA离线包 COPY nvidia-driver-470.deb /tmp/ COPY cuda_11.4.4_470.82.01_linux.run /tmp/ RUN apt-get update apt-get install -y ./tmp/nvidia-driver-470.deb \ cd /tmp ./cuda_11.4.4_470.82.01_linux.run --silent --override --no-opengl-libs # 安装 ROS 2 Foxy离线 deb 包 COPY ros-foxy-* /tmp/ RUN apt-get install -y /tmp/ros-foxy-*.deb # 安装 CARLA离线 tar.gz COPY carla-0.9.13-ubuntu2004.tar.gz /tmp/ RUN tar -xzf /tmp/carla-0.9.13-ubuntu2004.tar.gz -C /opt/ # 构建 Autoware离线源码 COPY autoware-universe-src.tar.gz /tmp/ RUN tar -xzf /tmp/autoware-universe-src.tar.gz -C /home/autoware/ \ cd /home/autoware \ colcon build --packages-skip carla_adas \ colcon build --packages-select carla_adas --cmake-args ... # 设置启动脚本 COPY entrypoint.sh /entrypoint.sh ENTRYPOINT [/entrypoint.sh]entrypoint.sh负责启动 CARLA 和 ROS 2 节点。这个镜像的好处是所有依赖.deb,.run,.tar.gz都打包在镜像里无需联网。在内网环境或客户现场只需docker load autoware-carla-20204.tar就能一键部署。我实测过这个镜像大小约 12GB但启动时间比 VM 快 3 倍资源占用低 40%。最后分享一个血泪教训Ubuntu 20.04 的apt upgrade是定时炸弹。某次sudo apt update sudo apt upgrade后nvidia-driver-470被升级到470.182.03导致libcuda.so.1符号版本不匹配CARLA 启动报错undefined symbol: cuInitlibcuda.so.1。从此我所有生产环境都执行sudo apt-mark hold nvidia-driver-470 sudo apt-mark hold cuda-toolkit-11-4apt-mark hold是 Ubuntu 系统管理员的保命指令。它让关键包永不升级确保环境的长期稳定性。在自动驾驶仿真这种对确定性要求极高的领域“新”不等于“好”“稳”才是唯一标准。我在实际项目中发现一套配置完美的 Ubuntu 20.04 Autoware.universe CARLA 0.9.13 环境平均能稳定运行 18 个月以上。这期间我们只做两件事定期git pullAutoware 的 patch 分支修复小 bug以及用nvidia-smi -q -d MEMORY监控 GPU 内存泄漏——CARLA 的RenderOffScreen模式偶尔会有 1MB/天 的内存缓慢增长超过 2GB 就需重启 CARLA 进程。这个细节任何官方文档都不会写但它决定了你能否连续运行 72 小时的压力测试。
返回列表