AI2-THOR (The House Of inteRactions) 是一种用于AI智能体的逼真的可交互框架。AI2-THOR由室内场景组成,其中AI智能体可以在场景中导航并与物体交互以执行任务。 AI2-THOR的目的是促进视觉智能模型的开发,并推动该领域的研究。

详细信息可以浏览AI2-THOR GitHubAI2-THOR视频介绍。

1. 安装

AI2-THOR对系统的配置要求如下:

  • OS: Mac OS X 10.9+, Ubuntu 14.04+
  • Graphics Card: DX9 (shader model
    3.0) or DX11 with feature level 9.3 capabilities
  • CPU: SSE2 instruction set support
  • Python 2.7 or Python 3.5+
  • Linux users: X server with GLX module enabled

你可以使用pip安装AI2-THOR的最新版本,本博客撰写时当前的最新版本为2.3.4。 创建一个Python 2或者Python 3虚拟环境,并运行:

$ pip install ai2thor

AI2-THOR发展到现在具有多个版本,每个版本差异明显。你可以参见AI2-THOR历史版本对其他版本进行安装。

在运行以下代码之前,请确保具有OpenGL的X服务器正在运行,并且已为图形卡安装了OpenGL扩展。

import ai2thor.controller

controller = ai2thor.controller.Controller()

首次初始化Controller时,包含3D场景的游戏环境将下载到$ HOME/.ai2thor。 二进制文件的大小约为500MB。

2. 简介

AI2-THOR现在分为 iTHORRoboTHOR

iTHOR 的特性如下:

  • 120个房间。房间类型包括厨房,卧室,浴室和客厅,每种房间类型包括30个不同的房间。
  • 2000种可用于AI智能体与之交互的不同物体
  • 基于Unity 3D,可对物体和场景进行物理模拟
  • 包括具有视觉状态可更改的物体,包括打开/关闭(open/close),打开/关闭(on/off),热/冷 (hot/cold)
  • 支持多种智能体类型,例如人形机器人和无人机
  • 在单个场景中支持多个智能体

RoboTHOR 的特性如下:

  • 75套带有600多个物体的公寓,供AI智能体在其中导航
  • 14套公寓的物理和模拟对口
  • 将Locobot机器人与Kinect相机配合使用
  • 从资产库中以模块化方式构建公寓
  • 实体公寓可轻松重新配置
  • 所有人均可访问的仿真和真实环境
iTHORRoboTHOR
概念
场景
物体
动作
元数据

3. iTHOR

iTHOR是AI2-THOR框架内的环境,其中包括一组交互式对象和场景,并提供了精确的世界物理建模。

iTHOR建立在Unity物理引擎之上,并为物体和场景的物理属性建模:质量,摩擦,弹跳等。

iTHOR提供了物体操作:拾取物体,放置物体,推动物体等。

iTHOR可以更改物体的状态,例如打开/关闭微波炉,烹饪食物,打开/关闭灯。

iTHOR支持使用不同类型的多个智能体执行任务。

3.1 概念

AI2-THOR中的常见的概念及其描述如下:

概念描述
Agent智能体是一个实体,可以在场景中导航并与物体进行交互。
SceneAI2-THOR中的场景表示智能体可以导航并与其交互的虚拟房间。 有4个场景类别,每个类别中有30个独特的场景:厨房,客厅,卧室,浴室。
Action动作是智能体在场景中执行的离散命令(例如MoveAhead,RotateRight,PickupObject)
Sim Objectsim物体是智能体可以与之交互的物体。 根据物体类型定义的不同,物体具有很广泛地交互类型。
Object Visibility满足以下三个条件的物体将被视为“可见”:该物体必须在相机的视野内,并且必须在距智能体中心的距离阈值之内(默认值:1.5米),并且相机发出的光线必须先击中物体,而不能先击中其他障碍物。 请注意,在图像中渲染的物体并不总是对智能体可见。 例如,在图像中可以看到超出1.5米阈值的物体,但该对象将被报告为对物体不可见。
Object Interactability如果一个物体被标记为可见并且不受任何其他物体的阻碍,则该物体被称为是可交互的。 大多数物体都是可交互的,只要它们也是可见的,但是某些物体具有透明性,这会导致通过它们将物体报告为可见的。 一个示例是玻璃淋浴门,其后有海绵物体。 玻璃门将被标记为“可见且可交互”,但海绵仅是可见的。 尝试与海绵互动将引发错误,因为只能通过玻璃门才能看到它。
Receptacle一种可以包含另一个物体的物体。 容器的一些示例包括:桌面,杯子,沙发,床,桌子,碗等。某些容器不能在场景中移动,而且大多是大型物体,移动起来没有意义(厨房台面、水槽等)。 某些容器也可以打开和关闭(微波炉,橱柜,抽屉等),而一些其他容器也可以由智能体拿起并移动(盘子,碗,盒子等)。
3.2 场景

iTHOR环境中共有120个场景,涵盖四种不同的房间类别:厨房,客厅,卧室和浴室。 每个房间都有一组可以在其中找到的物体。 注意,某些物体类型可以在给定类别的所有场景中找到,而某些物体类型有时仅在特定类别的场景中可以找到。

