当前位置: 首页 > news >正文

Ubuntu 20.04部署CARLA 0.9.14:从打包版快速体验到编译版深度定制

1. 项目概述:为什么选择在Ubuntu 20.04上部署CARLA 0.9.14?

如果你正在涉足自动驾驶仿真、机器人感知算法测试,或者单纯想体验一下电影里那种逼真的虚拟城市驾驶环境,那么CARLA绝对是你绕不开的一个名字。作为一个开源的自动驾驶仿真平台,它提供了从传感器模拟、交通流控制到天气系统在内的一整套高保真环境。我选择Ubuntu 20.04和CARLA 0.9.14这个组合,背后有几个很实际的考量。首先,Ubuntu 20.04 LTS是一个长期支持版本,系统稳定,社区支持完善,对于需要长期运行仿真实验的环境来说,稳定压倒一切。其次,CARLA 0.9.14是一个承上启下的重要版本,它在渲染保真度、传感器模型和Python API的成熟度上达到了一个很好的平衡,既不像早期版本功能缺失,也不像某些新版本对硬件要求过于苛刻或存在未知的兼容性问题。

这次部署的核心目标很明确:快速上手,并具备深度定制的能力。这对应着两种主流的部署方式:打包版(预编译版)编译版(源码版)。打包版就像你从软件商店下载的应用程序,解压即用,适合快速验证想法、跑通官方示例和进行算法原型测试。而编译版则需要你从源代码开始,自己动手构建整个项目,这过程虽然繁琐,但带来的好处是巨大的——你可以修改引擎底层、添加自定义传感器、集成新的地图,甚至调整物理参数,真正将CARLA变成你自己的研究工具。很多人在初次接触时,可能会被编译版的复杂依赖和漫长的编译时间劝退,但相信我,一旦你掌握了从打包版平滑过渡到编译版的完整路径,你对这个仿真平台的理解和控制力将完全不在一个层次上。接下来,我会带你走通这条从“开箱即用”到“深度掌控”的完整路径,分享我踩过的每一个坑和总结出来的最佳实践。

2. 环境准备与前置条件检查

在开始安装任何软件之前,打好地基是成功的一半。对于CARLA部署,这个“地基”就是你的Ubuntu系统环境。很多人部署失败,问题往往不是出在CARLA本身,而是前置依赖没装对、没装全。

2.1 系统与硬件要求

首先,确认你的系统是Ubuntu 20.04.6 LTS。你可以通过lsb_release -a命令查看。虽然理论上18.04或22.04也可能成功,但20.04是CARLA官方文档明确测试和支持的版本,能帮你避开大量未知的兼容性雷区。

硬件是另一个硬性门槛。CARLA是一个基于Unreal Engine的图形密集型应用,对显卡有较高要求:

  • GPU:必须是一块独立的NVIDIA显卡。集成显卡(包括Intel核显和AMD集显)完全无法运行。建议是GTX 1070 / RTX 2060或更高性能的显卡,以确保流畅运行。
  • 显存:至少4GB,6GB或以上更为理想。高分辨率、多传感器同时渲染会消耗大量显存。
  • 内存:建议16GB以上。编译Unreal Engine时,内存消耗巨大。
  • 存储空间:你需要为CARLA预留至少100GB的可用磁盘空间。其中,打包版大约占30GB,而编译Unreal Engine和CARLA源码,轻松会占用70GB以上。

2.2 安装NVIDIA显卡驱动

这是最关键的一步,驱动版本不对,后面一切白费。Ubuntu 20.04自带的nouveau开源驱动无法支持CARLA所需的图形计算。

推荐方法:使用系统自带的“附加驱动”工具这是最稳妥、最不容易出问题的方法。

  1. 打开“软件和更新”应用。
  2. 切换到“附加驱动”标签页。
  3. 系统会自动检测你的NVIDIA显卡,并列出可用的专有驱动版本。
  4. 选择一个带有“proprietary, tested”标识的版本,例如nvidia-driver-535。这个版本是经过Ubuntu官方测试的,与系统内核兼容性最好。不要盲目追求最新版本,新驱动可能带来未知问题。
  5. 点击“应用更改”,输入密码,等待安装完成并重启系统。

