“ 经常有朋友问如何学习仿真测试,于是想着把自己的一些经验和理解分享出来,希望能有所帮助。不过视野和技术有限,所说不一定对,供大家批评和参考。这是第18篇,CARLA的基本概念。”
终于赶在国庆前写完这篇,祝愿大家双节快乐
上一篇中介绍了如何进行CARLA的安装,本篇介绍CARLA的几个基本概念,以加深对CARLA的理解。包括:客户端和服务端,步长和同步模式,交通参与者等,下面的视频对这些进行了详细的说明,还给出了一个实例。
1. 客户端和服务端
CARLA采用客户端-服务端(client-server, C/S)架构,其中服务端基于虚幻引擎4(Unreal Engine 4,UE4)开发,并提供了C++和python版本的客户端API,如下图所示。
虚幻引擎是由Epic Games公司开发的游戏引擎,广泛应用于游戏开发、电影制作、工况模拟和可视化展示等领域,提供了良好的模拟和渲染效果。基于此,CARLA服务端进行所有与仿真环境相关的模拟和运算,包括仿真世界生成、交通参与者状态更新、传感器渲染等多方面的工作。
客户端API使用C++开发,并通过boost库封装为python可调用的版本,即上一节安装的Python API。基于该API可开发客户端,实现对客户端中仿真世界的控制,如变换地图和天气、添加交通参与者、控制交通参与者运行等。
2. 步长和同步模式
根据Python API中的定义,CARLA运行时,服务端(Server)中运行的整个虚拟环境称为仿真世界(World),连接服务端并对仿真世界进行控制或从仿真世界获取相关信息的模块称为客户端(Client)。
仿真运行时只能启动一个服务端运行仿真世界,可启动多个客户端实现对仿真世界的不同控制或者从仿真世界获取不同的信息。服务端和客户端可运行在同一台电脑,也可运行在有网络连接的多台电脑上(这种情况下,客户端启动时需要指定服务端的IP,以实现连接)。
服务端中仿真世界的运行有不同的步长模式,仿真世界和客户端之间交互有不同的同步模式。
步长模式是指服务端运行时相邻两帧的时间间隔方式,包括变步长和定步长两种模式:
变步长:相邻两帧的时间间隔为计算更新仿真世界状态实际花费的时间
定步长:相邻两帧的时间间隔为预先设置好的固定时间
同步模式是指服务端和客户端是否同步运行,包括同步和异步两种模式:
同步:服务端完成前一帧的更新计算后,接收到客户端发送的更新指令(称为tick)后再进行下一帧的更新计算
异步:服务端完成前一帧的更新计算后,马上进行下一帧的更新计算,这样仿真世界会以尽可能快的时间运行
步长模式和同步模式会形成四种组合,对比如下图所示:
对常用的同步定步长模式,做进一步说明:
如下图所示,客户端Client按照固定的时间间隔从服务端Server获取信息(get),并触发服务端Server运行(tick),服务端Server接收到客户端Client的触发信号后,进行进行计算并更新状态(update),图中矩形表示当前帧计算所需的实际时间,该时间可能与仿真时间中实际流逝的时间(步长)不同。
假设仿真世界中有一辆在直路上按照10m/s匀速行驶的车辆,客户端Client每隔0.1s向服务端Server发生触发信号,并获取当时的车辆位移。通过设置不同的仿真步长,可将仿真设置为实时、加速或者慢速运行,下图所示。
当步长为0.1s时,由于步长与触发间隔一致,仿真实时运行,仿真世界中时间流逝与真实世界一致;当步长为0.2s时,步长大于触发间隔,仿真加速运行,仿真世界中时间流逝快于真实世界。
3. 交通参与者
CARLA中的车辆、行人、传感器、交通标志、交通灯等都称为交通参与者(Actors),这些交通参与者具有类似的属性和操作方式。
CARLA中预设的不同交通参与者类别,称为蓝图(blueprint),比如车辆的蓝图包括vehicle.audi.a2、vehicle.tesla.model3和vehicle.kawasaki.ninja等车型,传感器的蓝图包括sensor.camera.rgb、sensor.lidar.ray_cast和sensor.other.obstacle等类型。
可通过world的spawn_actor方法在期望的位置生成某个蓝图对应的交通参与者,并在随后的仿真运行中对该交通参与者进行控制和获取相关信息;最后,当不再需要该交通参与者时,可以将其销毁。