在场景初始化期间,可以将物体放置在不同的容器上,因此我们可以为单个场景获得许多不同的配置。 因此,配置数量远大于120。

场景类别描述
厨房30 scenes, FloorPlan1 - FloorPlan30
客厅30 scenes, FloorPlan201 - FloorPlan230
卧室30 scenes, FloorPlan301 - FloorPlan330
浴室30 scenes, FloorPlan401 - FloorPlan430
3.3 物体

在iTHOR中,与物体的交互取决于物体的物理属性。

3.3.1 物体类型

AI2-THOR中有115种物体类型。 每种物体类型都具有与之相关的可操作属性、材质属性和物体位置(在场景类别内)。 此外,某些物体与其他物体或环境的某些部分具有上下文交互作用,这可能导致物体状态动态变化。

物体类型表格如下:

#物体类型中文名称
1AlarmClock
2Apple
3AppleSliced
4ArmChair
5BaseballBat
6BasketBall
7Bathtub
8BathtubBasin
9Bed
10Blinds
11Book
12Boots
13Bottle
14Bowl
15Box
16Bread
17BreadSliced
18ButterKnife
19Cabinet
20Candle
21Cart
22CD
23CellPhone
24Chair
25Cloth
26CoffeeMachine
27CoffeeTable
28CounterTop
29CreditCard
30Cup
31Curtains
32Desk
33DeskLamp
34DiningTable
35DishSponge
36Drawer
37Dresser
38Egg
39EggCracked
40Faucet
41FloorLamp
42Footstool
43Fork
44Fridge
45GarbageCan
46HandTowel
47HandTowelHolder
48HousePlant
49Kettle
50KeyChain
51Knife
52Ladle
53Laptop
54LaundryHamper
55LaundryHamperLid
56Lettuce
57LettuceSliced
58LightSwitch
59Microwave
60Mirror
61Mug
62Newspaper
63Ottoman
64Painting
65Pan
66PaperTowel
67Pen
68Pencil
69PepperShaker
70Pillow
71Plate
72Plunger
73Poster
74Pot
75Potato
76PotatoSliced
77RemoteControl
78Safe
79SaltShaker
80ScrubBrush
81Shelf
82ShowerCurtain
83ShowerDoor
84ShowerGlass
85ShowerHead
86SideTable
87Sink
88SinkBasin
89SoapBar
90SoapBottle
91Sofa
92Spatula
93Spoon
94SprayBottle
95Statue
96StoveBurner
97StoveKnob
98TeddyBear
99Television
100TennisRacket
101TissueBox
102Toaster
103Toilet
104ToiletPaper
105ToiletPaperHanger
106Tomato
107TomatoSliced
108Towel
109TowelHolder
110TVStand
111Vase
112Watch
113WateringCan
114Window
115WineBottle
3.3.2 可操作属性

该框架中的物体可以具有许多与物体类型关联的可操作属性。 可操作属性是具有与之关联的操作的特定属性。 例如,一个Openable物体意味着可以使用OpenObject和CloseObject操作与该对象进行交互。 以下是所有可操作属性及其详细说明的列表。

3.3.2.1 Openable

可以使用OpenObject和CloseObject操作打开或关闭这些物体。 可打开的容器允许将物体放置在其中。

3.3.2.2 Pickupable

智能体可以使用PickupObject和PutObject操作将这些对象拾取或放到Receptacles物体中。 也可以使用DropHandObject放置拾取的物体,该物体无需使用目标容器即可从Agent的手中移走该物体。 Throw是放下物体的扩展,其中添加了附加的力以使物体围绕场景投掷。 也可以使用Push和Pull动作将可拾取的物体推到周围。 一些Receptacles物体也可以拾取。 放置在可拾取容器中的所有物体都可以立即移动,因此可以执行复杂的序列,例如(将苹果放在板上->移动苹果和板到水槽)。

3.3.2.3 On/Off

使用ToggleObjectOn和ToggleObjectOff操作与这些物体进行交互。 当打开或关闭所有打开/关闭物体时都会发生可见状态更改(即,笔记本电脑的屏幕将打开并显示图像,关闭时将显示空白)。

3.3.2.4 Receptacle

这些物体被分类为Receptacles,这意味着如果其他物体在物理上可以适合容器,则可以将其他物体放置在它们之上或之中。 某些容器是受限制的特定物体(例如,ToiletPaper是唯一可以放在ToiletPaperHanger上的类型)。 请注意,任何也可以拾取的容器都可以与它们活动包含的任何Sim物体一起在场景中移动(即:拾取装有苹果的板,以同时在场景中移动板和苹果)。

3.3.2.5 Fillable

使用FillObjectWithLiquid操作可以将各种液体填充到这些物体中。 可填充物体可以用水、咖啡或酒填充。 如果某个物体填充有一种液体类型,并且从全局向上轴旋转了90度以上,则该物体将自动清空自身,因为液体已经“溢出”。 另外,一些填充交互是上下文相关的。 例如,将空杯子放在打开的咖啡壶物体中将自动在杯子中装满咖啡。 同样,将空杯子移到正在运行的水龙头下会自动将杯子装满水。

