Carla中实现车辆轨迹获得

article/2025/9/30 6:29:07

Carla中实现车辆循迹及车道保持(使用MPC和强化学习)

  • 需要用到的 python api
    • carla.map
      • methods
      • 一个简单的方法实现路径规划
    • carla.Waypoint
      • methods
    • carla.DebugHelper
    • carla.World
  • 强化学习部分
    • 方法
      • 自动驾驶综述
        • 实验结果
      • 模仿学习(Imitation Learning)

需要用到的 python api

carla.map

通过carla.map可以获得当前地图的信息,包括道路的信息和航向点的管理的类函数。

methods

  • generate_waypoints
    参数 distance
    输出:通过给定的distance生成间隔为此大小的路径点列表(list(carla.waypoint))
    每一个点包括Location和Rotation
  • get_spawn_points
    最常使用的函数,获得一个有效的坐标点不会与道路和其他车辆产生冲突。
  • get_topology
    生成全局的拓扑结构,用于做A*路径规划
    输出是连接道路的列表list(tuple(carla.waypoint, carla.waypoint))
    获得结果后可以使用networkx工具建立图结构方便分析之后的最短路径,其中使用road-id,section-id,lane-id的模式固定保存节点,同时也可以在其中添加距离等属性。
        # 创建一个空图G = nx.Graph()for i in range(len(topology)):waypoint1 = topology[i][0]waypoint2 = topology[i][1]waypoint1_info = "%s-%s-%s" % (waypoint1.road_id, waypoint1.section_id, waypoint1.lane_id)waypoint2_info = "%s-%s-%s" % (waypoint2.road_id, waypoint2.section_id, waypoint2.lane_id)G.add_edge(waypoint1_info, waypoint2_info)# nx.draw_networkx(G)# plt.show()

建立有向图带权重

        G = nx.DiGraph()for i in range(len(topology)):waypoint1 = topology[i][0]waypoint2 = topology[i][1]waypoint1_info = "%s-%s-%s" % (waypoint1.road_id, waypoint1.section_id, waypoint1.lane_id)waypoint2_info = "%s-%s-%s" % (waypoint2.road_id, waypoint2.section_id, waypoint2.lane_id)distance = math.sqrt(math.pow((waypoint2.transform.location.x - waypoint1.transform.location.x), 2) +math.pow((waypoint2.transform.location.y - waypoint1.transform.location.y), 2))# G.add_edge(waypoint1_info, waypoint2_info)G.add_weighted_edges_from([(waypoint1_info, waypoint2_info, distance)])

之后使用A*算法即可得到从起点到终点的路径。

        path = nx.astar_path(G, "8-0--2", "483-0-4")

一个简单的方法实现路径规划

通过地图给出的拓扑结构,以及networkx的最短路径规划功能可以实现一个简单的路径规划,给定两点的Transform,上述所获得的拓扑图G,键值对信息{key(道路名称string):velue(航向点carla.Waypoint)},以及地图信息即可获得从起始点到终点的路径规划。注:没有验证是最短路径规划

# 输入起始点和终点的transform,拓扑图,航向点键值对,以及地图,输出从起始点到终点的路径规划
def generate_routelist(start, end, G, waypoints_info,  _map):start_waypoint = _map.get_waypoint(start.location)start_info = "%s-%s-%s" % (start_waypoint.road_id, start_waypoint.section_id, start_waypoint.lane_id)end_waypoint = _map.get_waypoint(end.location)end_info = "%s-%s-%s" % (end_waypoint.road_id, end_waypoint.section_id, end_waypoint.lane_id)path = nx.astar_path(G, start_info, end_info)print(path)# print(path)RouteList = []list_to_end = start_waypoint.next_until_lane_end(0.25)for j in range(len(list_to_end)):temp_waypoint = list_to_end[j]temp_x = temp_waypoint.transform.location.xtemp_y = temp_waypoint.transform.location.yRouteList.append([temp_x, temp_y])for i in range(1, len(path)):_waypoint = waypoints_info[path[i]]list_to_end = _waypoint.next_until_lane_end(0.25)for j in range(len(list_to_end)):temp_waypoint = list_to_end[j]temp_x = temp_waypoint.transform.location.xtemp_y = temp_waypoint.transform.location.yRouteList.append([temp_x, temp_y])return RouteList
  • get_waypoint
    输入:location
    输出:根据输入的位置返回此位置所处最近的waypoint

