笔记16:Carla官方文档阅读 -- 2nd【Actors and Blueprints】/【(2)Actor life cycle】/【1)Spawning】

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())
# ------------------------------------------------------------------------------------------------------------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值