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

相关推荐
兴趣使然_31 分钟前
【笔记】使用 html 创建网址快捷方式
笔记·html·js
aramae2 小时前
C++ -- STL -- vector
开发语言·c++·笔记·后端·visual studio
fen_fen3 小时前
学习笔记(32):matplotlib绘制简单图表-数据分布图
笔记·学习·matplotlib
饕餮争锋6 小时前
设计模式笔记_创建型_建造者模式
笔记·设计模式·建造者模式
萝卜青今天也要开心7 小时前
2025年上半年软件设计师考后分享
笔记·学习
吃货界的硬件攻城狮7 小时前
【STM32 学习笔记】SPI通信协议
笔记·stm32·学习
蓝染yy7 小时前
Apache
笔记
lxiaoj1118 小时前
Python文件操作笔记
笔记·python
半导体守望者9 小时前
ADVANTEST R4131 SPECTRUM ANALYZER 光谱分析仪
经验分享·笔记·功能测试·自动化·制造
啊我不会诶10 小时前
倍增法和ST算法 个人学习笔记&代码
笔记·学习·算法