我们将在这篇文章中介绍如何使用Python库来创建Carla客户端,并使用客户端跟仿真环境进行交互,我们将会创建一台白色的特斯拉Model 3,让它在仿真环境中运动。
如果你还不知道Carla是什么,或者不清楚如何安装Carla服务器和Python库,请阅读 Carla自动驾驶仿真环境 1 – 基本概念
我们已经知道,我们可以使用Python来实现一个客户端来跟Carla仿真环境进行交互,而在Carla Python库中,是以 carla.Client 类来实现的,我们可以通过实例化这个类来建立客户端,并跟服务器实现连接。通常来说为了防止由于网络原因带来的阻塞,我们还可以设置这个客户端的超时时间。
|
|
client对象是跟Carla环境交互的唯一的入口,有了client对象以后,我们就可以获取到Carla环境中的世界(World)了,World对象确确实实的代表Carla环境中的世界,你想要在世界中创建任何东西,都是往这个World对象中添加。获取World对象的方法也很简单,一句代码就可以。
|
|
我们用这行代码在客户端获取到了World对象,并使用了Town02这张由Carla官方提供的内置地图,Carla还提供了其他一些地图,我们可以通过更改load_world的参数来加载不同的地图。
有了world对象以后,我们来直观感受下,我们可以做什么样的交互,比如我们想控制世界的天气和时间(太阳的位置)。
|
|
这里,使用carla.WeatherParameters创建了一种天气,万里无云,没有降雨,太阳的角度为50,也就是说是一个大晴天,然后通过世界的set_weather方法修改了世界的天气。
Actors我们可以称之为演员,在Carla世界中任何可以通过客户端创建的物体都称为Actors(演员),包括:车辆,行人,传感器等等。
而创建Actor,我们需要提供想要创建的Actor的类型,不同的类型会有不同的属性,比如一台车,它可以是不同的型号,可以是不同的颜色, 外观不同,可以通过油门和方向盘来控制,而如果是一个传感器,它可能都没有这些任何一个属性,因此创建一个Actor需要知道这些信息,也就是类似于需要使用一个模板,这个东西在Carla中叫做蓝图,即Blueprints,Carla中已经内置了一个蓝图库,里边包含了许多不同的Actors,比如我们可以创建一台特斯拉的Model 3,我们也可以创建一台BWM,或者雪铁龙等等。
我们使用下边的代码创建一个白色的特斯拉蓝图(模板)
|
|
使用world.get_blueprint_library()可以获取到Carla内置的蓝图库,通过find方法找到model 3,我们也可以使用filter方法然后给定模糊匹配的方法获取到多个蓝图,比如,可以用world.get_blueprint_library().filter('vehicle.bmw.*')获取到所有BMW的车型蓝图。
每一个蓝图都可以使用set_attribute更改自身的属性,这里我们将颜色设置成了白色。
一个Actor可以被生成(Spawning),使用(Handling),以及销毁(Destruction)。
使用world对象的spawn_actor或者try_spawn_actor方法就可以生成一个Actor,不过上边提到,在生成Actor的时候,需要告诉世界它的出生点在哪里,出生点在Carla中抽象为carla.Transform,比如,我们可以用下边这段代码,指定将Actor生成到某一个地点。
|
|
不过因为,物体在世界中是有体积的,所以有可能你指定的地点上已经有其他物体了,比如,该位置已经有台车子,或者该位置是一个建筑物,这种情况下,Actor被生成的时候就会出现碰撞,为了避免这个问题,Carla提供了一个接口可以获取到所有空的出生点,只要在这些空的出生点上生成Actor就不会出现碰撞的问题了。
下边这段代码,随机的选择了一个空的出生点,然后在该位置生成我们的白色Model 3
|
|
当Actor被生成以后,生成方法会范围被生成的Actor对象,我们可以使用该对象控制Actor的行为。比如,我们可以让刚刚生成的Model 3动起来,使用下边的代码,让它按照交通规则在世界中行驶。
|
|
我们还可以主动的把车挪动位置
|
|
等等,根据不同的Actor类型,可以控制的参数也不一样。
当我们不在需要某个Actor的时候,可以将其销毁,释放计算资源。
|
|
传感器是自动驾驶汽车的眼睛,对于自动驾驶的研究,基本上都是围绕传感器进行的,Carla作为一个自动驾驶仿真环境,最重要的就是能够支持给车辆安装不同的传感器,Sensor是一种特殊的Actor,它的蓝图也是可以在蓝图库里边找到的,目前Carla已经支持了很多传感器,比如
传感器跟其他的Actor最大的不同是,它们需要被安装在车上,因此在生成传感器的时候,需要将其附着到一个车辆类型的Actor上,而出生点是针对于这台车本身的坐标系给定的。
|
|
我们在上段代码中,首先从蓝图库中找到RGB摄像头模板,然后利用这个蓝图生成摄像头Actor,并将其附着到前边生成好的Model 3上,我们选择了摄像头附着类型为:carla.AttachmentType.SpringArm,并将其位置设置到后方,这样我们就可以像从一个第三者的角度排到行驶的车辆了,在文章最后,读者可以看到摄像头拍到的车辆的照片。
每一个传感器都有一个listen方法,该方法接收一个callback作为参数,我们可以自定义callback里边的逻辑,callback将会在传感器拿到数据后被调用,并能够获取到这些数据。我们这个例子中,我们将摄像头采集到的图像信息以图片的形式保存在output文件夹中。
跟其他Actor一样的,传感器也有很多参数可以设置,比如对于RBG摄像头来说,我们可以设置其采集的分辨率。
在 Carla自动驾驶仿真环境 1 – 基本概念中,我们提到跟Carla环境交互的唯一方式就是通过客户端,但是前边我们使用Python脚本生成了一台Model3 ,并让它行驶在路上,我们的Python脚本并没有能力输出视频,我们怎么来确认我们的 Model 3已经被创建,并在路上行驶呢。
Carla给我们提供了一个所谓的观察者 Spectator,你可以将其理解为Carla环境的视角,我们可以通过修改观察者的参数,切换Carla环境的视角。
|
|
我们利用上边这段代码,将观察者的位置到我们的Model 3的正上方(z轴),并将视角调为-90度,即向下看,每隔5s中跟着Model 3的位置重置一下观察者的位置,这样就可以在Model 3的正上方追踪并观察这台车了。
我们在这个项目最后会得到两个输出
下图就是我们使用carla.AttachmentType.SpringArm附着类型采集到的照片
本文中使用到的代码放置在GitHub仓库:https://github.com/pythonlibrary/carla-tutorials,文件名为:tutorial-2.py
我们将在下一篇文章Carla自动驾驶仿真环境 3 – 利用摄像头识别车辆 中以一个小的车辆识别的项目来介绍怎么组合使用本篇文章介绍的Carla的这些接口
Python之所以如此流行,在于它有强大的生态,使用各种各种的库可以帮助用户最快速的解决问题。Python酷致力于输出高质量的Python库相关教程及技术性文章,帮助用户更好更快速的解决问题