carla专家驾驶端到端 garage方案

待校核2025.3.17
https://leaderboard.carla.org/get_started_v2_1/

garage是carla的leadboard的其中一种驾驶专家,所以我们先了解一下carla leaderboard是什么.然后复现一个通过garage进行驾驶的端到端模型.效果为:
在这里插入图片描述

Leaderboard 2.1 入门

本页面信息涉及最新版本的 Leaderboard 2.1。有关其他版本的信息,请查阅旧版本部分

为了开始开发您的自动驾驶代理,您需要完成以下步骤:

目录

1. 系统设置

1.1 下载 CARLA leaderboard 包

在以下命令中,将 ${CARLA_ROOT} 变量更改为您的 CARLA 根文件夹。

  • 为了使用 CARLA Python API,您需要在您喜欢的环境中安装一些依赖项。作为参考,对于 conda,首先创建一个新环境:
conda create -n py37 python=3.7
conda activate py37
cd ${CARLA_ROOT}  # 将 ${CARLA_ROOT} 更改为您的 CARLA 根文件夹
pip3 install -r PythonAPI/carla/requirements.txt

CARLA Leaderboard 发布版本基于 0.9.14 版本。它还具有 0.9.15 版本的一些功能,例如新的大型地图功能。因此,使用 API 时,请参考该文档

1.2 获取 Leaderboard 和 Scenario Runner

  • 下载 Leaderboard 仓库 leaderboard-2.1 分支
git clone -b leaderboard-2.1 --single-branch https://github.com/carla-simulator/leaderboard.git

在以下命令中,将 ${LEADERBOARD_ROOT} 变量更改为您的 Leaderboard 根文件夹。

  • 安装所需的 Python 依赖项。

cd ${LEADERBOARD_ROOT} # 将 ${LEADERBOARD_ROOT} 更改为您的 Leaderboard 根文件夹

pip3 install -r requirements.txt
  • 下载 Scenario Runner 仓库 leaderboard-2.1 分支
git clone -b leaderboard-2.1 --single-branch https://github.com/carla-simulator/scenario_runner.git

在以下命令中,将 ${SCENARIO_RUNNER_ROOT} 更改为您的 Scenario_Runner 根文件夹。

  • 使用相同的 Python 环境安装所需的 Python 依赖项。
cd ${SCENARIO_RUNNER_ROOT} # 将 ${SCENARIO_RUNNER_ROOT} 更改为您的 Scenario_Runner 根文件夹
pip3 install -r requirements.txt
1.2.1 基于 ROS 的代理

首先,下载并安装适当的 ROS 或 ROS2 发行版。Leaderboard 2.1 支持 ROS Melodic、ROS Noetic 和 ROS2 Foxy。之后,克隆并构建 CARLA ROS 桥接仓库,适用于 ROSROS2。克隆 CARLA ROS Bridge 仓库时,请确保指定 leaderboard-2.1 分支:

git clone --recurse-submodules -b leaderboard-2.1 --single-branch https://github.com/carla-simulator/ros-bridge

1.3 定义环境变量

我们需要确保不同的模块可以找到彼此。

  • 使用以下命令打开 ~/.bashrc 配置文件:

  • 编辑您的 ~/.bashrc 配置文件,添加以下定义。编辑后保存并关闭文件。

export CARLA_ROOT=PATH_TO_CARLA_ROOT
export SCENARIO_RUNNER_ROOT=PATH_TO_SCENARIO_RUNNER
export LEADERBOARD_ROOT=PATH_TO_LEADERBOARD
export PYTHONPATH="CARLA 
ROOT/PythonAPI/carla/":"{SCENARIO_RUNNER_ROOT}":"LEADERBOARD 
ROOT":"{CARLA_ROOT}/PythonAPI/carla/dist/carla-0.9.14-py3.7-linux-x86_64.egg":${PYTHONPATH}
  • 记住使用以下命令 source .bashrc,使这些更改生效:

2. 使用 Leaderboard 创建自动驾驶代理

2.1 Leaderboard 初步使用

Leaderboard 将负责运行您的自动驾驶代理,并评估其在多个路线的不同交通情况下的行为。为了更好地理解这个过程,让我们运行一个基本代理。

  • 在一个终端中运行 CARLA 服务器。