3.3.2.6 Sliceable

可以使用SliceObject操作将这些物体切成小块。 这会破坏源物体,并在完全相同的位置产生多个“切片”的源物体片段。 这是一种单向状态更改,因此只有场景重置才会将切片的物体还原为它们的整个版本。 切片物体即使被销毁后仍会报告元数据信息。 这允许您检查“切片”操作完成之前源物体的最后位置。

3.3.2.7 Cookable

这些物体具有可通过CookObject操作切换到的熟状态。 这是一种单向状态更改,因此只有场景重置才能将煮熟的物体恢复为未煮熟的状态。

3.3.2.8 Breakable

这些物体具有断开状态,可以使用BreakObject操作将其切换为断开状态。 这是一种单向状态更改,因此只有场景重置才能将损坏的物体还原到其未损坏的状态。 如果易碎物体以足够大的力碰撞,它们也会自动破裂。 物体之间的此力阈值不同,因为某些物体比其他物体更易碎。

3.3.2.9 Dirty

这些物体具有“干净”和“脏”状态,可以在使用DirtyObject操作进行切换。 这包括诸如杯子之类的物体,上面可能有污垢,或者床的盖子杂乱无章。 如果某些脏物体在流水下移动,则可以根据上下文切换到其干净状态。 (脏碗在打开的水龙头下移动将自动清洁碗)。

3.3.2.10 UsedUp

这些物体的部分内容可能会被UseUp操作用尽。 这是一种单向交互,除非重置场景,否则无法撤消。 这可以更改物体的整体外观,以表明其内容已“用完”。 卫生纸,纸巾盒和纸巾是物体的示例,这些物体用完后会以某种方式改变形式。

3.3.2.11 物体可操作属性性列表

如果可操作属性旁边带有*,则意味着并非该物体类型的所有实例都被保证具有该属性。 请检查特定物体实例的物体元数据,以获取有关该特定实例是否具有给定属性的详细信息。

#物体类型可操作属性
1AlarmClockPickupable
2ApplePickupable, Sliceable
3AppleSlicedPickupable
4ArmChairReceptacle
5BaseballBatPickupable
6BasketBallPickupable
7BathtubReceptacle*
8BathtubBasinReceptacle
9BedReceptacle, Dirty
10BlindsOpenable
11BookOpenable, Pickupable
12BootsPickupable
13BottlePickupable, Fillable, Breakable
14BowlPickupable, Receptacle, Fillable, Breakable*, Dirty
15BoxOpenable, Pickupable, Receptacle
16BreadPickupable, Sliceable
17BreadSlicedPickupable, Cookable
18ButterKnifePickupable
19CabinetOpenable, Receptacle
20CandlePickupable, On/Off
21CartReceptacle
22CDPickupable
23CellPhonePickupable, On/Off, Breakable
24Chair-
25ClothPickupable, Dirty
26CoffeeMachineOn/Off, Receptacle
27CoffeeTableReceptacle
28CounterTopReceptacle
29CreditCardPickupable
30CupPickupable, Receptacle, Fillable, Breakable*, Dirty
31Curtains-
32DeskReceptacle
33DeskLampOn/Off
34DiningTableReceptacle
35DishSpongePickupable
36DrawerOpenable, Receptacle
37DresserReceptacle
38EggPickupable, Sliceable, Breakable
39EggCrackedPickupable, Cookable
40FaucetOn/Off
41FloorLampOn/Off
42Footstool-
43ForkPickupable
44FridgeOpenable, Receptacle
45GarbageCanReceptacle
46HandTowelPickupable
47HandTowelHolderReceptacle
48HousePlantFillable
49KettleOpenable, Pickupable, Fillable
50KeyChainPickupable
51KnifePickupable
52LadlePickupable
53LaptopOpenable, Pickupable, On/Off, Breakable
54LaundryHamperReceptacle
55LaundryHamperLidOpenable
56LettucePickupable, Sliceable
57LettuceSlicedPickupable
58LightSwitchOn/Off
59MicrowaveOpenable, On/Off, Receptacle
60MirrorBreakable, Dirty
61MugPickupable, Receptacle, Fillable, Breakable, Dirty
62NewspaperPickupable
63OttomanReceptacle
64Painting-
65PanPickupable, Receptacle, Dirty
66PaperTowelPickupable, UsedUp
67PenPickupable
68PencilPickupable
69PepperShakerPickupable
70PillowPickupable
71PlatePickupable, Receptacle, Breakable*, Dirty
72PlungerPickupable
73Poster-
74PotPickupable, Receptacle, Fillable, Dirty
75PotatoPickupable, Sliceable, Cookable
76PotatoSlicedPickupable, Cookable
77RemoteControlPickupable
78SafeOpenable, Receptacle
79SaltShakerPickupable
80ScrubBrushPickupable
81ShelfReceptacle
82ShowerCurtainOpenable
83ShowerDoorOpenable, Breakable
84ShowerGlassBreakable
85ShowerHeadOn/Off
86SideTableReceptacle
87SinkReceptacle*
88SinkBasinReceptacle
89SoapBarPickupable
90SoapBottlePickupable, UsedUp
91SofaReceptacle
92SpatulaPickupable
93SpoonPickupable
94SprayBottlePickupable
95StatuePickupable, Breakable
96StoveBurnerOn/Off, Receptacle
97StoveKnobOn/Off
98TeddyBearPickupable
99TelevisionOn/Off, Breakable
100TennisRacketPickupable
101TissueBoxPickupable, UsedUp
102ToasterOn/Off, Receptacle
103ToiletOpenable, Receptacle
104ToiletPaperPickupable, UsedUp
105ToiletPaperHangerReceptacle
106TomatoPickupable, Sliceable
107TomatoSlicedPickupable
108TowelPickupable
109TowelHolderReceptacle
110TVStandReceptacle
111VasePickupable, Breakable
112WatchPickupable
113WateringCanPickupable, Fillable
114WindowBreakable
115WineBottlePickupable, Fillable, Breakable
3.3.3 材质属性
3.3.4 物体位置
3.3.5 上下文交互
3.4 动作