重启后,打开终端,运行nvidia-smi。如果能看到显卡信息、驱动版本和CUDA版本(例如CUDA 12.2),说明驱动安装成功。这里显示的CUDA版本是驱动内嵌的运行时库版本,我们后续安装的CUDA Toolkit版本需要与之兼容。

2.3 安装依赖库

CARLA的运行和编译依赖大量的系统库和开发工具。一次性安装可以避免后续编译时频繁报错。

打开终端,执行以下命令更新软件源并安装基础编译工具和关键库:

sudo apt update sudo apt upgrade -y # 安装基础编译工具链 sudo apt install build-essential cmake clang-8 lld-8 g++-7 -y # 安装Unreal Engine和CARLA所需的依赖 sudo apt install libvulkan1 python3-pip python3-dev python3-opencv -y sudo apt install libomp-dev libpng-dev libtiff5-dev libjpeg-dev -y sudo apt install wget software-properties-common gnupg2 -y # 安装图形和窗口系统相关库 sudo apt install xorg-dev libglu1-mesa-dev freeglut3-dev mesa-common-dev -y

注意clang-8lld-8是Unreal Engine 4.26(CARLA 0.9.14使用的引擎版本)指定的编译工具链。使用系统默认的gcc或更高版本的clang可能会导致编译失败。

2.4 安装特定版本的CMake和Python环境

CARLA 0.9.14的Python API客户端主要兼容Python 3.7/3.8。Ubuntu 20.04默认的Python 3.8正好合适,我们不需要额外安装其他版本。

但是,CMake的版本至关重要。Ubuntu 20.04默认仓库的CMake版本(3.16)可能偏低,而编译某些依赖(如rpclib)需要更高版本。建议安装3.22或以上版本。

# 卸载旧版本cmake(如果有) sudo apt remove --purge cmake -y # 下载并安装指定版本的CMake wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ focal main' sudo apt update sudo apt install cmake -y cmake --version # 确认版本号 >= 3.22

接下来,为CARLA的Python API创建一个干净的虚拟环境是个好习惯,可以避免包冲突。

# 安装虚拟环境管理工具 sudo apt install python3-venv -y # 创建一个名为carla的虚拟环境,位置可以自定义,比如在/home/你的用户名下 cd ~ python3 -m venv carla-venv # 激活虚拟环境 source ~/carla-venv/bin/activate # 激活后,命令行提示符前会出现 (carla-venv) # 升级pip并安装CARLA Python API的核心依赖 pip install --upgrade pip pip install numpy pygame networkx opencv-python

至此,你的系统基础环境已经准备就绪。我们可以先通过打包版快速进入CARLA的世界,感受一下它的魅力。

3. 打包版部署:五分钟快速体验CARLA世界

打包版是体验CARLA最快的方式,它包含了预编译好的Unreal Engine项目、所有资产和Python API。你不需要编译任何东西,下载、解压、运行,一气呵成。

3.1 下载与解压

CARLA的打包版发布在GitHub的Release页面。由于文件很大(约30GB),建议使用wget命令在终端中下载,这样支持断点续传,比浏览器下载更稳定。

# 进入一个空间充足的目录,例如/home/你的用户名/Software cd ~/Software # 使用wget下载CARLA 0.9.14的打包版 wget https://github.com/carla-simulator/carla/releases/download/0.9.14/CARLA_0.9.14.tar.gz # 下载完成后解压 tar -xzvf CARLA_0.9.14.tar.gz

解压后会得到一个名为CARLA_0.9.14的目录,里面包含了运行所需的一切。

3.2 运行服务器与客户端

CARLA采用客户端-服务器架构。服务器(Server)负责运行仿真世界,客户端(Client)通过Python脚本与服务器通信,控制车辆、获取传感器数据等。

第一步:启动服务器在终端中,进入解压目录,直接运行启动脚本。

cd ~/Software/CARLA_0.9.14 ./CarlaUE4.sh