cd ${CARLA_ROOT}
./CarlaUE4.sh -quality-level=Epic -world-port=2000 -resx=800 -resy=600
  • 在另一个终端中,导航到 ${LEADERBOARD_ROOT}。虽然 Leaderboard 使用 leaderboard_evaluator.py python 脚本运行,但使用的参数数量可能使其直接在终端中运行非常不方便。因此,建议使用 bash 脚本。Leaderboard 提供了 run_leaderboard.sh 脚本,它正是这样做的。运行脚本:

这将启动一个 pygame 窗口,让您选择手动控制代理。按照彩色路标指示的路线到达目的地。脚本在 Town 12 中加载两条路线。


跟随路线并遵守交通规则,直到到达目的地。

手动中断 Leaderboard 将抢先停止路线的模拟,自动移动到下一条路线。

2.2 理解 Leaderboard 组件

运行测试时,我们设置了一系列参数。让我们了解这些参数及其在 Leaderboard 中的作用。

  • ROUTES (XML) — 将用于模拟的路线集。每条路线都有一个起点(第一个路标)和一个终点(最后一个路标)。此外,它们可以包含一个天气配置文件,以设置特定的天气条件。一个 XML 包含许多路线,每条路线都有一个 ID。用户可以修改、添加和删除用于训练和验证的路线。Leaderboard 附带一组用于调试、训练和验证的路线。用于在线评估的路线是秘密的。此文件还包括将在模拟中测试的场景,每条路线都有自己的场景集。场景被定义为一种交通情况。代理将必须克服这些场景才能通过测试。参与者可以访问一组在公开可用的城镇中工作的交通场景。有多种类型的场景,使用不同的参数实例化。这是可用场景的列表。

  • REPETITIONS (int) — 每条路线为统计目的重复的次数。

  • TEAM_AGENT (Python module) — 代理的 Python 模块的路径。创建代理的步骤在下一步中解释。

下面描述了其他相关参数。

  • TEAM_CONFIG (用户定义) — 代理读取的任意配置文件的路径。您负责在您的代理类中定义和解析此文件。
  • DEBUG_CHALLENGE (int) — 指示是否应在模拟期间显示调试信息的标志。默认情况下,此变量未设置 (0),不显示任何调试信息。当设置为 1 时,模拟器将显示要遵循的参考路线。如果此变量设置为大于 1 的任何值,引擎将打印模拟的完整状态以进行调试。
  • CHECKPOINT_ENDPOINT (JSON) — Leaderboard 指标将被记录的文件的名称。
  • RECORD_PATH (string) — 将存储 CARLA 日志的文件夹的路径。默认情况下未设置。
  • RESUME — 指示是否应从最后一条路线恢复模拟的标志。默认情况下未设置。
  • CHALLENGE_TRACK_CODENAME (string) — 代理正在竞争的赛道。有四种可能的选择:SENSORS 赛道允许使用多个摄像头、一个激光雷达、一个雷达、一个 GNSS、一个 IMU 和一个速度计。除了这些传感器之外,MAP 赛道还允许直接访问 OpenDRIVE HD 地图。您负责根据需要解析和处理 OpenDRIVE 地图。每个赛道都有自己的限定赛,名为 SENSORS_QUALIFIERMAP_QUALIFIER

这些环境变量被传递到 ${LEADERBOARD_ROOT}/leaderboard/leaderboard_evaluator.py,它作为执行模拟的入口点。查看 leaderboard_evaluator.py 以了解有关代理如何执行和评估的更多详细信息。


3. 创建您自己的自动驾驶代理

新代理的定义从创建一个继承自 leaderboard.autoagents.autonomous_agent.AutonomousAgent 的新类开始。

对于基于 ROS 的代理,您还可以继承自 leaderboard.autoagents.ros1_agent.ROS1agentleaderboard.autoagents.ros2_agent.ROS2agent

3.1 创建 get_entry_point

首先,定义一个名为 get_entry_point 的函数,该函数返回新类的名称。这将用于自动实例化您的代理。

from leaderboard.autoagents.autonomous_agent import AutonomousAgent

def get_entry_point():
    return 'MyAgent'

