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
client = carla.Client("localhost", 2000)
client.set_timeout(5.0)
world = client.load_world("Town01")
#(1)Spawning
# ------------------------------------------------------------------------------------------------------------------------
# 注:生成一个actor需要2部分 -- 【1个 carla.ActorBlueprint】 + 【1个 carla.Transform】
# 【carla.ActorBlueprint】 -- 指定蓝图,指定要创建的actor的种类,是一个什么样的actor,都有什么属性
# 【carla.Transform】 -- 指定演员的初始位置和朝向角【即:生成点】
# 注:生成一个actor有2种方法 -- 【carla.World.spawn_actor()】 / 【carla.World.try_spawn_actor()】
# 【carla.World.spawn_actor()】 -- 若生成失败,则会引发异常 -- 生成成功,返回 carla.Actor
# 【carla.World.try_spawn_actor()】 -- 若生成失败,则会返回None而不是抛出异常 -- 生成成功,返回 carla.Actor
vehicle_actor_blueprint = world.get_blueprint_library().filter("vehicle.*.*")[0]
print("\n", vehicle_actor_blueprint) # ActorBlueprint(id=vehicle.citroen.c3,tags=[vehicle, c3, citroen])
vehicle_actor_transform = carla.Transform(carla.Location(x = 230, y = 195, z = 40), carla.Rotation(yaw = 180))
# 函数【carla.World.spawn_actor()】:函数的参数涉及的类为【carla.Location】【carla.Rotation】
# 注意:【carla的坐标系】和【虚幻引擎编辑器的坐标系】在表示旋转信息时的参数顺序不同
# carla使用的是虚幻引擎(Unreal Engine)的坐标系,在carla中,车辆的旋转信息(carla.Rotation)的构造函数参数顺序是(pitch, yaw, roll)
# 在虚幻引擎编辑器中,旋转信息的参数顺序是(roll, pitch, yaw)
# 因此:在将旋转信息从【虚幻引擎编辑器】【转换】到【carla】时,需要注意参数顺序的不同,以确保正确地设置车辆的旋转信息
vehicle_actor = world.spawn_actor(vehicle_actor_blueprint, vehicle_actor_transform)
print(vehicle_actor) # Actor(id=1139, type=vehicle.citroen.c3)
# 注意:成功由actor蓝图升级为了真正的actor对象,类型变成了【carla.Actor】
# ------------------------------------------------------------------------------------------------------------------------
# 注1:如果在用户指定actor生成的位置上发生碰撞,则不会生成actor
# 注2:生成点包含两部分 -- (1)坐标【carla.Location】 (2)旋转角【carla.Rotation】
# 函数【carla.Map.get_spawn_points()】:返回对【Vehicles】类型的actor推荐的【生成点】【列表】 -- 这些生成点都在【车道】上
vehicle_spawn_points = world.get_map().get_spawn_points()
print("\n", vehicle_spawn_points) # [<carla.libcarla.Transform object at 0x00000209D90E3A50>, <carla.libcarla.Transform object at 0x00000209D90E3AB0>, ~~]
print(type(vehicle_spawn_points)) # <class 'list'>
# 函数【carla.World.get_random_location_from_navigation()】:返回对【Walkers】类型的actor推荐的【生成点】中【随机的一个】 -- 这些生成点都在【人行道】上
walker_spawn_point = carla.Transform() # 注:使用【类 carla.Transform】实例化对象的时候,不给出参数,则返回的实例化对象给出的【生成点】【坐标 carla.Location】是【随机】的,【旋转角 carla.Rotation】是默认的
print("\n", walker_spawn_point) # Transform(Location(x=0.000000, y=0.000000, z=0.000000), Rotation(pitch=0.000000, yaw=0.000000, roll=0.000000))
print(type(walker_spawn_point)) # <class 'carla.libcarla.Transform'>
print("\n", walker_spawn_point.location) # Location(x=0.000000, y=0.000000, z=0.000000)
# 注:location是【类 carla.Transform】中定义的属性,返回当前【生成点】的【坐标 carla.Location】,但不返回【旋转角 carla.Rotation】
print(type(walker_spawn_point.location)) # <class 'carla.libcarla.Location'>
walker_spawn_point.location = world.get_random_location_from_navigation()
# ------------------------------------------------------------------------------------------------------------------------
# 注:一个 actor 在生成时可以【附加】到另一个 actor 上
# 例子:实现将相机【刚性】地连接到车辆上,即它们的相对位置保持固定
camera_actor_blueprint = world.get_blueprint_library().filter("sensor.camera.*")[0] # 创建相机actor
print("\n", camera_actor_blueprint) # ActorBlueprint(id=sensor.camera.depth,tags=[sensor, camera, depth])
print(type(camera_actor_blueprint)) # <class 'carla.libcarla.ActorBlueprint'>
camera_actor_transform = carla.Transform(carla.Location(x = 1.5, y = 0, z = 2.0), carla.Rotation(pitch = 0, yaw = 0, roll = 0))
camera_actor = world.spawn_actor(camera_actor_blueprint, camera_actor_transform, attach_to = vehicle_actor, attachment_type = carla.AttachmentType.Rigid)
walker_actor_blueprint = world.get_blueprint_library().filter("walker.*.*")[0] # 创建行人actorw
print("\n", walker_actor_blueprint) # ActorBlueprint(id=walker.pedestrian.0007,tags=[walker, pedestrian, 0007])
print(type(walker_actor_blueprint)) # <class 'carla.libcarla.ActorBlueprint'>
walker_actor_transform = carla.Transform(carla.Location(x = 230, y = 195, z = 40), carla.Rotation(yaw = 180))
walker_actor = world.spawn_actor(walker_actor_blueprint, walker_actor_transform)
# ------------------------------------------------------------------------------------------------------------------------
# 例子:查看当前world中所有的actor
actor_list = world.get_actors() # 函数【carla.World.get_actors()】:返回这个world当前所有actor的列表,列表类型为【carla.ActorList】,列表中所有的元素类型都是【carla.Actor】
print("\n", actor_list) # [Actor(id=94, type=traffic.traffic_light), Actor(id=150, type=static.prop.mesh), ~~ ]
print(type(actor_list)) # <class 'carla.libcarla.ActorList'>
my_create_vehicle_test1 = actor_list.find(259) # 函数【carla.ActorList.find( int类型数据 -- id )】
print("\n", my_create_vehicle_test1) # None
print(type(my_create_vehicle_test1)) # <class 'NoneType'>
my_create_vehicle_test2 = actor_list.filter("vehicle.citroen.c3") # 函数【carla.ActorList.filter( str类型数据 -- type )】
print("\n", my_create_vehicle_test2) # [Actor(id=435, type=vehicle.citroen.c3)] 注意:每次id(int)都不一样
print(type(my_create_vehicle_test2)) # <class 'carla.libcarla.ActorList'>
print("\n")
for speed_sign in actor_list.filter('traffic.speed_limit.*'):
print(speed_sign.get_location())
# ------------------------------------------------------------------------------------------------------------------------
笔记16:Carla官方文档阅读 -- 2nd【Actors and Blueprints】/【(2)Actor life cycle】/【1)Spawning】
于 2023-07-04 20:42:48 首次发布