第一次运行会有一个着色器编译的过程,需要等待几分钟。之后,一个Unreal Engine的编辑器窗口会打开,并加载Town地图。这个窗口就是CARLA服务器。不要关闭这个窗口,最小化即可。

第二步:运行Python客户端示例打开另一个终端窗口,我们需要在之前创建的虚拟环境中运行示例脚本。

# 激活虚拟环境 source ~/carla-venv/bin/activate # 设置Python路径,让解释器能找到CARLA自带的Python模块 export PYTHONPATH=$PYTHONPATH:~/Software/CARLA_0.9.14/PythonAPI/carla/dist/carla-0.9.14-py3.8-linux-x86_64.egg # 进入示例脚本目录 cd ~/Software/CARLA_0.9.14/PythonAPI/examples # 运行一个简单的自动巡航示例 python3 automatic_control.py

如果一切顺利,你将看到服务器窗口中的场景里出现一辆车,并在小镇中自动行驶。客户端终端会打印车辆的控制信息和传感器数据(如果示例脚本开启了传感器)。恭喜你,你已经成功运行了CARLA!

3.3 打包版的使用限制与注意事项

打包版虽然方便,但有其局限性:

  1. 无法修改核心内容:你不能修改地图、添加新的蓝图(如特殊车辆或传感器)、或者调整Unreal Engine的渲染和物理参数。
  2. Python API功能受限:一些高级的API,特别是与场景生成、批处理仿真相关的接口,可能在打包版中无法使用或存在限制。
  3. 资源路径固定:所有资产路径都是硬编码的,如果你想集成自己的3D模型或地图,会非常困难。

实操心得:打包版最适合用于学习和初步算法验证。例如,测试你的目标检测算法在CARLA虚拟摄像头下的表现,或者熟悉Python API的基本用法。在运行示例时,如果遇到ImportError: No module named 'carla',请务必检查PYTHONPATH环境变量是否设置正确,并且确认你激活的虚拟环境中的Python版本是3.8。另一个常见问题是服务器启动后客户端连接超时,请检查是否有防火墙阻止了端口(默认2000/TCP, 2001/TCP),并确保客户端脚本中指定的服务器IP和端口(默认localhost:2000)是正确的。

4. 编译版部署:从源码构建你的专属仿真器

当你需要修改CARLA、添加自定义功能,或者进行大规模的自动化仿真实验时,编译版是唯一的选择。这个过程分为两大核心部分:编译Unreal Engine 4.26编译CARLA源码

4.1 获取并编译Unreal Engine 4.26

CARLA 0.9.14严格依赖Unreal Engine 4.26。你必须使用这个特定版本,不能使用Epic Games启动器安装的默认版本或其他版本。

第一步:注册Epic Games账户并关联GitHub

  1. 访问 Epic Games开发者门户 注册一个账户。
  2. 在账户设置中,将你的GitHub账户与之关联。
  3. 接受Unreal Engine的许可协议。

第二步:克隆Unreal Engine仓库并切换分支我们将使用Epic官方推荐的克隆方式。

# 创建一个目录用于存放UE4源码,需要极大空间 cd ~ mkdir -p UnrealEngine_4.26 cd UnrealEngine_4.26 # 克隆UE4仓库(速度可能较慢,请耐心等待) git clone https://github.com/EpicGames/UnrealEngine.git -b 4.26 . # 注意:-b 4.26 指定了分支,最后的 . 表示克隆到当前目录

第三步:编译Unreal Engine这是最耗时的一步,可能需要数小时,取决于你的CPU核心数和磁盘速度。

# 运行安装脚本,下载必要的依赖 ./Setup.sh # 生成编译所需的Makefile等文件 ./GenerateProjectFiles.sh # 开始编译!使用 make 命令,-j 参数指定并行编译的作业数,通常设为CPU核心数,可以显著加快速度。 # 例如,8核CPU:make -j8 make -j$(nproc)

编译过程中请保持网络连接稳定。如果中途失败,通常是因为依赖缺失或内存不足。可以尝试先运行make而不加-j参数进行单线程编译,虽然慢但更容易定位错误。编译成功后,你会在~/UnrealEngine_4.26/Engine/Binaries/Linux/目录下找到UnrealEditor等可执行文件。