carla.Waypoint

carla中的航向点,为一个3D的坐标,其中包括carla.Transform具有表示车帘位置的Location信息和表示车辆方向的Rotation信息,同时存储该点与其有关车道的道路信息。

methods

  • next
    输出具当前点distance距离的下一个waypoint
  • next_until_lane_end
    输出该waypoint所在道路上从该点到终点的waypoint列表

carla.DebugHelper

十分方便的一个工具包,里面包括了在地图中描点,画箭头、线段,方框的函数
在获得世界信息后使用

debug = world.debug

即可得到实例化类型

carla.World

通过此类,可以获得一个世界对象,world中包括我们要使用的carla.map和carla.DebugHelper。

此外我们可以对该对象进行设置,包括同步或者异步的属性,通过carla.WorldSettings对象可以对world对象进行属性设置。

如果我们要在carla中使用强化学习,那么将世界设置为同步模式是一个十分方便的设置,在同步模式中client与sever的通信使用tick来校准,因此整个过程便成为收集一次world场景中的信息做一次操作,而在此操作的过程中world不会有变化。

同步模式中需要使用carla.World.tick() 向服务器发送确认信息,并且从服务器返回一个新的帧的ID信息,通过此ID信息我们可以对获得信息进行校准。

在执行world.tick()时会自动调用world.on_tick()函数,world.on_tick()的参数包括callback,在初始化时可以将回调函数传入,在每次tick()时便会自动执行回调函数中的操作,on_tick()将一个carla.WorldSnapshot 传入此回调函数。通过回调函数我们可以获得此帧下世界的具体信息,更新所有的参数。例如下面的一个carla官方给的类函数

class CarlaSyncMode(object):def __init__(self, world, *sensors, **kwargs):self.world = worldself.sensors = sensorsself.frame = Noneself.delta_seconds = 1.0 / kwargs.get('fps', 20)self._queues = []self._settings = Nonedef __enter__(self):self._settings = self.world.get_settings()self.frame = self.world.apply_settings(carla.WorldSettings(no_rendering_mode=False,synchronous_mode=True,fixed_delta_seconds=self.delta_seconds))def make_queue(register_event):q = queue.Queue()register_event(q.put)# register_event(push_snapshot)self._queues.append(q)make_queue(self.world.on_tick)for sensor in self.sensors:make_queue(sensor.listen)return selfdef tick(self, timeout):self.frame = self.world.tick()data = [self._retrieve_data(q, timeout) for q in self._queues]assert all(x.frame == self.frame for x in data)return datadef __exit__(self, *args, **kwargs):self.world.apply_settings(self._settings)def _retrieve_data(self, sensor_queue, timeout):while True:data = sensor_queue.get(timeout=timeout)if data.frame == self.frame:return data

当在程序的某一处使用同步模式时便会执行__enter__中的初始化,将world.on_tick()作为事件传入make_queue中,申请一个队列q,将q.put作为回调函数放入on_tick()中,以后每次执行tick()都会执行该操作。

在该类函数的tick()函数中,每次执行world.tick()函数返回的帧ID都被保存在类变量self.frame中,并且以此从队列中取出carla.WorldSnapshot这是该某一帧下这个世界中所有信息的快照即保存此时刻所有物体的状态。之后通过_retrieve_data中判断该数据的frame是否和此时刻的frame相同,并将此时刻的信息返回。通过返回的信息我们可以获得车辆的当前状态即其他参与者的信息。

强化学习部分

方法

自动驾驶综述

参考链接:知乎-暨华-CARLA: An Open Urban Driving Simulator
参考论文 > CARLA: An Open Urban Driving Simulator
链接: arxiv