智能体通过不同动作与世界进行交互。在运行任何其他命令之前,假定你已运行以下命令加载与初始化环境:

from ai2thor.controller import Controller

controller = Controller(scene='FloorPlan28', gridSize=0.25)

初始化可选参数如下:

参数类型描述默认值
scenestring要初始化的场景的名称。 厨房:FloorPlan1-FloorPlan30,客厅:FloorPlan201-FloorPlan230,卧室:FloorPlan301-FloorPlan330,浴室:FloorPlan401-FloorPlan430
gridSizefloat智能体导航的网格的大小。这确定了采取动作MoveAhead,MoveBack,MoveRight,MoveLeft时智能体所采取的步长。0.25
renderDepthImagebool启用后,深度图像将作为属性depth_frame在返回的事件中发送并可用。False
renderClassImagebool启用后,类分割图像将作为属性class_segmentation_frame在返回的事件中发送并可用。False
renderObjectImagebool启用后,物体分割图像作为属性实例instance_segmentation_frame在返回的事件中发送并可用。False
visibilityDistancefloat从智能体的相机(位于智能体顶部附近)到一个物体应被视为可见的距离,以米为单位。1.5
cameraYfloat智能体使用的相机的高度。0.675
fieldOfViewfloat智能体相机的视野。对应于值Camera . FieldOfView。FieldOfView的有效值为(0-180),非包含。90.0
agentModestring这将确定智能体初始化到的预设模式。 有效模式字符串是“ bot”或“ tall”。 “ bot”模式是LoCoBot的完整副本,它比“ tall”智能体短。 “tall”模式是在先前版本的框架中使用的默认高胶囊和更大的碰撞半径。tall
agentCountint设置智能体数目。1
widthint设置返回图像的宽度(以像素为单位)。 必须大于等于300。与简单地将默认的300像素乘以300像素的图像大小相反,使用较大的图像可以提高图像质量。300
heightint设置返回图像的高度(以像素为单位)。300

智能体有效的总动作集合如下:

动作类型语法动作集合
Initializationcontroller.reset(), controller.step(action=’’)action可取的值:InitialRandomSpawn, SetObjectPoses, SetObjectToggles, RandomToggleStateOfAllObjects, RandomToggleSpecificState, MakeObjectsOfTypeUnbreakable
Agent Navigationcontroller.step(action=’’)action可取的值:RotateRight, RotateLeft, LookUp, LookDown, MoveAhead, MoveRight, MoveLeft, MoveBack, Crouch, Stand, Teleport, TeleportFull, GetReachablePositions
Object Interactioncontroller.step(action=’’)action可取的值:PickupObject, PutObject, DropHandObject, ThrowObject, PushObject, PullObject, OpenObject, CloseObject, ToggleObjectOn, ToggleObjectOff, SliceObject, BreakObject, DirtyObject, CleanObject, FillObjectWithLiquid, EmptyLiquidFromObject, UseUpObject, SetRoomTempDecayTimeForType, SetGlobalRoomTempDecayTime, SetDecayTemperatureBool
Held Object Manipulationcontroller.step(action=’’)action可取的值:MoveHandAhead, MoveHandBack, MoveHandLeft, MoveHandRight, MoveHandUp, MoveHandDown, RotateHand
Miscellaneous Actionscontroller.step(action=’’)action可取的值:Pass, RemoveFromScene, MakeAllPickupableObjectsMoveable, AddThirdPartyCamera, UpdateThirdPartyCamera
3.4.1 Initialization

初始化场景后,你可以根据需要对环境进行一些自定义的设置。初始化时可以采取的动作集合:

动作描述
reset加载新的场景
InitialRandomSpawn物体位置随机化
SetObjectPoses恢复物体位置
SetObjectToggles按物体类型设置可切换物体
RandomToggleStateOfAllObjects通过随机种子随机化所有物体状态
RandomToggleSpecificState通过随机种子仅随机化具有特定状态的物体
MakeObjectsOfTypeUnbreakable设置物体牢不可破
Initialize初始化场景
3.4.1.1 Reset