踩坑记录:编译UE4最常见的错误是内存不足(Out of Memory)。如果机器内存小于32GB,强烈建议在开始make之前,创建一个足够大的交换文件(swapfile)

sudo fallocate -l 16G /swapfile # 创建16GB的交换文件 sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile # 可以通过 `free -h` 命令确认swap已生效

编译完成后,可以关闭交换文件:sudo swapoff /swapfile && sudo rm /swapfile

4.2 获取并编译CARLA源码

有了UE4.26,我们现在可以编译CARLA本身了。

第一步:克隆CARLA仓库并获取资产

cd ~ git clone https://github.com/carla-simulator/carla.git cd carla # 切换到0.9.14标签 git checkout tags/0.9.14 # 获取CARLA所需的额外资源(地图、车辆模型等),这是一个非常大的下载 ./Update.sh

Update.sh脚本会下载大约20GB的资产文件到Import目录,请确保磁盘空间充足。

第二步:设置环境变量告诉构建系统你的UE4根目录在哪里。

export UE4_ROOT=~/UnrealEngine_4.26

第三步:编译CARLA客户端与服务器CARLA的编译使用一个自定义的Makefile

# 清理之前的构建(如果是第一次可跳过) make clean # 编译CARLA客户端库(Python API所依赖的C++库) make PythonAPI # 编译CARLA服务器(Unreal Engine项目) make launch

make launch会编译Unreal项目,并最终启动编辑器。第一次编译同样需要很长时间。成功后,Unreal Engine编辑器会打开,并加载CARLA项目。

第四步:打包编译成果(可选但推荐)在编辑器里运行没问题后,我们可以将其打包成一个独立的可分发版本,类似于我们之前下载的打包版,但这是基于你编译的源码。

# 在CARLA源码目录下 make package

这个命令会在./Dist目录下生成一个CARLA_0.9.14的打包文件夹。你可以将这个文件夹复制到任何地方运行,无需再次编译。

4.3 编译版的核心优势与定制入门

编译版赋予了你“上帝视角”般的控制权:

  • 修改地图:你可以用Unreal Editor打开Unreal/CarlaUE4/Content/Carla/Maps/下的地图文件(.umap),随意添加、删除建筑、道路、植被。
  • 创建自定义蓝图:在Content/Carla/Blueprints/下,你可以复制现有的车辆或传感器蓝图,修改其属性(如碰撞体、网格模型、传感器参数),创造出全新的智能体。
  • 修改C++源码:如果你需要改变仿真核心逻辑,比如车辆动力学模型、天气系统算法或通信协议,可以直接修改LibCarla/source/carla/下的C++代码,然后重新执行make PythonAPImake launch

一个简单的定制例子:添加一个简单的路标。

  1. 在Unreal Editor中运行编译好的项目(通过make launch启动)。
  2. 在内容浏览器中,找到Carla/Static/Props/Traffic下的一个路标静态网格体。
  3. 将其拖拽到地图视口中,放置到路边。
  4. 保存地图。现在,这个新路标就成为了你仿真世界的一部分,传感器可以检测到它。

深度定制心得:修改C++代码是最高级的定制。例如,如果你想在carla::sensor::data::Image数据结构中加入时间戳字段。你需要:

  1. 修改LibCarla/source/carla/sensor/data/Image.h头文件。
  2. 修改对应的序列化/反序列化代码(可能在s11n目录下)。
  3. 重新编译make PythonAPI。这会重新生成Python绑定(.egg文件)。
  4. 在Python客户端中,你就可以从图像数据里读取到这个自定义的时间戳了。这个过程需要对CARLA的源码结构有一定的了解,建议从阅读官方文档和源码注释开始。

5. Python API深度使用与自动化实践

无论是打包版还是编译版,我们与CARLA交互的主要桥梁都是Python API。掌握API的深度用法,是实现自动化测试和复杂实验的关键。

5.1 核心对象与生命周期管理