此文章中使用CARLA研究了自动驾驶的三种方法,第一种是经典的modular pipeline,第二种是imitation learning, 第三种是reinforcement learning。

  • modular pipeline
    文章使用modular pipeline将自动驾驶分为了三个子系统:perception,planning,control。
  1. 感知模块使用semantic segmentation,具体使用RefineNet来估计车道、边缘、其他物体的状态同时有一个模型用来判断是否到达了路口。
  2. 规划模块利用导航数据生成一系列最近的waypoints,目的是保证在到达目的地时保证避免碰撞。规划模块基于一个状态机模型,包含五种状态:道路跟随、左转弯、右转弯、十字路口直行、紧急停车。
  3. 控制模块使用PID,根据当前位置、速度和一个waypoint列表输出方向、油门、刹车。
  • imitation learning
    此方法是使用高级别的command生成一系列数据,具体的command有(1)跟随当前车道,(2)直行穿越十字路口,(3)路口向左转弯,(4)路口向右转弯
  1. 输入的数据为前置摄像头的数据,在采样时给input添加一点噪音,采用dropout和data augmentation方法。
  2. 网络构成:处理图像=>处理标量=>将感知与测量信息融合=>输出控制
  • reinforcement learning
    使用A3C训练网络
  1. 输入:最近两帧图片,以及一个测量向量包括speed, distance to goal, damage from collision, current high-level command, one-hot encoding。一个CNN和一个MLP分别处理两种数据。
  2. 终止条件:碰撞、到达终点或者到达最长时间。
  3. 奖励:speed的增值,与终点的距离,碰撞因子,在人行道的时间,反向行驶的时间。

实验结果

在这里插入图片描述
表中的数值为成功率,可以看到三个方法中modular pipeline总体表现更好,RL则更差

模仿学习(Imitation Learning)

参考链接:知乎-暨华-End-to-end Driving via Conditional IL
参考论文 > End-to-end Driving via Conditional Imitation Learning
链接: arxiv

  • 前言
  1. imitation learning假设了最优的动作可以通过感知的输入直接得到。但是直接通过感知数据会引入ambiguity,最终输出的这些动作不一定是人类真的想要的。
  2. 相比起传统的模仿学习算法,直接输入观察输出控制信号,本方法model不仅拿到了专家的行为和观察,还拿到了专家的意图(intention)。在测试的时候则可以通过planner或者乘客来提供high-level的command信号。这样的话,本方法就把决策模块和控制模块区分开来,使得神经网络就能够只专注于底层的控制(油门多少、方向盘转多少),而不考虑高层的决策问题了(前面路口要左转还是右转)。
  • 建模方法:
  1. 目标: minimize ⁡ θ ∑ i l ( F ( o i ; θ ) , a i ) \operatorname{minimize}_{\theta} \sum_{i} l\left(F\left(o_{i} ; \theta\right), a_{i}\right) minimizeθil(F(oi;θ),ai),其中F表示agent的策略,a表示专家的动作。
  2. 通常的模仿学习方法,有一个隐含的假设:专家的行为可以通过其观察来完全的解释。如果这个假设成立,那么一个很强的近似器就能学会专家的行为。但是这个假设是有问题的。专家在十字路口转弯,这个行为不能够通过十字路口的观察来解释,这实际上来自于专家的内部状态:他的意图。如果我们直接使用随机的策略来最大化专家动作的这个likelihood,那么学到的agent最后肯定就是在十字路口瞎转悠。
  3. 假设专家存在一个隐变量h,专家的动作是隐变量和观察共同导致的: a i = E ( o i , h i ) a_{i}=E\left(o_{i}, h_{i}\right) ai=E(oi,hi),E表示专家的policy
  4. 将专家的意图暴露给之后的控制器,以command的形式:c = c(h),若意图是左转,则command就是打左转灯,训练时专家负责提供command,测试时导航或乘客提供command,因此数据集变为: D = { ( o i , c i , a i ) } i = 1 N \mathcal{D}=\left\{\left(o_{i}, c_{i}, a_{i}\right)\right\}_{i=1}^{N} D={(oi,ci,ai)}i=1N,此时command-conditional imitation learning(命令条件模仿学习)的判决便是: minimize ⁡ θ ∑ i l ( F ( o i , c i ; θ ) , a i ) \operatorname{minimize}_{\theta} \sum_{i} l\left(F\left(o_{i}, c_{i} ; \theta\right), a_{i}\right) minimizeθil(F(oi,ci;θ),ai)
  • 实现细节

