CARLA 0.9 版本 Python API Tutorial 翻译

Carla 0.9.4

Carla windows版本下载 目前只有0.9.3和0.9.4 支持windows版本且均是dev版本
需要下载Anoconda并且用Anoconda prompt来打开CarlaUE4 然后打开 python文件
python版本要3.7 不然就无法识别.egg文件 也无法识别到carla模块
本文档是在Carla官网中可以找到,并且对应的是最新版本的api,即Carla 0.9.4

几个核心的概念

Actor: 是能够在模拟中四处移动的模型,如交通工具、行人、感应器等等
Blueprint:在生成Actor之前你需要喜欢它的属性,这就是蓝图的用处。我们提供了对于所有Actor定义有效的蓝图库
World:世界表示了目前载入的地图并且包含了能够将蓝图转化为actor的函数。它也提供了对于道路的接口以及改变天气的函数

连接以及获得世界

为了连接到模拟器我们需要创建一个Client对象,所以我们需要一个IP地址以及运行模拟器的端口

client = carla.Client('localhost', 2000)

在创建了client之后最首先应该做的就是设置timed-out 超时时长,如果没有被设置,在网络异常的情况下会被永远地阻塞

client.set_timeout(10.0) # seconds

一旦我们配置好了Client 我们就可以获得世界

world = client.get_world()

理论上来说 接下来我们就不需要client 这个对象了,所有我们创建的对象都会自动地连接到IP和端口之上,而这一过程是对用户透明的

蓝图

蓝图包含了创建一个任务所必须的信息。比如,如果一个蓝图定义了车辆,那我们就可以在它之上修改其颜色。如果它定义了雷达,那我们可以定义这个雷达包含多少的频道。蓝图也拥有唯一确定其身份的ID以及其创造的Actor(在我看来 blueprint就是class actor就是object)

blueprint_library = world.get_blueprint_library()

library 允许我们通过特定的ID找到蓝图、通过通配符或者随机地选取一个

# Find specific blueprint. 
collision_sensor_bp = blueprint_library.find('sensor.other.collision') 
# Chose a vehicle blueprint at random. 
vehicle_bp = random.choice(blueprint_library.filter('vehicle.bmw.*'))

蓝图的一些属性是可以被修改的然而某些属性是只读的,比如,我们无法改变交通工具的车轮数量但是可以改变其颜色

vehicles = blueprint_library.filter('vehicle.*') bikes = [x for x in vehicles if int(x.get_attribute('number_of_wheels')) == 2]
for bike in bikes:
     bike.set_attribute('color', '255,0,0')

可修改的参数中也存在着推荐的参数属性
蓝图系统使得使用者更容易地在虚拟编辑器中定制他们想要的人物

生成人物

一旦我们定义好了蓝图,生成人物是十分方便的

transform = Transform(Location(x=230, y=195, z=40), Rotation(yaw=180)) 
actor = world.spawn_actor(blueprint, transform)

生成人物的函数有两种,spawn_actor以及try_spawn_actor.前者会在人物无法生成的时候提出异常,而后者会返回一个None 生成失败最常见的错误就是在出生点的碰撞,也就是说人物是无法在我们选择的地址生成的,或许有另外一个物体在我们想要的生成点。

为了简化找到生成点的人物,map物体提供了一系列推荐生成点

spawn_points = world.get_map().get_spawn_points()

最后,生成函数有可选的参数,这个参数可以控制是否让一个人物连接到另外一个人物身上,这个对于传感器特别管用。在以下的例子中,摄像头一个连接在我们的车辆之上

camera = world.spawn_actor(camera_bp, relative_transform, attach_to=my_vehicle)

操控人物

一旦我们在世界上有了人物,那我们可以让人物四处移动并且检查它的动态属性

location = actor.get_location() 
location.z += 10.0 
actor.set_location(location)
print(actor.get_acceleration())
print(actor.get_velocity())

我们甚至能够通过关闭一个人物的物理模拟从而使人物暂停

actor.set_stimulate_physics(False)

一旦我们不想要一个人物了,我们可以将其移出

actor.destory()

为了提高执行效率,大部分的操作都是向模拟器异步地发出请求,但是每一帧能够处理的方法是有限的,如果我们调用了太多的set方法,那么就会有一个明显的延迟即lag

交通工具

交通工具是一种提供了额外方法的人物,出了对于人物通用的处理方法,交通工具也能通过提供油门,刹车,方向盘的数据进行控制

vehicle.apply_control(carla.VehicleControl(throttle=1.0, steer=-1.0))
carla.VehicleControl( 
     throttle = 0.0 
     steer = 0.0
     brake = 0.0 
     hand_brake = False 
     reverse = False 
     manual_gear_shift = False 
     gear = 0)

以上是VehicleControl的属性以及默认值
另外,车辆的物理属性也可以被调整

vehicle.apply_physics_control(carla.VehiclePhysicsControl(max_rpm = 5000.0, center_of_mass = carla.Vector3D(0.0, 0.0, 0.0), torque_curve=[[0,400],[5000,400]]))
#torque --- 扭转力

以上是通过VehiclePhysicsControl这个对象来控制的
如果想要对每个车轮进行控制 可以通过WheelPhysicsContril来控制