CARLA Python API的核心对象包括:

  • World:仿真的世界,包含地图、天气、所有演员(Actor)的引用。
  • Blueprint:演员的模板,定义了演员的属性(如车型、传感器类型)。
  • Actor:世界中任何可以放置的物体,如车辆、行人、传感器、交通标志。车辆和传感器本身也是Actor。
  • Sensor:一种特殊的Actor,用于收集数据(如相机、激光雷达、雷达)。
  • Transform:描述Actor在三维空间中的位置(Location)和旋转(Rotation)。

一个健壮的客户端脚本应该妥善管理这些对象的生命周期:

import carla import random client = carla.Client('localhost', 2000) client.set_timeout(10.0) # 设置连接超时 world = client.get_world() blueprint_library = world.get_blueprint_library() # 1. 生成车辆 vehicle_bp = random.choice(blueprint_library.filter('vehicle.*')) spawn_point = random.choice(world.get_map().get_spawn_points()) vehicle = world.spawn_actor(vehicle_bp, spawn_point) # 2. 为车辆添加一个摄像头传感器 camera_bp = blueprint_library.find('sensor.camera.rgb') camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4)) # 安装在车辆前方上方 camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle) # 3. 定义传感器回调函数,用于处理每一帧数据 def camera_callback(image): # 将图像数据转换为numpy数组 array = np.frombuffer(image.raw_data, dtype=np.uint8) array = array.reshape((image.height, image.width, 4)) # BGRA格式 array = array[:, :, :3] # 去掉Alpha通道,变为BGR array = array[:, :, ::-1] # BGR -> RGB # 这里可以保存图像或进行实时处理 cv2.imshow('Camera', array) cv2.waitKey(1) # 4. 监听传感器数据 camera.listen(camera_callback) # ... 运行你的仿真逻辑,例如让车辆自动驾驶一段路 ... # 5. 【重要】销毁Actor,释放资源 camera.stop() camera.destroy() vehicle.destroy() print('所有Actor已清理。')

5.2 同步模式与数据收集

默认情况下,CARLA服务器运行在异步模式,它按照自己的节奏更新世界,客户端随时可以发送请求。这对于交互式操作很方便,但对于需要严格对齐多传感器数据帧的机器学习训练来说,这是灾难性的。因为你的摄像头帧和激光雷达帧可能不是在同一仿真时刻捕获的。

同步模式强制服务器等待客户端发送“下一帧”的指令,从而确保所有传感器数据在同一时间戳被捕获。

# 设置同步模式 settings = world.get_settings() settings.synchronous_mode = True # 启用同步模式 settings.fixed_delta_seconds = 0.05 # 设置每帧的仿真时间步长(20 FPS) world.apply_settings(settings) # 在同步模式下,必须由客户端驱动仿真 camera.listen(lambda image: queue.put(image)) # 将图像放入队列 for _ in range(100): # 仿真100帧 world.tick() # 发送“下一帧”指令 # 此时,所有传感器的回调函数都会被触发,数据对应于同一仿真时刻 image = queue.get() # 处理图像...

性能与稳定性技巧:同步模式对性能有较大影响,且如果客户端处理过慢导致world.tick()调用不及时,仿真会“卡住”。务必确保你的数据处理流水线足够高效,或者使用多线程/异步IO来处理传感器数据。另一个常见问题是内存泄漏,长时间运行后,即使销毁了Actor,Unreal Engine端可能仍有残留。定期(例如每运行1000次实验)完全重启CARLA服务器是保持稳定的土办法但有效。

5.3 构建自动化仿真流水线

对于大规模算法测试(如训练感知模型),你需要一个自动化的流水线。其核心思想是:编写一个脚本,自动地、循环地执行“设置场景 -> 运行仿真 -> 收集数据 -> 重置场景”的过程。