在这里插入图片描述

  1. command c是一个categorical variable(分类变量),是一个one-hot vector
  2. 网络以图像和测量作为输入,以两个连续值steering,acceleration作为输出。
  3. 文章使用了两种方式来输入command,第一种为command input,将command c和input一起输入可以支持连续和离散的任意维度的command,第二种为branched, command为离散的,每一个可选的command对应一个branch网路,command c作为开关,选择最合适的brancj作为控制器输入。
  4. 损失函数 : l ( a , a g t ) = ∥ s − s g t ∥ 2 + λ a ∥ a − a g t ∥ 2 l\left(a, a_{g t}\right)=\left\|s-s_{g t}\right\|^{2}+\lambda_{a}\left\|a-a_{g t}\right\|^{2} l(a,agt)=ssgt2+λaaagt2,s和a分别表示方向盘和加速度
  5. 使用三个前置摄像机
  6. 给控制信号添加噪音,之后让其演示如何从这些噪音中恢复,模拟在理想的轨迹上渐渐偏移的现象。噪音大致为一个三角波,通过记录专家数据中对与噪音的反应作为数据
  • 实验
  1. 设置
    在训练时使用2小时人类驾驶数据,其中12分钟是加入噪音的
  2. 使用标准模仿学习和goal-conditional imitation learning 作为 baselines
  • 结果
    在这里插入图片描述
  1. 首先看到goal-condition的baseline的学习率好一点,但是车辆学会了猛地出界然后抄近路!看到两次交通违章之间的距离要比纯IL小得多。
  2. 用branched的网络结构比command input的网络结构要好很多。
  3. 使用大网络有非常重大的影响。小的网络无法学会perceptuomotor mapping。

在这里插入图片描述
4. 作者在居民区里进行了数据采样。在测试的时候,允许agent错过一次十字路口,不计算missed。上图是测试结果。可以看到不使用data augmentation的话,训练结果非常糟糕。作者在没见过的环境上进行了泛化性测试。效果不错。


http://chatgpt.dhexx.cn/article/VyKRrA6h.shtml

相关文章

Carla学习(五) Carla常用传感器

Depth camera,输出carla.Image,深度相机使用三通道RGB值存储距离信息,然后将其转换为距离灰度图: normalized (R G * 256 B * 256 * 256) / (256 * 256 * 256 - 1) in_meters 1000 * normalized传感器数据包含: frame&#…

Carla传感器

1.介绍 Carla中传感器类别多种多样,不同传感器数据之间也存在差异。但是传感器的使用方法之间存在一致性。本文介绍Carla中传感器使用的通用方法。有关传感器的描述可以在carla.Sensor类中查看 2. 传感器的通用方法 在介绍传感器的通用方法之前,需要明…

Carla安装

近期在实习,入坑了Carla环境,分享一下安装经验 Quick start package installation - CARLA Simulator 文档里得安装说明还是比较全得,安装包比较大,我安装得是windons版本,遇到得坑不多,还是比较顺利得。 …

Carla学习(八)利用carla制作自己的kitti数据集

利用carla制作kitti 3D目标检测数据集基本上就是获得图片、雷达、2D和3D box。 这里主要需要解决的问题就是carla世界的坐标系和kitti数据集的坐标系不太一样,kitti坐标系如下所示: 具体的坐标转换我参考了Fredrik00 https://github.com/Ozzyz/carla-d…

carla环境安装、运行以及版本切换(Windows)

本栏目将介绍carla,包括安装、pythonAPI运行、carla的技术点介绍、自行开发脚本玩转carla,以及自定义的控制carla中的车辆,通过carla生成感知数据集等方法。 1. Carla(windows)环境安装、运行 支持操作系统&#xff…

CARLA 笔记(02)— Ubuntu 安装 CARLA(服务端、客户端、安装 miniconda、创建虚拟环境、更换 pip 源、生成交通流、人工控制车辆按键)

https://carla.readthedocs.io/en/0.9.13/start_quickstart/ 1. 预置条件 Ubuntu 18.04CARLA 0.9.138 GB 以上显卡现存20 GB 以上硬盘空间Python 2 或者 Python 3pip 检查 pip 版本 # For Python 3pip3 -V# For Python 2pip -V升级 pip 版本 # For Python 3pip3 install --u…

Carla自动驾驶仿真二:Carla多视图切换代码详解

文章目录 前言一、Carla多视图切换效果二、Camera安装坐标系1、Carla.Location2、Carla.Rotation 三、接口及代码详解1、接口介绍2、生成上帝视图代码3、生成Camera视图代码 四、完整代码 前言 1、Carla提供了大量的Python API接口,用户可以通过查找文档实现各类功…

[carla入门教程]-2 pythonAPI的使用

