VisualNavigation--3D 环境 ai2thor 安装和介绍

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

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

iTHOR RoboTHOR
概念
场景
物体
动作
元数据

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相机配合使用
  • 从资产库中以模块化方式构建公寓
  • 实体公寓可轻松重新配置
  • 所有人均可访问的仿真和真实环境

3. iTHOR

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

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

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

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

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

3.1 概念

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

概念 描述
Agent 智能体是一个实体,可以在场景中导航并与物体进行交互。
Scene AI2-THOR中的场景表示智能体可以导航并与其交互的虚拟房间。 有4个场景类别,每个类别中有30个独特的场景:厨房,客厅,卧室,浴室。
Action 动作是智能体在场景中执行的离散命令(例如MoveAhead,RotateRight,PickupObject)
Sim Object sim物体是智能体可以与之交互的物体。 根据物体类型定义的不同,物体具有很广泛地交互类型。
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种物体类型。 每种物体类型都具有与之相关的可操作属性、材质属性和物体位置(在场景类别内)。 此外,某些物体与其他物体或环境的某些部分具有上下文交互作用,这可能导致物体状态动态变化。

物体类型表格如下:

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

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

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

初始化可选参数如下:

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

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

动作类型 语法 动作集合
Initialization controller.reset(), controller.step(action=’’) action可取的值:InitialRandomSpawn, SetObjectPoses, SetObjectToggles, RandomToggleStateOfAllObjects, RandomToggleSpecificState, MakeObjectsOfTypeUnbreakable
Agent Navigation controller.step(action=’’) action可取的值:RotateRight, RotateLeft, LookUp, LookDown, MoveAhead, MoveRight, MoveLeft, MoveBack, Crouch, Stand, Teleport, TeleportFull, GetReachablePositions
Object Interaction controller.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 Manipulation controller.step(action=’’) action可取的值:MoveHandAhead, MoveHandBack, MoveHandLeft, MoveHandRight, MoveHandUp, MoveHandDown, RotateHand
Miscellaneous Actions controller.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')
参数 类型 描述 默认值
scene string 要加载的场景的名称。 厨房: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}])

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

参数 类型 描述 默认值
randomSeed int 用于为可重复场景状态随机化。 因为此种子取决于场景的当前状态,所以请记住在运行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)
参数 类型 描述 默认值
objectPoses list 物体名称及其姿势的列表。这些信息可以从之前一集的元数据中转储。 None
3.4.1.4 objectPoses attributes

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

参数 类型 描述 例子
objectName string 由物体元数据的名称报告的SimObject的名称。 Alarm_Clock_19
position xyz dictionary 物体位置的x,y,z坐标。 这由物体元数据位置报告。 (0.54, 0.3, 12.3)
rotation xyz 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}])
参数 类型 描述 默认值
objectToggles list 可切换物体类型的列表以及将每种类型设置为的布尔值。 None
3.4.1.6 objectToggles attributes

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

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

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

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

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

controller.step(action='MakeObjectsOfTypeUnbreakable', objectType="Egg")
参数 类型 描述 默认值
objectType string 将物体类型指定为不可破坏,除非明确使用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()的返回对象。

