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

相关推荐
聪明的笨猪猪1 小时前
Java Spring “IOC + DI”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
im_AMBER2 小时前
Web 开发 24
前端·笔记·git·学习
烧冻鸡翅QAQ3 小时前
考研408笔记
笔记·考研
StarPrayers.3 小时前
卷积层(Convolutional Layer)学习笔记
人工智能·笔记·深度学习·学习·机器学习
能不能别报错4 小时前
K8s学习笔记(十五) pause容器与init容器
笔记·学习·kubernetes
无言以对,沉默不语,随你随你。4 小时前
【解决办法】GitBash不能在任意文件夹打开
经验分享·笔记·git
牛马大师兄5 小时前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
wan5555cn5 小时前
Windows 11系统鼠标键盘被禁用问题的全面解决方案
windows·笔记·深度学习·计算机外设
zhangrelay6 小时前
ROS云课三分钟-使用动态参数重配置调试Teb导航案例-251008
笔记·学习
BingeBlog6 小时前
[01] Qt的UI框架选择和对比
开发语言·c++·笔记·qt·ui·开源软件