本专栏教程将记录我从安装carla到调用carla的pythonAPI进行车辆操控的全流程,带领大家从安装carla开始,到最终能够熟练使用carla仿真环境进行传感器数据采集和车辆控制. 文章目录 第二节 pythonAPI的使用1. 安装Anoconda环境并创建虚拟环境2.使用Vscode 打开工程目录3.学习使用…

CARLA传感器详细文档介绍+python实例(持续更新ing)

CARLA中有两种类型的传感器:每帧都工作的传感器(相机,点云等)和只有特定环境下才接收数据的传感器(触发检测)。都属于carla.Sensor类,从carla.BlueprintLibrary类中实例化。 第一类&#xff1a…

carla学习笔记(十)

实验室同学需要做仿真数据的采集实验,为记录以下整个采集过程。方便未来进行类似数据采集时减少写代码的时间。 采集数据要求: 控制一辆车,从a点到b点。然后在路侧架设一个lidar,采集车辆通过激光lidar区域时的数据。 一、首先…

Carla学习笔记(1):Ubantu20.04安装Carla 0.9.13

前言 最近准备深入研究下Carla与Apollo联合仿真,故安装了Ubantu20.04,做好前期准备。由于第一次安装Carla,不可避免的需要踩一些坑,所以写篇指南记录下,坑都在结尾。不建议按照csdn的教程去安装,直接用官方文档安装。 安装Carla有前提条件,…

carla入门

carla 一、安装 官网地址 1.1 windows下安装 下载zip文件安装 在CARLA官方文档中点击下图部分,文档链接https://carla.readthedocs.io/en/latest/start_quickstart/ 到git下直接下载windows版本, 下面可以选择版本, 这里我用最新版 在解…

Carla 地图

1. 介绍 Carla在0.9.11中扩展了地图功能,增加了许多有意思的扩展功能。 包括在地图上控制指定建筑物的渲染,加载不同的图层等。 We have extended the maps API to provide the ability to toggle on and off every environment object individually. W…

Carla内容简介

最近学长安排了新的任务,开始学习Carla仿真软件。这个软件之前在自己电脑安装一次,各种坑,坑到我怀疑人生,大概装了两三天才装上,之后因为毕设就没动过了,时隔小一年又重新开始学。。。(后续有时…

Carla学习2:carla安装与使用

文章目录 0. 建议1. carla学习相关链接1.1 官方资料1.1 学习教程 2. Carla安装2.1 服务器端2.1.1 下载预编译版本(也可以使用下载源码并编译) 2.1.2 启动服务器端及服务器端显示导航2.3 客户端2.3.1 创建python环境2.3.2 安装carla 的pythonAPI所需要的依…

【仿真】Carla介绍与使用 [1] (附代码手把手讲解)

0. 参考与前言 主要介绍无人驾驶的仿真环境CARLA,开源社区维护,以下为相关参考链接: Carla官方文档 建议后续找的时候 先按好版本号,有些功能/api 是新版本里有的,Carla官方github Youtube PythonWindow 0.9.5 主要是…

自动驾驶仿真平台Carla从入门到放弃

一、Carla的基本概念 人工智能、5G和V2X技术的不断发展使得自动驾驶成为可能。近几年,自动驾驶发展迅速,在科技新闻上经常可以看到自动驾驶的身影,而从事自动驾驶相关软、硬件研究的高效研究所和公司也越来越多,既有传统的汽车巨头…

介绍一款开源的自动驾驶仿真模拟器-Carla

大家好,我是李慢慢。 不管你是一个自动驾驶的算法工程师,还是仿真工程师,不管你是业界大佬还是小白,我都建议你了解甚至使用一下这个软件。 目录: 0、前言 1、Carla简介 2、Carla的官方资源 3、Carla的安装 4、Ca…

Carla 使用神经网络训练自动驾驶车辆---模型搭建及训练

Carla 使用神经网络训练自动驾驶车辆—模型搭建及训练 上一节已经搭建好了一个carla仿真环境,并且进行了数据采集 现在需要使用采集到的摄像头图片和转角数据进行模型训练 创建dataset类 import numpy as np import config from torch.utils.data import Dataset…

Carla自动驾驶仿真一:快速安装与运行Carla

文章目录 前言一、Carla运行效果二、Carla运行资源1、官方推荐2、环境配置1)Carla 0.9.14下载2)Python依赖安装 3)运行Demo 三、运行前注意事项 前言 网上有不少的Windows版本的Carla的安装教程,这里简单记录下自己安装过程 一、…