属性 类型 描述
metadata dict 有关智能体,物体,可见性等的所有属性。有关详细文档,请参见下面的描述。
screen_width int 玩家宽度; 从event.metadata [‘screenWidth’]中提取。
screen_height int 玩家高度; 从event.metadata [‘screenHeight’]中提取。
frame Numpy Array 来自智能体相机的当前RGB图像。 数组的形状为(宽度,高度,通道)。 通道按RGB顺序排列。 形状:(h,w,c)dtype:numpy.uint8。
depth_frame Numpy Array Numpy数组,包含以毫米为单位的深度信息,最大长度为5米。 形状:(h,w)dtype:numpy.float32。
cv2img Numpy Array 适用于OpenCV的Numpy Array。 形状:(h,w,c)通道按BGR顺序排列。
color_to_object_id dict 字典:key=RGB元组,value =对应于objectId或对象类型的字符串。 仅当初始化场景的场景时将renderObjectImage设置为True时,才会填充此结构。
object_id_to_color dict color_to_object_id结构的逆。
instance_segmentation_frame Numpy Array 按单个物体的分割图像,形状:(h,w,c),颜色与在color_to_object_id中找到的键值相对应。 仅在初始化调用期间启用renderObjectImage时可用。
class_segmentation_frame number 按物体类别细分的图像(例如,所有杯子的颜色相同)。 颜色与在color_to_object_id中找到的键值相对应。 仅在初始化调用期间启用renderClassImage时可用。
instance_detections2D dict 检测物体的2D边界框。字典:key=objectId值=边界框。边界框=[start_x, start_y, end_x, end_y]。仅在初始化调用期间启用renderObjectImage时可用。
class_detections2D number 检测到的类的2D边界框。 字典:key =对象类值=边界框列表。 边界框= [start_x,start_y,end_x,end_y]。 仅在初始化调用期间启用renderObjectImage时可用。
instance_masks dict 可应用于event中其他图像的物体mask字典。键=objectId 值=Numpy数组 形状:(h,w) dtype=numpy.bool。仅在初始化调用期间启用renderObjectImage时可用。
class_masks dict 可应用于event中其他图像的类mask的字典。 键=物体类 值=Numpy数组 形状:(h,w) dtype=numpy.bool。 仅在初始化调用期间启用renderObjectImage时可用。
third_party_camera_frames List 场景中任何第三方相机的当前RGB图像列表。列表的顺序与添加相机的顺序相对应。图像阵列的形状是(宽度、高度、通道)。通道按RGB顺序排列。形状:(h,w,c) dtype:numpy.uint8
third_party_class_segmentation_frames List 来自场景中任何第三方相机的当前分割图像列表。 列表的顺序与添加相机的顺序相对应。 按物体类别细分的图片(例如,所有杯子的颜色相同)。 颜色与在color_to_object_id中找到的键相对应。 仅在初始化调用期间启用renderClassImage时可用。
third_party_instance_segmentation_frames List 来自场景中任何第三方相机的当前分割图像列表。 列表的顺序与添加相机的顺序相对应。 按单个物体分割图像的形状,形状:(h,w,c)颜色与在color_to_object_id中找到的键相对应。 仅在初始化调用期间启用renderObjectImage时可用。
third_party_depth_frames List 来自场景中任何第三方相机的当前深度图像列表。 列表的顺序与添加相机的顺序相对应。 每个图像都是一个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)
属性 类型 描述
metadata dict 活动智能体(最新动作的智能体)的元数据。 有关智能体,物体,可见性等的所有属性。有关详细文档,请参见下面的描述。
screen_width int 玩家宽度; 从event.metadata [‘screenWidth’]中提取。
screen_height int 玩家高度; 从event.metadata [‘screenHeight’]中提取。
cv2img Numpy Array 适用于OpenCV的Numpy Array。 形状:(h,w,c)通道按BGR顺序排列。
events List event对象数组。 每个智能体一个。 元素0对应于第一个智能体,元素1对应于第二个智能体。
third_party_camera_frames List 场景中任何第三方相机的当前RGB图像列表。 列表的顺序与添加相机的顺序相对应。 图像阵列的形状为(宽度,高度,通道)。 通道按RGB顺序排列。 形状:(h,w,c)dtype:numpy.uint8。
3.5.3 Metadata attributes

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

event.metadata
属性 类型 描述 例子
agent agent 与智能体位置、相机位置和旋转相关的属性
errorMessage string 字符串,说明上一个动作失败的原因(如果lastActionSuccess为false)
lastAction string 智能体发出的动作 MoveAhead
lastActionSuccess boolean 上一个动作是否成功 True
objects objects数组 场景中所有物体的数组
screenHeight number Unity渲染的图像的高度 300
screenWidth number Unity渲染的图像的宽度 300
sequenceId number 用于确保命令和响应一致
thirdPartyCameras List thirdPartyCamera 第三方相机属性列表

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