初始化Controller后,使用此方法可以切换到新场景:

controller.reset(scene='FloorPlan30')
参数类型描述默认值
scenestring要加载的场景的名称。 厨房:FloorPlan1-FloorPlan30,客厅:FloorPlan201-FloorPlan230,卧室:FloorPlan301-FloorPlan330,浴室:FloorPlan401-FloorPlan430
3.4.1.2 Object Position Randomization

初始化场景后,可拾取物体的默认位置可以随机分配到可以放置在场景内的任何有效容器中。 不能保证物体可以从其默认位置移动,因为有时场景中没有足够的可用空间来移动物体。

controller.step(action='InitialRandomSpawn', randomSeed=0, forceVisible=False, numPlacementAttempts=5,
                numRepeats=[{'objectType': 'Statue', 'count': 20}, {'objectType': 'Bowl', 'count': 20}],
                minFreePerReceptacleType=[{'objectType': 'Sink', 'count': 1000}])

使用位置随机化器之前,请记住要重置并初始化场景,否则种子值将不准确。

参数类型描述默认值
randomSeedint用于为可重复场景状态随机化。 因为此种子取决于场景的当前状态,所以请记住在运行InitialRandomSpawn()之前使用controller.reset()重置场景,否则种子的随机化将不准确。0
3.4.1.3 Restore Object Positions

这有助于将场景设置为先前初始化的精确状态,而不依赖于物体位置随机化的随机种子。使用先前的SimObjects元数据转储来获取每个SimObjects的位置/旋转数据。根据提供的物体和姿势设置场景。指定两次的物体将被复制。未指定但位于原始场景中的物体将被移除。

object_poses = [
    {
        "objectName": "Alarm_Clock_19",
        "rotation": {"y": 270, "x": 0, "z": 0},
        "position": {"y": 0.8197357, "x": 2.45610785, "z": 0.054755792}
    },
    {
        "objectName": "Book_19",
        "rotation": {"y": 0, "x": 0, "z": 0},
        "position": {"y": 0.7308113, "x": 0.3694262, "z": 1.497829}
    },
    {
        "objectName": "pillow_19",
        "rotation": {"y": 0, "x": 0, "z": 0},
        "position": {"y": 0.809355736, "x": -0.5954236, "z": 0.17262423}
    },
    {
        "objectName": "Alarm_Clock_19",
        "rotation": {"y": 270, "x": 0, "z": 0},
        "position": {"y": 0.8197357, "x": 2.64169645, "z": -0.134690791}
    }
]
controller.step(action='SetObjectPoses', objectPoses=object_poses)
参数类型描述默认值
objectPoseslist物体名称及其姿势的列表。这些信息可以从之前一集的元数据中转储。None
3.4.1.4 objectPoses attributes