def run_one_episode(world, episode_id): """运行一个仿真片段(episode)""" # 1. 重置世界:清理上一轮的所有Actor actors = world.get_actors() for actor in actors: if actor.type_id.startswith('vehicle.') or actor.type_id.startswith('sensor.'): actor.destroy() # 2. 设置场景:随机生成车辆、行人、天气 weather = random.choice([carla.WeatherParameters.ClearNoon, carla.WeatherParameters.WetCloudyNoon]) world.set_weather(weather) # ... 生成主控车辆、其他交通车辆、行人 ... # 3. 添加传感器并启动数据记录 sensor_list = [] # ... 创建并安装摄像头、激光雷达等传感器,绑定数据保存回调 ... # 4. 运行仿真:让主控车辆由AI或简单控制器驾驶一段距离/时间 for frame in range(500): # 仿真500帧 world.tick() # 同步模式下 # 控制车辆... # 可以在这里检查是否发生碰撞等终止条件 if has_collided(vehicle): break # 5. 清理并返回数据 for sensor in sensor_list: sensor.stop() sensor.destroy() # 返回本episode收集的数据路径或元信息 return {'episode_id': episode_id, 'data_path': '...', 'weather': str(weather)} # 主循环 for i in range(1000): print(f'开始第 {i} 个episode...') episode_result = run_one_episode(world, i) # 将结果记录到日志或数据库 log_episode(episode_result)

这个流水线可以部署到高性能服务器上,7x24小时不间断运行,批量生成用于训练和测试的仿真数据。

6. 常见问题排查与性能优化指南

即使按照步骤操作,你也可能会遇到各种问题。这里汇总了一些高频问题和解决方案。

6.1 部署与编译问题排查表

