hatitat-sim的agent.py各部分组成
1.导入依赖
from typing import Any, Dict, List, Optional, Union
import attr
import magnum as mn
import numpy as np
import quaternion as qt
attr:用于简化类定义,通过自动生成属性和初始化代码来提高代码的简洁性。
magnum:3D图形库,用于操作3D空间中的场景图形。
numpy:用于数值计算,尤其是处理矩阵和向量。
quaternion:用于处理四元数,四元数常用于表示3D旋转。
habitat_sim:环境模拟库,提供3D场景和智能体模拟。
2.ActionSpac类
@attr.s(auto_attribs=True)
class ActionSpec:
name: str
actuation: Optional[ActuationSpec] = None
name: 行动名称(如“前进”、“旋转”等)。
actuation: 该行动的参数(例如前进的距离或旋转的角度)
3. 六自由度位置 (SixDOFPose)
表示一个三维空间中的位置和旋转。
@attr.s(auto_attribs=True, slots=True)
class SixDOFPose:
position: np.ndarray = attr.ib(factory=_triple_zero, validator=all_is_finite)
rotation: Union[qt.quaternion, List] = attr.ib(factory=_default_quaternion, validator=is_unit_length)
position: 物体的3D位置。
rotation: 物体的旋转,使用四元数表示。
4. AgentState 类
表示智能体的状态,包括位置、旋转和传感器状态。
@attr.s(auto_attribs=True, slots=True)
class AgentState:
position: np.ndarray = attr.ib(factory=_triple_zero, validator=all_is_finite)
rotation: Union[qt.quaternion, List, np.ndarray] = attr.ib(factory=_default_quaternion, validator=is_unit_length)
sensor_states: Dict[str, SixDOFPose] = attr.ib(factory=dict, validator=...)
position: 智能体的位置。
rotation: 智能体的旋转。
sensor_states: 智能体的传感器状态,使用传感器的 SixDOFPose 来表示。
5.AgentConfiguration 类
定义了智能体的配置,包括大小、传感器和动作空间。
@attr.s(auto_attribs=True, slots=True)
class AgentConfiguration:
height: float = 1.5
radius: float = 0.1
sensor_specifications: List[hsim.SensorSpec] = attr.Factory(list)
action_space: Dict[Any, ActionSpec] = attr.Factory(_default_action_space)
body_type: str = "cylinder"
height: 智能体的高度。
radius: 智能体的半径。
sensor_specifications: 智能体使用的传感器的配置列表。
action_space: 定义智能体可以执行的行动。
body_type: 智能体的形状类型。
6. Agent 类
智能体的核心类,管理智能体的位置、旋转、传感器、动作等。
@attr.s(init=False, auto_attribs=True)
class Agent:
agent_config: AgentConfiguration
_sensors: SensorSuite
controls: ObjectControls
body: mn.scenegraph.AbstractFeature3D
agent_config: 智能体的配置。
_sensors: 智能体的传感器。
controls: 智能体的控制接口。
body: 智能体在场景中的物体。
7.init 方法
初始化智能体的构造函数,接收场景节点、配置、传感器和控制参数。
def __init__(
self,
scene_node: hsim.SceneNode,
agent_config: Optional[AgentConfiguration] = None,
_sensors: Optional[SensorSuite] = None,
controls: Optional[ObjectControls] = None,
) -> None:
8.reconfigure 方法
重新配置智能体的属性,包括配置更新和传感器重置。
def reconfigure(
self, agent_config: AgentConfiguration, reconfigure_sensors: bool = True
) -> None:
9.act 方法
执行智能体的行动。
def act(self, action_id: Any) -> bool:
action_id: 选择的行动ID,通过 agent_config.action_space 获取实际的行动。
did_collide: 返回是否发生了碰撞。
10.get_state 和 set_state 方法
分别用于获取和设置智能体的状态。
def get_state(self) -> AgentState:
获取智能体的当前位置、旋转和传感器状态。
def set_state(
self,
state: AgentState,
reset_sensors: bool = True,
infer_sensor_states: bool = True,
is_initial: bool = False,
) -> None:
设置智能体的状态,包括位置、旋转,并可以选择重置传感器。
scene_node 属性
返回智能体的场景节点。
@property
def scene_node(self) -> SceneNode:
state 属性
简化版的 get_state 和 set_state 方法,作为智能体状态的快捷访问方式。
@property
def state(self):
return self.get_state()
@state.setter
def state(self, new_state: AgentState):
self.set_state(new_state, reset_sensors=True, infer_sensor_states=True, is_initial=False)
close 方法
关闭智能体,清理传感器资源。
def close(self) -> None:
self._sensors = None
代码中 attr.s 的作用
在 agent.py 代码中,多个类使用了 @attr.s(auto_attribs=True, slots=True)
@attr.s(auto_attribs=True, slots=True)
auto_attribs=True:让 attrs 直接从类型注解(如 position: np.ndarray)推导属性,并自动生成 __init__ 方法。
slots=True:使用 __slots__ 机制来减少内存开销,提高性能。
position: np.ndarray = attr.ib(factory=_triple_zero, validator=all_is_finite)
attr.ib(...) 定义类的属性:
factory=_triple_zero:默认值是 np.zeros(3)
validator=all_is_finite:确保 position 里的值都是有限数值(不是 inf 或 NaN)
总结
这个文件定义了一个用于模拟环境中智能体的类。智能体有多个传感器和动作,可以获取和设置其状态。它使用了 habitat_sim 提供的功能来控制智能体的行为,如移动、旋转和处理传感器数据。通过这个类,开发者可以在虚拟环境中创建、控制和监控智能体的行为。