目录
agent.py
- 该文件定义了一个抽象类 Agent,用于在 Habitat 环境中实现智能体(agent)。
- Agent类包含两个抽象方法:reset() 和 act(),用户需要继承这个类并实现这两个方法以创建具体的智能体。
benchmark.py
- benchmark.py 定义了一个通用的基准测试类 Benchmark,用于评估 habitat.Agent 在 habitat.Env 环境中的性能。单独创建了环境和agent,模拟运行并且获取评估metrics以进行测试。
- 这个类中有remote_evaluate(), local_evaluate(), evaluate()三个方法,实现远程评估和本地评估。evaluate()只是简单调用前两个方法。
- local_evaluate()中,环境在本地运行之后获取了指标数值,再对评估指标进行平均。而远程评估中,环境不在本地运行,本地与远程评估服务器通信,获取观测值、发送动作并接收评估结果。
challenge.py
继承benchmark类,导入专门的config,用于挑战赛评估。
dataset.py
- 该模块提供了数据集相关的功能,这些功能可以被 habitat.EmbodiedTask 使用。
- 数据集抽象为多个 Episode 的集合。每个 Episode 包含一个 Agent 在特定环境 Env 中的一次实例化,表示一次完整的任务执行过程。
class BaseEpisode:
# only the episode_id and scene_id
class Episode(BaseEpisode):
# initial position and rotation of agent, scene id, episode.
class Dataset(Generic[T]):
# 泛型类允许在类定义中使用类型参数(如这里的 T),从而使得类可以在不同类型的对象上进行操作,而不需要在每次实例化时都指定具体的类型。
# 这个类的作用包括数据集的分割,提取等等
class EpisodeIterator(Iterator[T]):
# 一个用于迭代 Episode 列表的类,它提供了多种选项来控制如何遍历这些 Episode。
#该类的主要目的是优化模拟器性能,通过合理安排场景(scene)的加载顺序,减少频繁切换场景带来的开销,并防止模型对特定场景过拟合。
embodied_task.py
用于定义和管理智能体(agent)在环境中执行的任务。它封装了任务的动作空间、观测空间、度量标准(measures)、传感器套件(sensor suite)等关键元素,并提供了与环境交互的方法,如重置任务和执行动作。
class Action:
# 是动作的基础类,每个具体的动作类(如 MoveForwardAction,)都继承自这个基础类,并实现其抽象方法。
# Action 类提供了重置状态、执行动作和获取动作空间的功能。这些方法需要在子类中实现
class SimulatorTaskAction(Action):
# 是 Action 类的一个子类,专门用于封装模拟器中的动作。可以通过调用模拟器的方法来实现具体的动作。
class Measure:
# 定义和计算任务度量标准的基础类
# 每个具体的度量标准类(如 DistanceToGoal, SuccessRate 等)都继承自这个基础类,并实现其抽象方法。
# 方法包括:reset_metric,update_metric,get_metric
class Metrics(dict):
# 继承自 Python 内置的 dict 类,因此可以像普通字典一样使用,专门用于存储和访问任务中的度量值。
class Measurements:
# 管理一组度量标准的核心类。提供了初始化、重置、更新和获取度量结果的功能
# 继承 Measure 类并实现其抽象方法,用户可以轻松地定义和扩展新的度量标准类型。
class EmbodiedTask:
# 定义智能体需要解决的任务。封装了任务的动作空间、观测空间、度量标准、传感器套件等关键元素,并提供了与环境交互的方法,如重置任务和执行动作。
env.py
只有两个类:
class Env:
# Env 类是所有具体环境类的基础,将任务、模拟器和数据集连接在一起
# 定义了:模拟器/任务/观测空间/动作空间/episode是否结束/重置环境返回观测/常用的env.step()和env.close()方法
class RLEnv(gym.Env):
# 继承自 gym.Env,用于强化学习(RL)任务。封装了 Env 类
# 主要区别是加上reward相关函数
environments.py
相比于上一个env.py,这个文件中的环境是针对具体任务的
class RLTaskEnv(habitat.RLEnv):
# 继承自 habitat.RLEnv。
# 它为特定的强化学习任务提供了更具体的实现,通过配置文件定义奖励和成功评判方法
# 并根据这些度量计算奖励、判断 episode 是否结束以及提供额外信息
@habitat.registry.register_env(name="GymRegistryEnv")
class GymRegistryEnv(gym.Wrapper):
# 将 Gym 环境注册并包装为可以与 Habitat 基线(habitat-baselines)兼容的形式
# 可以轻松地将现有的 Gym 环境集成到 Habitat 的工作流中
# 创建实例使用: gym_registry_env = GymRegistryEnv(config=config)
@habitat.registry.register_env(name="GymHabitatEnv")
class GymHabitatEnv(gym.Wrapper):
# 将 RLTaskEnv 包装为 Gym 环境,以便使用默认的 Gym API
logging.py
定义了class HabitatLogger(logging.Logger):
实例化为logger = HabitatLogger()
如何使用:
import logging
from habitat.core.logging import logger
# 记录不同级别的日志
logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
# 动态添加文件处理器
logger.add_filehandler("habitat.log")
# 再次记录日志,这次会同时输出到控制台和文件
logger.info("This message will be logged to both console and file")
register.py
- 单例模式:Registry 使用 Singleton 元类确保在整个应用程序中只有一个实例。
- 映射存储:使用collections.defaultdict 存储不同类型的类或对象,键为类型名称(如 “task”、"sim"等),值为字典,其中键为注册名,值为对应的类。
- 注册方法:提供了多个装饰器方法用于注册不同类型的类,如任务、模拟器、传感器等。
- 获取方法:提供了多个方法用于根据键名获取已注册的类。
simulator.py
主要是class Simulator。用于定义模拟器的基本接口和功能。它提供了与环境交互所需的各种方法和属性:
sensor_suite: 返回传感器套件。
action_space: 返回动作空间。
reset: 重置模拟器并返回初始观测结果。
step: 执行动作并返回新的观测结果。
seed: 设置随机种子。
reconfigure: 根据新配置重新配置模拟器。
geodesic_distance: 计算两点之间的测地线距离。
get_agent_state: 获取代理的状态。
get_observations_at: 在指定位置和旋转下获取观测结果。
sample_navigable_point: 采样一个可导航的点。
is_navigable: 判断指定点是否可导航。
action_space_shortest_path: 计算从源到目标的最短路径。
get_straight_shortest_path_points: 获取两点之间最短路径上的点。
up_vector: 获取向上的方向向量。
forward_vector: 获取前向的方向向量。
render: 渲染当前环境的状态。
close: 关闭模拟器。
previous_step_collided: 判断上一步是否发生碰撞。
通过继承 Simulator 并实现其抽象方法,用户可以创建自定义的模拟器。
以下是文件中的类:
# 传感器类型的枚举
class SensorTypes(Enum):
# 传感器抽象基类,定义传感器的基本接口
class Sensor(metaclass=abc.ABCMeta):
# 多个传感器的观测结果
class Observations(Dict[str, Any]):
# Sensor类的具体实现
class RGBSensor(Sensor, metaclass=abc.ABCMeta):
class DepthSensor(Sensor, metaclass=abc.ABCMeta):
class SemanticSensor(Sensor):
class BumpSensor(Sensor):
# 管理一组传感器,并提供统一的接口获取所有传感器的观测结果。
class SensorSuite:
@attr.s(auto_attribs=True)
class AgentState:
@attr.s(auto_attribs=True)
class ShortestPathPoint:
# 定义模拟器的基本接口(方法),所有具体的模拟器类都应继承此抽象基类并实现其方法。
class Simulator:
spaces.py
定义和管理不同类型的观测空间、动作空间等。扩展了 Gym 的 gym.Space 类,提供了更灵活和特定于 Habitat 的空间类型。
# 用于表示没有参数的动作空间。它总是返回 None
class EmptySpace(Space):
# 提供随机采样和检查空间中是否包含某个值的功能
class ActionSpace(gym.spaces.Dict):
# 描述由其他空间组成的列表
class ListSpace(Space):
其他文件
utils.py: 处理图像、验证属性、创建单例模式对象以及序列化数据等任务
vector_env.py: 创建并管理多个环境实例(如模拟器或任务环境),以便在多进程或多线程环境中并行运行。这使得训练和评估过程更加高效,尤其是在需要大量计算资源的任务中。