问题现象可能原因解决方案
运行./CarlaUE4.sh报错:./CarlaUE4.sh: error while loading shared libraries: libvulkan.so.1: cannot open shared object fileVulkan图形库未安装。运行sudo apt install libvulkan1
编译UE4时make失败,提示virtual memory exhausted: Cannot allocate memory物理内存和交换空间不足。按照前文指导创建大型交换文件(16GB+)。
编译CARLA时make PythonAPI失败,提示cmakeclang相关错误。CMake版本过低或编译工具链不对。确保安装了CMake 3.22+,并使用clang-8lld-8。检查UE4_ROOT环境变量是否正确指向UE4.26源码目录。
Python客户端连接超时:timeout: error: [Errno 110] Connection timed out服务器未启动,或防火墙阻止,或端口被占用。1. 确认./CarlaUE4.sh已成功启动并加载完地图。
2. 检查客户端脚本中的IP和端口(默认localhost:2000)。
3. 运行 `netstat -tlnp
导入carla模块失败:ImportError: No module named 'carla'Python路径未设置正确。对于打包版,设置PYTHONPATH.egg文件。对于编译版,确保在虚拟环境中运行,并且make PythonAPI成功执行(会在PythonAPI/carla/dist/下生成新的.egg文件)。
服务器窗口黑屏或闪退显卡驱动问题,或OpenGL/Vulkan兼容性问题。1. 用nvidia-smi确认驱动已加载。
2. 尝试以-opengl-vulkan后端启动:./CarlaUE4.sh -opengl
3. 可能是显存不足,尝试在较低画质设置下运行。

6.2 运行时性能优化技巧

CARLA是资源消耗大户,优化性能可以提升实验效率。

  1. 服务器启动参数

    • -quality-level=Low:将图形质量设置为低。这是提升帧率最有效的方法,对许多算法测试来说,视觉保真度可以牺牲。
    • -carla-server -fps=20:以无渲染的“服务器模式”运行,不打开图形窗口,并通过-fps限制最大仿真频率。这能极大节省GPU资源,适用于纯数据生成的“无头模式”运行。
    • -windowed -ResX=800 -ResY=600:以窗口模式和小分辨率运行,减少渲染负载。
  2. 客户端优化

    • 减少不必要的传感器:每个传感器(尤其是摄像头和激光雷达)都会带来额外的渲染和数据传输开销。只启用实验必需的传感器。
    • 降低传感器分辨率/频率:将相机分辨率从800x600降到320x240,将激光雷达的通道数(channels)从64降到32,将传感器的频率(fps)从20降到10,都能显著减轻负担。
    • 使用try-except和超时:网络通信可能不稳定,在发送RPC命令时使用client.set_timeout()并包裹try-except块,避免脚本因单次请求失败而崩溃。
    • 批量操作:使用client.apply_batch([carla.command])一次性执行多个生成或销毁命令,比循环调用单次命令效率高得多。
  3. 系统层面

    • 关闭不必要的桌面特效和后台应用。
    • 在BIOS中确保CPU运行在性能模式。
    • 对于数据生成任务,考虑在无图形界面的Ubuntu Server系统上运行,资源利用率更高。

从打包版快速体验到编译版深度定制,这条路径虽然前期投入的学习和配置成本较高,但它为你打开了一扇通往自动驾驶仿真研究自由王国的大门。你能精确控制仿真环境中的每一个变量,生成满足特定长尾场景的数据,或是测试算法在极端条件下的鲁棒性。这种能力,是使用预打包黑盒工具所无法比拟的。我个人的体会是,初期遇到的每一个编译错误、运行时崩溃,都是在帮你更深入地理解这个复杂系统的构成。当你第一次成功修改源码并看到仿真器按照你的预期运行时,那种成就感会让你觉得所有折腾都是值得的。最后一个小建议:善用版本控制(Git)来管理你对CARLA源码的修改,并详细记录你的环境配置,这能为未来的项目复现和团队协作省去无数麻烦。

http://www.jsqmd.com/news/1241760/

相关文章:

  • 为什么你的策略回测收益惊人,实盘却巨亏?3 个致命数据陷阱与 Python 修正方案
  • AI 邮件营销落地测评:开发信为什么石沉大海、群发为何进垃圾箱,一套可追踪的外贸邮件营销引擎怎么搭
  • Unity微信小游戏输入框失效:从Python环境到JS适配层的完整解决方案
  • DEC-C++:轻量级C++ IDE的极简安装与高效调试实践
  • 基于MCP协议的AI智能体技术:自动化追踪前沿动态实践指南
  • FreeCAD参数化建模入门:从草图到3D打印的工程实践指南
  • 2026年7月南京腕表去哪修手表才是正规靠谱的,钟表维修门店地址可拨打400-901-0695咨询 - 亨得利官方售后
  • Seedance3.0本地部署实战:免费AI视频生成与绘画教程
  • 互联网医院系统开发解决方案:AI问诊、在线医疗、患者管理一体化平台开发详解
  • JMeter六大定时器深度解析:从原理到实战,精准控制接口自动化测试节奏
  • 科技查新报告加急办理需要多久?时效说明
  • DHCP Starvation攻击原理与防御:利用Kali Linux进行网络协议安全测试
  • 长期搁置的劳力士手表别直接回收,2026 海口表主必看变现技巧 - 肉松卷
  • 汽车大灯淋雨试验箱 车灯零部件防水起雾检测设备
  • 母婴零售企业Kidswant香港上市进程与战略分析
  • 利用自定义分组搭建贴合自身工作流的导航工作台|职场人导航之个性书签!
  • 以太网MAC帧过滤与流控制:从寄存器配置到嵌入式网络实战
  • AI变现路径与商业模式分析:从泡沫到价值
  • 2026苏州宝珀维保门店新坐标出炉专属售后热线全新投入使用 - 宝珀售后服务中心官网
  • 宇树Unitree G1机器人摄像机获取
  • 如何在PS4上轻松管理1490+游戏金手指:GoldHEN金手指管理器完全指南
  • 翡翠资产配置的技术评估框架:从材质鉴定到流通潜力的五维模型
  • AI论文降重工具:深度学习驱动的学术写作优化方案
  • 奇瑞小蚂蚁动力电池系统故障诊断与维修指南
  • 统计学理论与实践鸿沟:从教材概念到业务问题解决的路径重构
  • AI入门指南:李宏毅吴恩达李飞飞李沐四门课程学习路线
  • 济南宝珀中国官方售后服务门店|官网认证地址及电话全新启用(2026年7月最新) - 宝珀售后服务中心官网
  • 查询优化案例复盘:从线上故障到长效保障‌
  • VS2010 C++项目JSON处理实战:JsonCpp选型、集成与避坑指南
  • 关于图论【卡码网99.计数孤岛的思考】