官网网址:AI2-THOR
环境安装
pip install ai2thor
或conda安装:
conda install -c conda-forge ai2thor
如果安装不上,说找不到对应版本,指定版本:
python -m pip install ai2thor==5.0.0 -i https://pypi.tuna.tsinghua.edu.cn/simple
在pip安装时opencv-python报错,无法建立依赖,给opencv指定一个版本就可以,如
pip install opencv-python==4.3.0.38 -i https://pypi.tuna.tsinghua.edu.cn/simple
需要查看OpenGL的版本,该模拟器需要unity渲染,版本不能太低
glxinfo | grep "OpenGL version"
如果提示没有这个命令,安装
sudo apt update
sudo apt install mesa-utils
验证是否安装成功:
from ai2thor.controller import Controller
controller = Controller()
event = controller.step("MoveAhead")
第一次控制器初始化后,包含 3D 场景的游戏环境将下载到本地 ~/.ai2thor.下载大小约为 500MB。
AI 应用程序通常不需要一个窗口来呈现屏幕视图,并且由于安全问题和大量依赖项使更新变得不便,计算集群的管理员可能会限制在计算机上使用 Xorg,无法正确打开屏幕窗口或者后续运行程序,可以使用云渲染。
from ai2thor.controller import Controller
from ai2thor.platform import CloudRendering
controller = Controller(platform=CloudRendering)
模拟器中的概念
代理:代理是一个胶囊形状的实体,能够在场景中导航并与物体互动。
场景: AI2-THOR中的场景代表一个虚拟房间,代理可以在其中导航和互动。有4种场景类别,每个类别包含30个独特的场景:厨房、客厅、卧室和浴室。
动作: 动作是代理在场景中执行的离散命令(例如:向前移动、向右旋转、拿起物体)。
仿真物体: 仿真物体是代理可以与之互动的物体。物体根据其分配的对象类型有一系列的互动方式。
物体可见性: 当物体满足两个条件时,被认为是可见的:
在画面内。物体出现在相机的画面内(即,它在相机的视野范围内)。即使物体被另一个物体部分遮挡,只要有一部分在画面内,就满足这个条件。接近度。物体距离代理的中心垂直轴在可见距离内。默认情况下,可见距离设置为1.5米,但在初始化时可以被覆盖。无遮挡。物体没有被其他物体遮挡。这里指的是,从相机发出的射线必须直接击中物体,而不是先击中另一个物体。
在图像中渲染的物体并不总是对代理可见。例如,超出1.5米阈值的物体可能在图像中可见,但会被报告为对代理不可见。每个物体的可见性都会在元数据中报告。
物体互动性: 如果一个物体既可见又没有被其他物体遮挡,那么它被认为是可互动的。例如,如果海绵在淋浴玻璃后面,它会被报告为可见,但由于遮挡,代理无法与之互动。
如果一个物体是可互动的,那么意味着该物体是可见的。但是,如果一个物体是可见的,并不意味着它是可互动的。
容器: 容器是一种可能成为另一个物体父物体的物体类型。例子包括桌面、杯子、沙发、床、桌子和碗。完整的容器物体类型可以在物体类型中进行过滤。
基础代码
初始化
from ai2thor.controller import Controller
controller = Controller(
agentMode="default",
visibilityDistance=1.5,
scene="FloorPlan212",
# step sizes
gridSize=0.25,
snapToGrid=True,
rotateStepDegrees=90,
# image modalities
renderDepthImage=False,
renderInstanceSegmentation=False,
# camera properties
width=300,
height=300,
fieldOfView=90
)
重置
任何代理初始化后都可以通过重置进行更改
controller.reset(scene="FloorPlan319", rotateStepDegrees=30)
暂停物理自动模拟
在环境中关闭自动模拟,必须先调用该函数,然后才能控制步骤之间经过的时间。
controller.step("PausePhysicsAutoSim")
Advance Physics步骤
AdvancePhysicsStep 在模拟时间步长:秒。请注意,暂停物理自动模拟必须先调用,然后再调用AdvancePhysicsStep。
controller.step(
action="AdvancePhysicsStep",
timeStep=0.01
)
取消暂停物理自动模拟
取消暂停物理自动模拟,切换回默认的物理特性自动模拟。该模拟会在操作完成后返回未来事件。
警告: 当对象仍处于运动状态时取消暂停自动模拟(即 inMotion = 真),将冻结每个对象在其当前位置。因此,这种物体的剩余运动将丢失。
要捕获对象的整个运动,在所有对象返回之前,不要使用此操作取消暂停物理(inMotion = 假)。在其对象元数据中,也可以使用 event.metadata[“isSceneAtRest”]。
controller.step("UnpausePhysicsAutoSim")
图像和元数据
可以同构打印event来观测数据组成,模拟器其实对数据封装的很全面。
其中比较重要的有图像数据部分和元数据部分。
图像
.Frame:numpy.ndarray
描述:从代理自我中心的角度看到场景的RGB帧。大小:初始化时为(高度,宽度,3)。格式:存储在numpy.uint8中。
.cv2img:numpy.ndarray
描述:与帧相同,但图像通道按BGR排序。用途:适用于Python的OpenCV模块(即cv2),该模块需要BGR排序的图像。
.depth_frame:可选[numpy.ndarray]
描述:测量从代理到帧中每个像素的距离(单位:米)。大小:初始化时为(高度,宽度)。格式:存储在numpy.float32中。
元数据
Metadata Response(元数据响应)
errorMessage:str
如果操作失败,将提供导致失败的原因反馈。 lastActionSuccess:bool
表示上一个操作是否成功执行。 异常处理:
在无效状态下不会引发异常。例如,如果代理站在一堵墙前并尝试执行MoveAhead操作,它将失败,但不会抛出异常。如果操作不成功,环境的状态将不会改变。 actionReturn:any
保存查询环境的操作结果,例如GetReachablePositions。 lastAction:str
传递给控制器的操作名称。 sceneName:str
代理当前所在的场景名称。 sceneBounds:dict[str, any]
提供场景内所有坐标的对象。这可以与PlaceObjectAtPoint等操作一起使用,以确保使用的坐标不越界。返回的sceneBounds对象包括一个8x3的xyz坐标矩阵,代表包围整个场景的盒子的8个角;一个xyz字典,代表该盒子中心的坐标;以及一个xyz字典,代表该盒子的大小(范围)。示例: {
"center": {
"x": -1.45,
"y": 1.407,
"z": 0.2
},
"cornerPoints": [
[1.5, 2.92, 3.2],
[1.5, 2.92, -2.8],
[1.5, -0.106, 3.2],
[1.5, -0.106, -2.8],
[-4.4, 2.92, 3.2],
[-4.4, 2.92, -2.8],
[-4.4, -0.106, 3.2],
[-4.4, -0.106, -2.8]
],
"size": {
"x": 5.9,
"y": 3.02,
"z": 6.0
}
} agent:dict[str, any]
关于代理姿态的信息。更多详情请参阅代理元数据。
Agent Metadata Response(代理元数据响应)
cameraHorizon:float
相机俯仰旋转的角度,单位为度。警告:负的相机地平线值表示代理向上看,而正的地平线值表示代理向下看。 isStanding:bool
如果代理当前处于站立姿势,则为真;否则为假。如果代理使用Stand或Crouch操作,这个布尔值可以改变。警告:默认代理是目前唯一能够站立的代理。 position:dict[str, float]
代理的全局位置,包含x、y和z的键。备注:y坐标对应于3D空间中的向上方向。 rotation:dict[str, float]
代理身体的局部旋转,包含x(俯仰)、y(偏航)和z(翻滚)的键。由于默认代理的身体只能改变其偏航旋转,x和z将始终大约为0。