import sys
try:
sys.path.append('D:\work_software\Carla\Carla_0.9.10\CARLA_0.9.10\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.10-py3.7-win-amd64.egg')
except IndexError:
pass
import carla
import random
client = carla.Client("localhost", 2000)
client.set_timeout(5.0)
world = client.get_world()
print(world.id)
#查看所有的actor蓝图:
blueprint_library = world.get_blueprint_library() # 函数【get_blueprint_library()】 -- 作用:返回一个【类 BluePrintLibrary】的实例化对象,即返回所有可用的actor蓝图【列表】
print("\n", blueprint_library) # [ActorBlueprint(id=vehicle.nissan.micra,tags=[vehicle, nissan, micra]), ActorBlueprint(id=vehicle.audi.a2,tags=[vehicle, audi, a2]), ~~]
print(type(blueprint_library)) # <class 'carla.libcarla.BlueprintLibrary'>
#注:
#【类carla.BlueprintLibrary】:【类carla.BlueprintLibrary】包含【类carla.ActorBlueprint】元素的列表,世界对象world可以提供对【类carla.BlueprintLibrary】的访问
#【类carla.ActorBlueprint】:Carla为Actor提供了一个蓝图库,可以通过【类carla.BlueprintLibrary】查阅,其中每一个都包含蓝图的标识符(id)和一系列可修改/不可修改的属性。
# 该类是库和演员创建之间的中间步骤,演员需要一个演员蓝图才能产生,这些将所述蓝图的信息及其属性和一些标签存储在对象中以对其进行分类,然后用户可以自定义一些属性并最终通过carla.World生成演员
#
#我的理解:
# 在Carla这个模拟器中,有很多的actor,有157种不同的actor
#【类carla.BlueprintLibrary】的作用在于 -- 作用:用来【提供】一个【列表】给我们 ---这个列表包含了所有【系统已经内定的】actor的蓝图,当我们想用哪个蓝图来创建actor时,直接在这个列表里搜索对应的id即可
# 【提供】【所有蓝图组成的列表】
#【类carla.ActorBlueprint】的作用在于 -- 作用:用来【创建】某个actor的【蓝图】 ---例如【ActorBlueprint(id=vehicle.nissan.micra,tags=[vehicle, nissan, micra])】就是【模拟器内定】的所有actor蓝图的其中一个,【carla模拟器】【通过这个类】【创建了157种不同actor蓝图】
# 【创建】【指定的某个蓝图(可以是系统内定的,也可以是用户自建的)】
#
# 我将所有内建的actor蓝图放在了文件all_actor_blueprint.txt中
print("-------------------------------------")
#寻找摸特定的actor蓝图
collision_sensor_bp = blueprint_library.find('sensor.other.collision') # 函数【find(self, id)】:属于【类 BluePrintLibrary】
# 作用:返回与该标识符对应的蓝图,返回值类型为【类 carla.ActorBlueprint】
print("\n", collision_sensor_bp) # ActorBlueprint(id=sensor.other.collision,tags=[sensor, other, collision])
print(type(collision_sensor_bp)) # <class 'carla.libcarla.ActorBlueprint'>
print("-------------------------------------")
#随机选择一个actor蓝图
vehicle_bp = random.choice(blueprint_library.filter('vehicle.*.*')) # 函数【filter(self, wildcard_pattern)】:属于【类 BluePrintLibrary】
# 作用:过滤与此库中包含的每个蓝图的id和标签相匹配的蓝图的列表,返回值类型为【类 carla.BluePrintLibrary】
print("\n", vehicle_bp) # ActorBlueprint(id=vehicle.diamondback.century,tags=[century, vehicle, diamondback])
print(type(vehicle_bp)) # <class 'carla.libcarla.ActorBlueprint'>
print("-------------------------------------")
#判断一个actor蓝图是 四轮车 or 二轮车
vehicle_blueprint = blueprint_library.filter('vehicle.*')[0]
print("\n", vehicle_blueprint) # ActorBlueprint(id=vehicle.citroen.c3,tags=[vehicle, c3, citroen])
print(type(vehicle_blueprint)) # <class 'carla.libcarla.ActorBlueprint'>
print(vehicle_blueprint.id) # vehicle.citroen.c3
is_have = vehicle_blueprint.has_attribute('number_of_wheels') #函数【has_attribte()】:属于【类 ActorBlueprint】
# 作用:如果蓝图包含该【属性】则返回True
print("\nis_have = ", is_have) # is_have = True
print("type(is_have) = ", type(is_have)) # type(is_have) = <class 'bool'>
num_x = vehicle_blueprint.get_attribute('number_of_wheels') #函数【get_attribte()】:属于【类 ActorBlueprint】
# 作用:返回演员的属性以及id标识符(如果存在)
print("\nnum_x = ", num_x) # num_x = ActorAttribute(id=number_of_wheels,type=int,value=4(const))
print("type(num_x) = ", type(num_x)) # type(num_x) = <class 'carla.libcarla.ActorAttribute'>
# 注:【类 ActorAttribute】的主要目的是用于修改那些可以被改值的属性的
num_y = vehicle_blueprint.get_attribute('number_of_wheels').as_int() #函数【as_int()】:属于【类 ActorAttribute】
# 作用:转化数据类型为 int
print("\nnum_y = ", num_y) # num_y = 4
print("type(num_y) = ", type(num_y)) # type(num_y) = <class 'int'>
if num_y == 4:
vehicle_blueprint.set_attribute('color', '255,0,0') #函数【set_attribute(self, id, value)】:属于【类 ActorAttribute】
# 注:在哪里查找一个蓝图/一个actor所包含的所有的属性
# carla官方文档 -- References -- Blueprint Library
# 所有的蓝图,对应有什么属性,哪些属性可修改,在里面标的清清楚楚,chatgpt只会瞎编函数然后一个劲的道歉,我瞧你吗
print("-------------------------------------")
#对一个蓝图所有可修改属性进行改值
blueprint = ["color", "number_of_wheels", "object_type", "role_name", "sticky_control"] # 由蓝图库可知它具有五个属性,三个可修改
for atr in blueprint:
if vehicle_blueprint.has_attribute(atr):
print("属性:", atr, "存在")
print(vehicle_blueprint.get_attribute(atr).id)
print(vehicle_blueprint.get_attribute(atr).is_modifiable)
# 注意!!!!!
# 【类 ActorAttribute】在官方文档中有属性【is_modabilible】,但是程序报错说用不了
# 是因为官方文档写错了,这个属性不是【is_modabilible】,而是【is_modifiable】
else:
print("属性:", atr, "不存在")
print("-------------------------------------")
笔记17:Carla官方文档阅读 -- 2nd【Actors and Blueprints】/【(1)Blueprints】
于 2023-07-04 10:34:54 首次发布