标注:本文来自本实验室胡宗盛的研究成果。
定位的技术发展
第一为 GNSS 定位,该定位依托于卫星定位技术,定位精度在 10 米以下;
第二为惯导定位;
第三为高精度定位,该种定位已经实现了对传感器的建模和对获取到的传感器数据的信息的处理等,定位精度已经达到了厘米级的程度。
因此,精确的定位是自动驾驶的基础,也是核心,缺少精确的定位,自动驾驶可能会出现失误。
自动驾驶定位系统的基本要求
高精度: 要求达到厘米级;
高可用性:为了保持其稳定性和实用性,自动驾驶测试的阶段已经从封闭阶段转换为开放阶段,这其实是为了要求我们的定位系统能够处理日益复杂的情况,应对不可预知的情况发生的能力大大提升;
高可靠性:这个自动驾驶定位系统的输出是判断感知的方法,应对措施,提供解决方案反映了应对的能力,这个时候即便有一丁点的小误差也会给我们带来极其严重的后果;
自主完好性检测:鉴于当前系统建模的准确性还没有到达 100%,即便已经比较靠近。所以当我们提供的输出不够准确的情况下,我们能做的就是告诉并劝戒驾驶用户采取相应的措施,以此防止交通事故的发生,我们对它的要求就是在预测发生事故时可以准确的提醒以及降低错误提醒的发生概率。
自动驾驶定位的方法与流程
1.在感应到基站的情况下,采用卫星定位和惯导组合的定位技术;
2.根据需求分别自动切换三种自动驾驶的定位技术;
3.在隧道或夜间外界环境光线稳定的情况下,采用视觉里程算法的定位技术;
4.在未感知到基站的情况下,采用激光雷达点云和高精度地图匹配的定位技术。
-
Carla.GeoLocation:类包含地理坐标模拟数据,该 carla.Map 可以通过使用模拟转换位置 OpenDrive文件中的标签,包括(纬度,经度,高度)。
-
Carla.GnssMeasurement:定义由 sensor.other.gnss 注册的 Gnss 数据的类,实际上是通过传感器的位置和 Open Drive 地理参考来报告其位置,包括(高度,纬度,经度)。
-
Carla.IMUMeasurement:继承自carla.SensorData,定义由secsor.other.imu 注册的数据的类,根据当前carla.world进行传感器转换,实际上起着加速度计,陀螺仪和指南针的作用。
-
Carla.Image:被用作相机传感器检索的初始数据,有不同的相机传感器(当前为 3 个,分别是RGB,深度和语义分割),并且每个传感器对图像的使用方式都不同,包括(图像水平,图像高度,图像宽度)。
自动驾驶 GPS 建模
创建客户
创建客户需要标识它的 IP 地址和两个与服务器通信的 TCP 端口,第三个参数可以设置工作线程的数量。默认情况下为 all(0)。
client = carla.Client(’localhost’,2000)
默认情况下,carla 使用本地主机 IP 和端口 2000 进行连接,但是可以随意更改,在这种情况下,第二个端口始终为 2001。
创建客户端后,要设置超时时间。这限制了所有网络的操作,使得这些操作永远不会阻止客户端,如果连接失败,将会返回错误。在实际操作的过程中,发现预定的
10.0 不足以满足,通常情况下我需要设置的超时时间更长一些。client.set_timeout(100.0)
可能会连接到许多客户端,因为通常情况下,一次性运行多个脚本是很常见的。在具有高级 carla 功能的多客户端方案中进行工作将会使得通信变得更加复杂。
需要注意的是客户端和服务器具有不同的 libcarla 模块。版本不同的话可能会出现问题,可以使用 get_client_version() 和 get_server_version() 方法进行检查。
与世界联系
world=client.get_world()
客户端可以很容易的连接和检索当前世界。除此之外,客户端还可以获取可用地图列表以更改当前地图,这会摧毁当前世界并创造一个新的世界。每个世界都有一个自己的 id,每次客户要求 load_world() 或者 reload_world() 的时候,前一个世界都会被销毁, 从头开始创建新的世界,在此过程中虚幻引擎不会重新启动。
print(client.get_available_maps())
world=client.load_world(’Town02’)
client.load_world()
地图示例:
Actor和Blueprint
在 carla 中,参与者不仅仅只包括车辆和步行者,还包括传感器,交通标志,交通信号灯和行人观众,全面了解如何对其进行操作至关重要。蓝图可以使得用户将新的参与者平稳地合并到模拟中,它们是已经制作的具有动画和一系列属性的模型,其中一些是可以修改的,而其他的则不是。这些属性包括车辆颜色,激光雷达传感器中的通道数量,行人的速度等。
blueprint_library=world.get_blueprint_library()
每一个蓝图 (blueprint) 有一个 ID 来标志它们,并随其生成演员。可以在蓝图库找到某个 ID,随机选择这个 ID 对应的蓝图,或者使用通配符模式过滤结果。
世界对象负责生成角色并对其进行跟踪,生成角色有两种不同的方法:spawn_actor()如果生成失败,则会引发异常;try_spawn_actor() 如果生成失败,则返回 None。
transform=Transform(Location(x=210,y=180,z=50),Rotation(yaw=180)) actor=world.spawn_actor(blueprint,transform)
如果在选定的位置发送碰撞的话,不会生成角色,使用map.get_spawn_points()这个函数返回推荐的生成点列表;同理,world.get_random_location() 可以返回人行道上的随机点,为行人设置目标位置。
camera=world.spawn_actor(camera_bp,relative_transform,attach_to=my_vehicle,carla.AttachmentType.Ri
这一句将 camera 摄像机固定在创造的汽车上,使得二者的位置保持相对固定。产生角色之后,世界会将它添加到参与者列表之中。
定义角色列表并清理
actor 主要由get() 和 set() 方法组成,这里需要主要的是请求会被异步的发送到模拟器,但是 carla 每次解析它们的时间都是有限的,用 set() 方法会累积滞后。
地图和导航
创建及改变地图和世界的方法在上面已经提到过了,与航路点相关的所有事情都发生在客户端,不需要与服务器进行通信,每个航路点都包含 carla.Transform,说明了它在地图上的位置以及包含它的车道的方向,carla 的导航是通过 Waypoint API 进行管理的,由 carla.Waypoint 和 carla.Map 的方法摘要组成。
将模拟点转换为地理坐标,使用纬度和经度值将某个位置转换为 carla.GeoLocation, 将道路信息转换为 OpenDrive 格式保存。
my_geolocation=map.transform_to_getlocation(vehicle.transform) info_map=map.to_opendrive()
利用carla.get_transform().location 获取数据,下图是运行 50 秒的初始位置和结束位置:
识别位置坐标
可以看出,Carla 中小车的位置最开始在 (0,0,0),经过 50 秒的运行之后位置变化为(196.215607,241.279999,0.271780)。