官网网址: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。