class MyAgent(AutonomousAgent):
...
3.1.1 创建 ROS 入口点
对于 ROS 代理,您还需要定义 ROS 入口点。在此入口点中,用户可以指定包和启动文件以及所需的参数。

Python

from leaderboard.autoagents.ros1_agent import ROS1Agent

def get_entry_point():
    return 'MyROSAgent'

class MyRosAgent(ROS1Agent):
    ....
    def get_ros_entry_point(self):
        return {
            "package": "my_ros_agent",
            "launch_file": "my_ros_agent.launch",
            "parameters": {}
        }
3.2 重写 setup 方法
在您的代理类中,重写 setup 方法。此方法执行代理所需的所有初始化和定义。每次初始化路线时,都会自动调用它。它可以接收指向配置文件的可选参数。用户需要解析此文件。至少,您需要指定您参与的赛道。

```Python

from leaderboard.autoagents.autonomous_agent import Track
...
def setup(self, path_to_conf_file):
    self.track = Track.SENSORS # 至少,此方法设置 Leaderboard 模式。在本例中,为 SENSORS
self.track 属性应为枚举,而不是字符串。它只能采用可能的值 Track.SENSORS 或 Track.MAP。

3.3 重写 sensors 方法
您还需要重写 sensors 方法,该方法定义您的代理所需的所有传感器。

def sensors(self):
    sensors = [
        {'type': 'sensor.camera.rgb', 'id': 'Center',
         'x': 0.7, 'y': 0.0, 'z': 1.60, 'roll': 0.0, 'pitch': 0.0, 'yaw': 0.0, 'width': 300, 'height': 200, 'fov': 100},
        {'type': 'sensor.lidar.ray_cast', 'id': 'LIDAR',
         'x': 0.7, 'y': -0.4, 'z': 1.60, 'roll': 0.0, 'pitch': 0.0, 'yaw': -45.0},
        {'type': 'sensor.other.radar', 'id': 'RADAR',
         'x': 0.7, 'y': -0.4, 'z': 1.60, 'roll': 0.0, 'pitch': 0.0, 'yaw': -45.0, 'fov': 30},
        {'type': 'sensor.other.gnss', 'id': 'GPS',
         'x': 0.7, 'y': -0.4, 'z': 1.60},
        {'type': 'sensor.other.imu', 'id': 'IMU',
         'x': 0.7, 'y': -0.4, 'z': 1.60, 'roll': 0.0, 'pitch': 0.0, 'yaw': -45.0},
        {'type': 'sensor.opendrive_map', 'id': 'OpenDRIVE', 'reading_frequency': 1},
        {'type': 'sensor.speedometer', 'id': 'Speed'},
    ]
    return sensors

大多数传感器属性都有固定值。这些可以在 agent_wrapper.py 中查看。这样做是为了让所有团队在通用的传感器框架内竞争。

每个传感器都表示为一个字典,包含以下属性:

  • type: 要添加的传感器类型。
  • id: 将分配给传感器的标签,以便稍后访问。
  • other attributes: 这些是传感器相关的,例如:外参和 fov。
    用户可以设置每个传感器的内参和外参参数(位置和方向),相对于车辆的相对坐标。请注意,CARLA 使用 Unreal Engine 坐标系,即:x-front、y-right、z-up。

可用传感器有:

  • sensor.camera.rgb — 捕获图像的常规摄像头。比赛中限制为 8 个,限定赛中限制为 4 个。
  • sensor.lidar.ray_cast — Velodyne 64 LIDAR。比赛中限制为 2 个,限定赛中限制为 1 个。
  • sensor.other.radar — 远程雷达(最远 100 米)。比赛中限制为 4 个,限定赛中限制为 2 个。
  • sensor.other.gnss — 返回地理位置数据的 GPS 传感器。比赛和限定赛都限制为 1 个。
  • sensor.other.imu — 6 轴惯性测量单元。比赛和限定赛都限制为 1 个。
  • [sensor.opendrive_map] — 以字符串形式解析的 OpenDRIVE 格式公开 HD 地图的伪传感器。比赛和限定赛都限制为 1 个。
  • [sensor.speedometer] — 提供线性速度近似值的伪传感器。比赛和限定赛都限制为 1 个。

尝试设置其他传感器、拼写错误或设置过多类型的传感器将导致设置失败。

还有空间限制,限制传感器在车辆体积内的放置。如果传感器在任何轴上距离其父对象超过 3 米(e.g. [3.1,0.0,0.0]),则设置将失败。

3.4 运行时代理-leaderboard 通信

3.4.1 重写 run_step 方法(非基于 ROS 的代理)

此方法将在每个时间步调用一次,以生成 carla.VehicleControl 对象形式的新动作。确保此函数返回控制对象,该对象将用于更新您的代理。

def run_step(self, input_data, timestamp):
	control = self._do_something_smart(input_data, timestamp)
	return control
  • input_data: 一个字典,包含请求传感器的传感器数据。数据已在 sensor_interface.py 中预处理,并将作为 numpy 数组给出。该字典由 sensor 方法中定义的 id 索引。

  • timestamp: 当前模拟瞬间的时间戳。

请记住,您还可以访问自我代理应行驶以到达目的地的路线。使用 self._global_plan 成员访问地理位置路线,使用 self._global_plan_world_coord 访问其世界位置对应项。

3.4.2 ROS-leaderboard 运行时通信

ROS-Leaderboard 集成旨在同步工作。默认情况下,leaderboard 等待直到收到带有当前帧时间戳的新车辆命令。重复或旧时间戳的车辆命令将被忽略。用户可以通过重写 ROSBaseAgent._vehicle_control_cmd_callback 来更改此行为。重写默认行为时,用户负责决定在每个步骤应用哪个车辆命令。

车辆控制必须发布到名为 /carla/hero/vehicle_control_cmd 的 ROS 主题。确保用相应的时间戳填充消息的标头。

传感器数据也可以通过 ROS 主题获得。主题名称的结构如下:/carla/hero/<sensor-id>。有关完整参考,请查看 CARLA ROS 传感器文档

基于 ROS 的代理还可以访问自我车辆路线。路线发布在以下主题中:

此外,基于 ROS 的代理必须在堆栈初始化完成后与 Leadeboard 通信。此通信应通过在以下主题 /carla/hero/status std_msgs/Bool 中发布来完成。

3.5 重写 destroy 方法

在每条路线结束时,将调用 destroy 方法,如果需要清理,您的代理可以重写该方法。例如,您可以利用此函数来删除网络的任何不需要的内存。


4. 训练和测试您的代理

4.1 预定义的训练和测试路线

我们准备了一组预定义的路线作为起点。您可以使用这些路线来训练和验证代理的性能。路线可以在文件夹 {LEADERBOARD_ROOT}/data 中找到:

  • routes_training.xml: 90 条路线,旨在用作训练数据 (780.6 Km)。
  • routes_validation.xml: 20 条路线,旨在用作验证数据 (247.6 Km)。
  • routes_testing.xml: 20 条路线,旨在用作验证数据 (205.9 Km)。

4.2 训练数据库创建工具

随着 Leaderboard 2.0 的发布,AV 堆栈将不得不处理一组新的场景,这些场景的设计比 Leaderboard 1.0 中可用的场景更具挑战性。Leaderboard 中出现的新情况的一些示例包括路线障碍、合并和交叉 actor 流以及处理避让紧急车辆。

但是,这些新场景对于 TrafficManager 或 PythonAPI 代理来说都太具挑战性,因此用户不能再使用 CARLA 自己的任何自动驾驶堆栈来提取训练数据。

因此,我们现在提供一组新的 CARLA 日志,这些日志展示了每个新场景的手动执行,所有这些场景的得分均为 100%。日志包括场景中所有元素的预计算车辆轨迹。您可以在此处下载日志。正在为所有训练路线创建类似的日志,当前可用的日志可以从此处下载。

我们还提供了一个脚本,旨在与这些 CARLA 日志一起使用,可以在此处找到。此脚本旨在允许用户设置自己所需的传感器,自动运行任何 CARLA 日志,并保存传感器的数据。

所有配置都可以在脚本的顶部完成,如下图所示。这些配置包括使用的传感器、模拟的天气、使用的记录器和端点文件夹。


脚本的配置设置。

调整完成后,运行脚本:

python capture_sensor_data.py

5. Discord 服务器

我们鼓励所有参与者加入我们的Discord server

6 garage环境配置

待完善

7文件配置

待完善

8效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白云千载尽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值