Carla自带样例:automatic_control.py解析

文章目录

find_weather_presets()

这个函数的目的是:

从 Carla 的 WeatherParameters 中找出所有天气预设

将预设的驼峰命名转换为更可读的格式

返回预设的实际值和可读名称列表

例如,对于 "ClearNoon",函数会返回对应的天气预设值和 "Clear Noon" 这样可读的名称。

python 复制代码
def find_weather_presets():
    """Method to find weather presets"""
    rgx = re.compile('.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)')
    def name(x): return ' '.join(m.group(0) for m in rgx.finditer(x))
    presets = [x for x in dir(carla.WeatherParameters) if re.match('[A-Z].+', x)]
    return [(getattr(carla.WeatherParameters, x), name(x)) for x in presets]

get_actor_display_name

函数的主要目的是:

用于获取(Actor)显示名称的函数

从演员的类型ID中提取一个更友好、可读的显示名称

如果名称过长,进行截断并添加省略号

如果 actor.type_id 是 "vehicle_car_tesla",最终 name 会是 "Car Tesla"

python 复制代码
def get_actor_display_name(actor, truncate=250):
    """Method to get actor display name"""
    name = ' '.join(actor.type_id.replace('_', '.').title().split('.')[1:])
    return (name[:truncate - 1] + u'\u2026') if len(name) > truncate else name

get_actor_blueprints()

函数的主要目的是:

根据传入的过滤器(filter)筛选蓝图

根据代际(generation)进一步筛选蓝图

处理各种特殊情况,如全部、单一蓝图、无效代际等

这个函数在自动驾驶模拟器(如Carla)中用于精确选择要生成的车辆或演员蓝图,提供了灵活的筛选机制

例子:获取第2代特定类型的蓝图

gen2_blueprints = get_actor_blueprints(world, "vehicle.tesla", "2")

python 复制代码
def get_actor_blueprints(world, filter, generation):
    bps = world.get_blueprint_library().filter(filter)

    if generation.lower() == "all":
        return bps

    # If the filter returns only one bp, we assume that this one needed
    # and therefore, we ignore the generation
    if len(bps) == 1:
        return bps

    try:
        int_generation = int(generation)
        # Check if generation is in available generations
        if int_generation in [1, 2, 3]:
            bps = [x for x in bps if int(x.get_attribute('generation')) == int_generation]
            return bps
        else:
            print("   Warning! Actor Generation is not valid. No actor will be spawned.")
            return []
    except:
        print("   Warning! Actor Generation is not valid. No actor will be spawned.")
        return []

restart()

python 复制代码
    def restart(self, args):
        """Restart the world"""
        # Keep same camera config if the camera manager exists.
        #保存当前相机的索引和变换索引
        #如果相机管理器不存在,则使用默认值0
        cam_index = self.camera_manager.index if self.camera_manager is not None else 0
        cam_pos_id = self.camera_manager.transform_index if self.camera_manager is not None else 0

        # Get a random blueprint.
        # get_actor_blueprints() 获取可用的蓝图列表
        blueprint_list = get_actor_blueprints(self.world, self._actor_filter, self._actor_generation)
        if not blueprint_list:
            raise ValueError("Couldn't find any blueprints with the specified filters")
        blueprint = random.choice(blueprint_list)
        # 设置角色名为 'hero',随机选择一个推荐颜色
        blueprint.set_attribute('role_name', 'hero')
        if blueprint.has_attribute('color'):
            color = random.choice(blueprint.get_attribute('color').recommended_values)
            blueprint.set_attribute('color', color)

        # Spawn the player. 将已存在的车辆更换位置重新生成
        if self.player is not None:
            spawn_point = self.player.get_transform()
            spawn_point.location.z += 2.0
            spawn_point.rotation.roll = 0.0
            spawn_point.rotation.pitch = 0.0
            self.destroy()
            self.player = self.world.try_spawn_actor(blueprint, spawn_point)
            self.modify_vehicle_physics(self.player)
        while self.player is None:
            if not self.map.get_spawn_points():
                print('There are no spawn points available in your map/town.')
                print('Please add some Vehicle Spawn Point to your UE4 scene.')
                sys.exit(1)
            # 获取当前地图中所有预定义的生成点
            spawn_points = self.map.get_spawn_points()
            # 随机选择一个生成点
            spawn_point = random.choice(spawn_points) if spawn_points else carla.Transform()
            # 尝试在选定的生成点生成一个演员(车辆)
            self.player = self.world.try_spawn_actor(blueprint, spawn_point)
            # 对新生成的车辆调用物理特性修改方法
            self.modify_vehicle_physics(self.player)
        # 根据同步参数,更新世界状态
        if self._args.sync:
            self.world.tick()
        else:
            self.world.wait_for_tick()

        # Set up the sensors.
        # 碰撞传感器
        self.collision_sensor = CollisionSensor(self.player, self.hud)
        # 车道入侵传感器
        self.lane_invasion_sensor = LaneInvasionSensor(self.player, self.hud)
        # GNSS传感器
        self.gnss_sensor = GnssSensor(self.player)
        # 相机管理器
        # 1.创建一个摄像机管理器实例 2.设置摄像机的变换索引 3.设置具体的摄像机传感器
        # 这段代码确保了在重新生成车辆后,摄像机能够保持之前的配置,提供连续的模拟体验
        self.camera_manager = CameraManager(self.player, self.hud)
        self.camera_manager.transform_index = cam_pos_id
        self.camera_manager.set_sensor(cam_index, notify=False)
        # 获取车辆显示名称
        actor_type = get_actor_display_name(self.player)
        # 在抬头显示(HUD)上通知
        self.hud.notification(actor_type)

next_weather

相关推荐
Octopus20776 分钟前
【Linux】git操作
linux·笔记·git·学习
从善若水12 分钟前
【Rust 学习笔记】Rust 基础数据类型介绍——数组、向量和切片
笔记·学习·rust
荷逸同学14 分钟前
小红书笔记采集链接版 | 同步飞书
笔记·飞书
努力学习的少女14 分钟前
linux/centOS7用户和权限管理笔记
linux·运维·笔记
胡楚昊1 小时前
攻防世界安卓刷题笔记(新手模式)1-4
笔记
阿龍17871 小时前
个人ffmpeg笔记(一)
笔记·ffmpeg
相醉为友3 小时前
091 脉冲波形的变换与产生
笔记
二进制怪兽3 小时前
[笔记] 编译LetMeowIn(C++汇编联编程序)过程
汇编·c++·笔记
Darker'K3 小时前
泷羽sec-burp(6)暴力破解与验证码识别绕过(上,在Kali上搭建ddddocr、aiohttp环境) 学习笔记
笔记·学习