carla.VehiclePhysicsControl( 
 torque_curve,                     #torque_curve:表示汽车引擎在特定转速下的扭转力
 max_rpm,                            #max_rpm:汽车引擎每分钟的最大旋转数
 moi,                                       #moi:汽车引擎的转动惯量
 damping_rate_full_throttle,   #damping_rate_full_throttle:油门加满时候的阻尼速率?
 damping_rate_zero_throttle_clutch_engaged,     #damping_rate_zero_throttle_clutch_engaged:当油门为0而离合器接合时候的阻尼速率
 damping_rate_zero_throttle_clutch_disengaged, 
 use_gear_autobox,
 gear_switch_time, 
 clutch_strength, 
 mass, drag_coefficient, 
 center_of_mass, steering_curve, 
 wheels)                                #wheels:关于WheelPhysicsControl的物体列表 一般有二轮或者四轮的

carla.WheelPhysicsControl(
 tire_friction, 
 damping_rate,
 steer_angle,
 disable_steering)

也可以为车辆设置自动驾驶

vehicle.set_autopilot(True)

很多人可能有这样的错觉就是我们的自动驾驶是基于机器学习技术的,其实不然,我们需要澄清我们的自动驾驶是完全基于硬编码。
最后,车辆有封装他们的bounding box

box = vehicle.bounding_box 
print(box.location) # Location relative to the vehicle.
print(box.extent) # XYZ half-box extents in meters.

传感器

除了交通工具和传感器,在世界中还有其他的物体。可以通过world.get_actors()方法获得
在这些actors当中,你还可以获得
Traffic lights:有着state属性来指示当前的状态
Speed limit signs:它的速度标志是其type_id之中
Spectator:作为整个窗口的视角

改变天气

灯光效果和天气状况可以通过世界这个物体来请求和改变

weather = carla.WeatherParameters( 
     cloudyness=80.0, 
     precipitation=30.0, 
     sun_altitude_angle=70.0) 
 world.set_weather(weather)
 print(world.get_weather())

为了方便,我们有一系列提前定好的天气

world.set_Weather(carla.WeatherParameters,WetCloudySunset)

地图和航图基准点(waypoints)

Carla的一个特点就是我们的道路是完全注释的。我们也提供了更高层次的API来查询和引导这个数据
首先,我们要获得当前世界的道路

map = world.get_map()

该地图有着name的属性,与当前载入的城市相符合Town01.我们也可以通过map.get_spawn_point()函数获得map推荐的生成点
然而,航图基准点才是map API中最强大的武器。我们可以让map给我一个道路上最接近我们车辆的道路基准点

wap_point = map.get_waypoint(vehicle.get_location())

这个对象是处在可行驶的车道上,他的朝向是该店的道路方向。
(在我看来就是道路上的一个个点,比如一条路上可能有十个点,如果交叉路口也是一个点)
Waypoints也包含一个next函数,这个函数返回距离当前点一定的距离的可以根据交通规则访问到的点的列表。也就是说,如果一个车辆处于该点,那么该函数就给出了该点可以到达的可能目标

# Retrieve the closest waypoint.
waypoint = map.get_waypoint(vehicle.get_location()) 
# Disable physics, in this example we're just teleporting the vehicle. 
vehicle.set_simulate_physics(False)
while True:
# Find next waypoint 2 meters ahead. 
 waypoint = random.choice(waypoint.next(2.0)) 
# Teleport the vehicle.
vehicle.set_transform(waypoint.transform)

map对象提供了生成大量在一定范围内的waypoints的方法

waypoint_list = map.generate_waypoints(2.0)

对于路由的目的,我们可以获取道路的拓扑图

waypoint_tuple_list  = map.get_topology()

该方法返回了一个数组,数组中的每个元素是一个元祖,一个元祖包含两个元素,第一个元素和第二个相互连接,该生成方法包含了最小生成树,每个道路也只包含一个基准点

录像以及重播系统

Carla包含了一个录像和重播API,这使得我们可以把我们的模拟记录到一个文件当中,然后再之后重播这段模拟,这个文件只能在服务器端写,(如果server和client在一个电脑上当我没说),文件记录了对象生成和摧毁的过程以及交通信号灯的状态以及所有车辆和行人的方向和位置
所有的数据都写在服务器端的一个二进制文件当中,在CarlaUE4/Saved.据估计,一个包含50个红绿灯和100个车辆的一小时录像占大约200MB的空间

开启录像我们只需要提供一个文件名

client.start_recording("recording01.log")

关闭录像

client.stop_recorder()

在任何时候我们可以重播

client.replay_file("recording01.log")
``
当我们重播时,有一些可选的参数,完整API如下
```python
client.replay_file("recording01.log",start,duration,camera)

如果想要知道录像的细节,使用以下API

client.show_recorder_file_info("recording01.log")

client.show_recorder.collisions(“recording01.log”,“a”,“a”) //会显示所有被记录的碰撞
a a: 会显示所有被记录的碰撞
v v: 会显示所有的交通工具之间的碰撞
v t: 会显示交通工具和信号灯的碰撞
v w: 会显示交通工具和行人的碰撞
v o: 会显示交通工具和其他物体之间的碰撞,比如静态的房屋等等
h w: 会显示主物体和行人的碰撞

第一个物体就是hero actor
可以通过文件的记录来replay当时碰撞的情形,只需要将start提前一些进行播放即可

有一些写好的可以使用录像和重播系统的py文件

最后关于录制系统的翻译就稍微偷偷懒了,各位看官们就去看看原文档吧,目前这一部分还不怎么需要用到,很多地方都是直译,请谅解!

你可能感兴趣的:(CARLA 0.9 版本 Python API Tutorial 翻译)