笔记14:Carla官方文档阅读 -- 2nd【Actors and Blueprints】/【(3)Types of Actors】/【1)Sensors】

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
import time

try:
    client = carla.Client("localhost", 2000)
    client.set_timeout(10.0)
    world = client.get_world()

    vehicle_actor_blueprint = random.choice(world.get_blueprint_library().filter("vehicle.*.*"))
    vehicle_actor_Location = carla.Location(x = 100, y = 200, z = 40)
    vehicle_actor_Rotation = carla.Rotation(yaw = 180)
    vehicle_actor_transform = carla.Transform(vehicle_actor_Location, vehicle_actor_Rotation)
    vehicle_actor = world.spawn_actor(vehicle_actor_blueprint, vehicle_actor_transform)
    print("\n", vehicle_actor)          # Actor(id=609, type=vehicle.mini.cooperst)
    print(type(vehicle_actor))          # <class 'carla.libcarla.Vehicle'>

    vehicle_actor.set_autopilot(True)




    #(3)Types of actors
    # ------------------------------------------------------------------------------------------------------------------------
    # 1.传感器 -- Sensors          【参考资料:demo -- tutorial.py】
    camera_actor_blueprint = world.get_blueprint_library().filter("sensor.camera.*")[0]
    camera_actor_relative_transform = carla.Transform(carla.Location(x = 1.5, z = 2.4))
    camera_actor = world.spawn_actor(camera_actor_blueprint, camera_actor_relative_transform, attach_to = vehicle_actor)
    print("\n", camera_actor)           # Actor(id=260, type=sensor.camera.depth)
    print(type(camera_actor))           # <class 'carla.libcarla.ServerSideSensor'>
                                        # 注:这个【类 carla.SeverSideSensor】我在官方文档上没有找到,函数【listen()】是属于【类 carla.Sensor】的
                                        #     我本来以为这个东西的类型是【carla.Actor】,但其实不是
                                        #     (1)每一个创建出来的actor在【直接输出时】 -- 结果类型是【carla.Actor】
                                        #     (2)但是每一个actor他的类型可不是【carla.Actor】,而是 -- 车辆蓝图   对应 【carla.Vehicle】
                                        #                                                          -- 传感器蓝图 对应 【carla.Sensor】    .....

    # 注:传感器是用来监听数据的,当接收到数据后,传感器会调用一个由【lambda表达式】描述的【函数】
    # cc = carla.ColorConverter.LogarithmicDepth        # 注:这个转换 -- 使用对数刻度将图像转换为深度图,从而在小距离上获得更好的精度,但在距离较远时会丢失精度
    camera_actor.listen(lambda image: image.save_to_disk('out/%06d.png' % image.frame))
                                        # 函数【carla.Sensor.listen(self, callback)】:
                                        #           参数:callback是一个函数的引用【注:函数名/匿名函数 均可】
                                        #           作用:用于注册一个回调函数(callback 指向这个函数),以便在每次相机演员生成新图像时被调用【注意:callback指向的函数需要一个包含 “类型carla.SensorData” 的参数才能使用】
                                        # 类【carla.SensorData】:
                                        #           作用:是所有【包含carla.Sensor生成的数据】的【对象】的基类,该【对象】应该是【传感器正在监听的 “函数” 的 “参数”】
                                        #           注:每个传感器都需要特定类型的传感器数据(在【类 carla.SensorDta】中列出了所有的传感器数据类型)
                                        # 函数【carla.Image.save_to_disk(self, path, color_converter = Raw)】:
                                        #           参数:path -- 存储到的磁盘路径 --  str
                                        #                color_converter -- 转换模式(默认转换模式是Raw) -- 类【carla.ColorConverter】
                                        #           作用:将生成的图片存储到指定位置的磁盘中
                                        # 属性【frame】:image 的类型为【carla.Image】,这个类里没有【frame】这个属性,但是这个类是继承自【carla.SensorData】的,这个类里面有【frame】属性
    # 该行语句解读:camera_actor这个传感器接收到一次新数据,就通过函数【carla.Sensor.listen()】调用一次函数【listen()】中参数callback指向的函数,这里这个函数是一个匿名函数
    #              而【callback指向的这个函数】的【参数类型】必须是【类 carla.SensorData】的子类,且这个子类还要跟传感器的类型相匹配,因此这里的【image】参数,类型 -- 【深度相机】对应的数据类型【类 carla.Image】
    # 因为:每种传感器产生的数据的数据类型都是不同的,所以为了继续宁区分,所以传入callback指向函数的参数的类型必须一致
    # ------------------------------------------------------------------------------------------------------------------------




    # ------------------------------------------------------------------------------------------------------------------------
    # 注:更新车辆位置
    new_location = vehicle_actor.get_location()
    new_location.x += 40
    vehicle_actor.set_location(new_location)
    # ------------------------------------------------------------------------------------------------------------------------




    # ------------------------------------------------------------------------------------------------------------------------
    # 注:重要步骤!!!!!!
    #       如果没有这个步骤,那么程序执行完以后就直接终止了,相机都没来得及产生出图片,更没来得及保存
    #       所以一定要让程序执行一段时间再关闭,这时候就需要【time.sleep()】的帮助
    time.sleep(3)
    # ------------------------------------------------------------------------------------------------------------------------


finally:
    pass

注:my_test_script_4

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值