当前位置: 首页 > news >正文

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 提供的功能来控制智能体的行为,如移动、旋转和处理传感器数据。通过这个类,开发者可以在虚拟环境中创建、控制和监控智能体的行为。

相关文章:

  • 深入理解推理语言模型(RLM)
  • 【Linux】进程替换(七)
  • 微信小程序点击按钮,将图片下载到本地
  • [Computer Vision]实验六:视差估计
  • 使用haproxy实现MySQL服务器负载均衡
  • js 之 lodash函数库 的下载与基础使用
  • 企微审批中MySQL字段TEXT类型被截断的排查与修复实践
  • C++ 的 if 判断语句教程
  • 2025年AI网络安全攻防战:挑战深度解析与全链路防御体系构建指南
  • springboot项目Maven打包遇到的问题总结
  • C++ 二叉树代码
  • 机器分类的基石:逻辑回归Logistic Regression
  • React Portals深度解析:突破组件层级的渲染艺术
  • 计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)
  • 原生AJAX和jQuery的Ajax区别
  • xss自动化扫描工具-DALFox
  • Linux:程序翻译
  • 常见报错及解决方案
  • 自然语言处理:文本表示
  • Android应用开发面试题
  • 中国恒大披露清盘进展:要求债权人提交债权证明表
  • 四川内江警方通报一起持刀伤人致死案:因车辆停放引起,嫌犯被抓获
  • 温州通报“一母亲殴打女儿致其死亡”:嫌犯已被刑拘
  • 恒生银行回应裁员传闻:受影响的员工数目占银行核心业务员工总数约1%
  • 腾讯一季度净利增14%:AI直接拉动广告收入增长,王者荣耀流水创新高
  • 沧州低空经济起飞:飞行汽车开启千亿赛道,通用机场布局文旅体验