3.5.5 Object attributes
event.metadata['objects']
属性 类型 描述 例子
distance float 从物体中心点到智能体相机的距离。 3.541793
name string Unity场景中物体的名称。这些名称在任何单个场景中都是唯一的。 Table_akjlis2j
objectId string 场景中物体的唯一id。它由物体的类型和物体在场景中的位置坐标组成。 TableTop
position xyz dictionary 全局空间中物体的x、Y、Z坐标。
rotation xyz dictionary 全局空间中物体的x、Y、Z旋转度数。
visible boolean 布尔值,指示智能体是否可以看到该物体。 True
pickupable boolean 布尔值,指示智能体是否可以拾取该物体。只有当智能体也可以到达该物体时,才可能实际拾取该物体(即:通过玻璃淋浴门看到肥皂块将报告肥皂块可见,但不能通过玻璃到达)。 True
isPickedUp boolean 指示智能体当前是否拾取该物体的布尔值。 True
receptacle boolean 布尔值,指示该物体是否是可以包含其他物体的容器。 True
receptacleObjectIds array of strings 如果物体是容器,则这是容器包含的物体数组。 Spoon
openable boolean 布尔值,指示物体是否可以通过OpenObjectCloseObject操作打开或关闭。 True
isOpen boolean 布尔值,指示物体是打开还是关闭。 True
toggleable boolean 布尔值,指示是否可以使用ToggleObjectOnToggleObjectOff操作打开或关闭物体。 True
isToggled boolean 布尔值,指示物体是打开还是关闭。 True
breakable boolean 布尔值,指示物体是可以使用BreakObject断开还是将从足够高的物理力断开。 True
isBroken boolean 布尔值,指示物体当前是否已损坏。 True
canFillWithLiquid boolean 布尔值,指示物体是否可以使用FillObjectWithLiquid操作填充液体。 True
isFilledWithLiquid boolean 布尔值,指示物体是否充满液体。 True
dirtyable boolean 布尔值,指示是否可以使用DirtyObjectCleanObject操作将物体切换为dirty或clean。 True
isDirty boolean 指示物体是否脏的布尔值。 True
cookable boolean 布尔值,指示物体是否可以烹饪。 True
isCooked boolean 布尔值,指示物体是否已烹饪。 True
sliceable boolean 布尔值,指示是否可以使用SliceObject操作对物体进行切片。 True
isSliced boolean 布尔值,指示物体是否已被切片。 True
canBeUsedUp boolean 布尔值,指示物体是否可以与UseUpObject操作一起使用。 True
isUsedUp boolean 指示物体是否已用完的布尔值。 True
ObjectTemperature string 列出物体当前相对温度的字符串。有效字符串为:Hot、Cold、RoomTemp。 Hot
canChangeTempToHot boolean 布尔值,指示物体是否为热源,并且可以在上下文中将其他物体的温度更改为热。 True
canChangeTempToCold boolean 布尔值,指示物体是否为冷源,并且可以在上下文中将其他物体的温度更改为冷。 True
mass float 可拾取的sim物体的质量(千克)。 0.5
salientMaterials array of strings 列有可拾取物体组成的显著材料的字符串数组。有效字符串是:金属,木材,塑料,玻璃,陶瓷,石头,织物,橡胶,食品,纸,蜡,肥皂,海绵,有机。( Metal, Wood, Plastic, Glass, Ceramic, Stone, Fabric, Rubber, Food, Paper, Wax, Soap, Sponge, Organic) Metal, Plastic
objectBounds array of xyz dictionary 一个由8个xyz坐标字典组成的数组,表示封装物体的面向物体边框的8个角。请注意,此时只有具有pickupable=True属性的物体才具有物体边框。

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

4. RoboTHOR

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

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

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

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

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

4.1 Initialization

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

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

猜你喜欢

转载自blog.csdn.net/u010705932/article/details/104472316