每个成员的objectPoses列表应具有以下属性。 每个属性都可以在对象的元数据返回中找到(有关event.metadata [‘objects’],请参见“对象属性”部分。

参数类型描述例子
objectNamestring由物体元数据的名称报告的SimObject的名称。Alarm_Clock_19
positionxyz dictionary物体位置的x,y,z坐标。 这由物体元数据位置报告。(0.54, 0.3, 12.3)
rotationxyz dictionary物体旋转的x,y,z坐标。 通过物体元数据的旋转来报告。(0, 90, 0)
3.4.1.5 Set Toggleable Objects by Object Type

启用设置整个物体类型的切换状态。 本示例显示将场景中的所有DeskLamp物体设置为关闭状态。 请注意,此初始化功能仅适用于具有On/Off动作属性的物体类型。 要检查是否可以使用此功能设置特定的Sim物体,请检查该物体是否具有toggleable = True物体元数据属性。

controller.step(action='SetObjectToggles', objectToggles=[{'objectType': 'DeskLamp', 'isOn': False}])
参数类型描述默认值
objectToggleslist可切换物体类型的列表以及将每种类型设置为的布尔值。None
3.4.1.6 objectToggles attributes

每个成员的objectToggles列表应具有以下属性。 您可以在任何Sim物体元数据的objectId中找到objectType。 objectId由物体类型和物体在场景中的位置组成。

参数类型描述例子
objectTypestring场景中要切换的物体的类型。FloorLamp
isOnboolean由objectType指定的物体应该全部打开还是关闭。True
3.4.1.7 Randomize All Object States by Random Seed

初始化场景后,所有状态可更改的物体都可以将其初始状态随机化。 这将随机设置或切换每个sim物体具有的所有潜在状态(即,杯子可能会随机装满水,脏东西,破碎物等)。 在使用InitialRandomSpawn将物体位置随机化之后使用此方法,因为许多状态更改是单向且具有破坏性的,因此,如果状态已经被随机化,则不能保证可以重新定位物体。

controller.step(action='RandomToggleStateOfAllObjects', randomSeed=0)
参数类型描述默认值
randomSeedint用于为可重复场景状态随机化。 由于此种子取决于场景的当前状态,因此在执行其他“随机”状态切换之前,请始终使用controller.reset()重置场景。0
3.4.1.8 Randomize Only Objects With a Specific State by Random Seed

初始化场景后,这将随机设置或切换场景中具有StateChange指定状态的所有Sim物体的状态(即,随机破坏CanBreak场景中的所有物体)。 在使用InitialRandomSpawn将物体位置随机化之后使用此方法,因为许多状态更改是单向且具有破坏性的,因此,如果状态已经被随机化,则不能保证可以重新放置物体。

controller.step(action='RandomToggleSpecificState', randomSeed=0, StateChange="CanOpen")
参数类型描述默认值
randomSeedint用于为可重复场景状态随机化。 由于此种子取决于场景的当前状态,因此在执行其他“随机”状态切换之前,请始终使用controller.reset()重置场景。0
StateChangestring用于指定要随机切换具有该状态的所有物体的状态。 有效状态为:CanOpen,CanToggleOnOff,CanBeFilled,CanBeSliced,CanBeCooked,CanBreak,CanBeDirty,CanBeUsedUp。CanOpen
3.4.1.9 Unbreakable Objects

如果对物体施加了足够的力,默认情况下具有Breakable属性的物体将断开。 这意味着从足够高的距离上放下这些物体将导致状态自动改变。 您可以使用此辅助程序初始化功能将给定类型的所有物体设置为牢不可破,从而防止这种自动交互。 此示例将场景中的所有Egg设置为不可破坏,除非明确使用BreakObject操作。

controller.step(action='MakeObjectsOfTypeUnbreakable', objectType="Egg")
参数类型描述默认值
objectTypestring将物体类型指定为不可破坏,除非明确使用BreakObject操作。None
3.4.1.10 Initialize
event = controller.step(action='Initialize', gridSize=0.25, agentCount=2)
3.4.2 Agent Navigation
3.4.3 Object Interaction
3.4.4 Held Object Manipulation
3.4.5 Miscellaneous Actions
3.5 Metadata

每次对controller.step()函数的调用都会返回一个Event对象,该对象包含大量关于环境状态和环境中每个物体的信息。

from ai2thor.controller import Controller

controller = Controller(scene='FloorPlan28', gridSize=0.25)
event = controller.step(action=<SOME ACTION>)
3.5.1 Object Metadata

这是controller.step()的返回对象。

属性类型描述
metadatadict有关智能体,物体,可见性等的所有属性。有关详细文档,请参见下面的描述。
screen_widthint玩家宽度; 从event.metadata [‘screenWidth’]中提取。
screen_heightint玩家高度; 从event.metadata [‘screenHeight’]中提取。
frameNumpy Array来自智能体相机的当前RGB图像。 数组的形状为(宽度,高度,通道)。 通道按RGB顺序排列。 形状:(h,w,c)dtype:numpy.uint8。
depth_frameNumpy ArrayNumpy数组,包含以毫米为单位的深度信息,最大长度为5米。 形状:(h,w)dtype:numpy.float32。
cv2imgNumpy Array适用于OpenCV的Numpy Array。 形状:(h,w,c)通道按BGR顺序排列。
color_to_object_iddict字典:key=RGB元组,value =对应于objectId或对象类型的字符串。 仅当初始化场景的场景时将renderObjectImage设置为True时,才会填充此结构。
object_id_to_colordictcolor_to_object_id结构的逆。
instance_segmentation_frameNumpy Array按单个物体的分割图像,形状:(h,w,c),颜色与在color_to_object_id中找到的键值相对应。 仅在初始化调用期间启用renderObjectImage时可用。
class_segmentation_framenumber按物体类别细分的图像(例如,所有杯子的颜色相同)。 颜色与在color_to_object_id中找到的键值相对应。 仅在初始化调用期间启用renderClassImage时可用。
instance_detections2Ddict检测物体的2D边界框。字典:key=objectId值=边界框。边界框=[start_x, start_y, end_x, end_y]。仅在初始化调用期间启用renderObjectImage时可用。
class_detections2Dnumber检测到的类的2D边界框。 字典:key =对象类值=边界框列表。 边界框= [start_x,start_y,end_x,end_y]。 仅在初始化调用期间启用renderObjectImage时可用。
instance_masksdict可应用于event中其他图像的物体mask字典。键=objectId 值=Numpy数组 形状:(h,w) dtype=numpy.bool。仅在初始化调用期间启用renderObjectImage时可用。
class_masksdict可应用于event中其他图像的类mask的字典。 键=物体类 值=Numpy数组 形状:(h,w) dtype=numpy.bool。 仅在初始化调用期间启用renderObjectImage时可用。
third_party_camera_framesList场景中任何第三方相机的当前RGB图像列表。列表的顺序与添加相机的顺序相对应。图像阵列的形状是(宽度、高度、通道)。通道按RGB顺序排列。形状:(h,w,c) dtype:numpy.uint8
third_party_class_segmentation_framesList来自场景中任何第三方相机的当前分割图像列表。 列表的顺序与添加相机的顺序相对应。 按物体类别细分的图片(例如,所有杯子的颜色相同)。 颜色与在color_to_object_id中找到的键相对应。 仅在初始化调用期间启用renderClassImage时可用。
third_party_instance_segmentation_framesList来自场景中任何第三方相机的当前分割图像列表。 列表的顺序与添加相机的顺序相对应。 按单个物体分割图像的形状,形状:(h,w,c)颜色与在color_to_object_id中找到的键相对应。 仅在初始化调用期间启用renderObjectImage时可用。
third_party_depth_framesList来自场景中任何第三方相机的当前深度图像列表。 列表的顺序与添加相机的顺序相对应。 每个图像都是一个Numpy数组,包含以毫米为单位的深度信息,最大长度为5米。 形状:(h,w)dtype:numpy.float32。 仅在将renderDepthImage = True传递给Initialize操作时可用。
actionReturn某些动作将通过此变量返回元数据。 如果特定动作使用此返回,则详细信息将列在动作文档中。
3.5.2 Multi-Agent Event Object

如果使用多个智能体初始化了环境,则将从step()方法中返回一个Multi-Agent Event对象。 agentId可以为0…N(其中N=智能体数-1)。

controller = Controller(scene='FloorPlan28', gridSize=0.25, agentCount=2) 
event = controller.step(action=<SOME ACTION>, agentId=0)
属性类型描述
metadatadict活动智能体(最新动作的智能体)的元数据。 有关智能体,物体,可见性等的所有属性。有关详细文档,请参见下面的描述。
screen_widthint玩家宽度; 从event.metadata [‘screenWidth’]中提取。
screen_heightint玩家高度; 从event.metadata [‘screenHeight’]中提取。
cv2imgNumpy Array适用于OpenCV的Numpy Array。 形状:(h,w,c)通道按BGR顺序排列。
eventsListevent对象数组。 每个智能体一个。 元素0对应于第一个智能体,元素1对应于第二个智能体。
third_party_camera_framesList场景中任何第三方相机的当前RGB图像列表。 列表的顺序与添加相机的顺序相对应。 图像阵列的形状为(宽度,高度,通道)。 通道按RGB顺序排列。 形状:(h,w,c)dtype:numpy.uint8。
3.5.3 Metadata attributes

这些元素通过使用实例变量“metadata”来检索。

event.metadata
属性类型描述例子
agentagent与智能体位置、相机位置和旋转相关的属性
errorMessagestring字符串,说明上一个动作失败的原因(如果lastActionSuccess为false)
lastActionstring智能体发出的动作MoveAhead
lastActionSuccessboolean上一个动作是否成功True
objectsobjects数组场景中所有物体的数组
screenHeightnumberUnity渲染的图像的高度300
screenWidthnumberUnity渲染的图像的宽度300
sequenceIdnumber用于确保命令和响应一致
thirdPartyCamerasList thirdPartyCamera第三方相机属性列表

3.5.4 Agent attributes
event.metadata['agent']
属性类型描述例子
cameraHorizonfloat相机相对于地平线的位置。0.0表示水平,30.0表示向下看30度,330表示向上看30.0度。0.0
positionxyz dictionary世界参考框架中智能体的x,y,z坐标
rotationxyz dictionary智能体在全局空间中的x,y,z旋转度

3.5.5 Object attributes
event.metadata['objects']
属性类型描述例子
distancefloat从物体中心点到智能体相机的距离。3.541793
namestringUnity场景中物体的名称。这些名称在任何单个场景中都是唯一的。Table_akjlis2j
objectIdstring场景中物体的唯一id。它由物体的类型和物体在场景中的位置坐标组成。TableTop
positionxyz dictionary全局空间中物体的x、Y、Z坐标。
rotationxyz dictionary全局空间中物体的x、Y、Z旋转度数。
visibleboolean布尔值,指示智能体是否可以看到该物体。True
pickupableboolean布尔值,指示智能体是否可以拾取该物体。只有当智能体也可以到达该物体时,才可能实际拾取该物体(即:通过玻璃淋浴门看到肥皂块将报告肥皂块可见,但不能通过玻璃到达)。True
isPickedUpboolean指示智能体当前是否拾取该物体的布尔值。True
receptacleboolean布尔值,指示该物体是否是可以包含其他物体的容器。True
receptacleObjectIdsarray of strings如果物体是容器,则这是容器包含的物体数组。Spoon
openableboolean布尔值,指示物体是否可以通过OpenObjectCloseObject操作打开或关闭。True
isOpenboolean布尔值,指示物体是打开还是关闭。True
toggleableboolean布尔值,指示是否可以使用ToggleObjectOnToggleObjectOff操作打开或关闭物体。True
isToggledboolean布尔值,指示物体是打开还是关闭。True
breakableboolean布尔值,指示物体是可以使用BreakObject断开还是将从足够高的物理力断开。True
isBrokenboolean布尔值,指示物体当前是否已损坏。True
canFillWithLiquidboolean布尔值,指示物体是否可以使用FillObjectWithLiquid操作填充液体。True
isFilledWithLiquidboolean布尔值,指示物体是否充满液体。True
dirtyableboolean布尔值,指示是否可以使用DirtyObjectCleanObject操作将物体切换为dirty或clean。True
isDirtyboolean指示物体是否脏的布尔值。True
cookableboolean布尔值,指示物体是否可以烹饪。True
isCookedboolean布尔值,指示物体是否已烹饪。True
sliceableboolean布尔值,指示是否可以使用SliceObject操作对物体进行切片。True
isSlicedboolean布尔值,指示物体是否已被切片。True
canBeUsedUpboolean布尔值,指示物体是否可以与UseUpObject操作一起使用。True
isUsedUpboolean指示物体是否已用完的布尔值。True
ObjectTemperaturestring列出物体当前相对温度的字符串。有效字符串为:Hot、Cold、RoomTemp。Hot
canChangeTempToHotboolean布尔值,指示物体是否为热源,并且可以在上下文中将其他物体的温度更改为热。True
canChangeTempToColdboolean布尔值,指示物体是否为冷源,并且可以在上下文中将其他物体的温度更改为冷。True
massfloat可拾取的sim物体的质量(千克)。0.5
salientMaterialsarray of strings列有可拾取物体组成的显著材料的字符串数组。有效字符串是:金属,木材,塑料,玻璃,陶瓷,石头,织物,橡胶,食品,纸,蜡,肥皂,海绵,有机。( Metal, Wood, Plastic, Glass, Ceramic, Stone, Fabric, Rubber, Food, Paper, Wax, Soap, Sponge, Organic)Metal, Plastic
objectBoundsarray of xyz dictionary一个由8个xyz坐标字典组成的数组,表示封装物体的面向物体边框的8个角。请注意,此时只有具有pickupable=True属性的物体才具有物体边框。

3.5.6 thirdPartyCamera attributes
event.metadata['thirdPartyCameras']
属性类型描述例子
thirdPartyCameraIdint相机的ID。 与“更新第三方相机”操作结合使用,以更改相机的位置/旋转。0
positionxyz dictionary世界参考框架中智能体的x,y,z坐标
rotationxyz dictionary智能体在全局空间中的x,y,z旋转度

4. RoboTHOR

RoboTHOR是AI2-THOR框架内的一种环境,旨在开发嵌入式AI智能体。 它由一系列与物理世界中的对应物体进行仿真的场景组成。

对于每个物理房间,都有相应的合成等效物,使我们能够研究外观和控制方面的差异。

公寓是以模块化的方式建造的,从一个资源库中提取。

物理环境是使用模块化和可移动的组件构建的,从而使我们可以在单个物理空间中托管具有截然不同布局的场景。

仿真环境是开源的。 研究人员将能够在实际环境中远程部署他们的模型。

4.1 Initialization

要初始化场景中的智能体,请执行以下操作。

controller = Controller(scene='FloorPlan_Train1_1', agentMode='bot')
参数类型描述默认值
scenestring要初始化的场景的名称。 有关RoboTHOR场景的完整列表,请参见下文。
agentModestring为了正确初始化RobotTHOR智能体,请始终将此设置为“ bot”。
agentTypestring如果需要随机运动,请将其设置为随机。null
gridSizefloat智能体导航的网格的大小。这确定了采取动作MoveAhead或MoveBack时智能体采取的步长。 仅当agentType不随机时才使用此网格。0.25
applyActionNoisebool如果agentType设置为随机,则此布尔值会将移动和旋转高斯噪声自动应用于“移动”和“旋转”动作。True
movementGaussianMufloat仅当agentType设置为随机且applyActionNoise设置为True时,才应用此值。 如果不为零,则移动动作后的坐席位置将被取自具有均值运动GaussianMu的高斯所取的随机值。0.001
movementGaussianSigmafloat仅当agentType设置为随机且applyActionNoise设置为True时,才应用此值。 如果为非零值,则移动动作后座席的位置将被取自具有标准偏差motionGaussianSigma的高斯的随机值偏移。0.005
rotateGaussianMufloat仅当agentType设置为随机且applyActionNoise设置为True时,才应用此值。 如果不为零,则旋转动作后座席的旋转将被取自具有平均rotateGaussianMu的高斯的随机值抵消。0.0
rotateGaussianSigmafloat仅当agentType设置为随机且applyActionNoise设置为True时,才应用此值。 如果不为零,则代理在旋转动作后的旋转将被取自具有标准偏差rotateGaussianSigma的高斯所取的随机值。0.5
renderDepthImagebool启用后,深度图像将作为属性depth_frame在返回的事件中发送并可用。False
renderClassImagebool启用后,类分割图像将作为属性class_segmentation_frame在返回的事件中发送并可用。False
renderObjectImagebool启用后,物体分割图像作为属性实例instance_segmentation_frame在返回的事件中发送并可用。False
visibilityDistancefloat从智能体的相机(位于智能体顶部附近)到一个物体应被视为可见的距离,以米为单位。1.5
widthint设置返回图像的宽度(以像素为单位)。 必须大于等于300。与简单地将默认的300像素乘以300像素的图像大小相反,使用较大的图像可以提高图像质量。300
heightint设置返回图像的高度(以像素为单位)。 必须大于等于300。300
rotateStepDegreesfloat使用RotateLeft或RotateRight操作时智能体将旋转的度数。90.0
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