Добавлены 3д модели для второго эксперемнта и два мира для эксперемента

This commit is contained in:
Даниил Грабарь
2026-11-06 16:37:06 +10:00
parent e94f9ac47e
commit 1caa919ea4
31 changed files with 536188 additions and 142043 deletions
+2 -3
View File
@@ -16,14 +16,14 @@ digital_twin:
max_linear_speed: 0.50 # верхний предел скорости TCP [м/с] max_linear_speed: 0.50 # верхний предел скорости TCP [м/с]
max_angular_speed: 0.4 # скорость вращения TCP [рад/с] max_angular_speed: 0.4 # скорость вращения TCP [рад/с]
webots: webots:
world: pkg://iiwa_description/worlds/iiwa.wbt world: pkg://iiwa_description/worlds/grant/body_hatch_installed.wbt
# world: pkg://iiwa_description/worlds/simple_world.wbt # world: pkg://iiwa_description/worlds/simple_world.wbt
transform: "-0.25 0 0.79" transform: "-0.25 0 0.79"
rotation: "0 0 1 0" rotation: "0 0 1 0"
controller_timer: "50" controller_timer: "50"
objects: objects:
enabled: true enabled: false
count: 5 # точное общее количество; модели могут повторяться count: 5 # точное общее количество; модели могут повторяться
models: models:
# - path: pkg://iiwa_description/objects/hammer/hammer1.obj # - path: pkg://iiwa_description/objects/hammer/hammer1.obj
@@ -43,7 +43,6 @@ digital_twin:
y: [-0.3, 0.3] y: [-0.3, 0.3]
z: [0.1, 0.1] # высота нижней точки модели z: [0.1, 0.1] # высота нижней точки модели
cameras: cameras:
- pkg://iiwa_config/config/cameras/d455_top.yaml - pkg://iiwa_config/config/cameras/d455_top.yaml
@@ -0,0 +1,72 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Металл_|_оцинкованный
Ns 562.500000
Ka 0.820000 0.820000 0.820000
Kd 0.566810 0.612066 0.625345
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Металл_|_тёмный
Ns 462.399994
Ka 0.750000 0.750000 0.750000
Kd 0.151058 0.176774 0.186989
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Пластик_|_графит
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.039947 0.046149 0.052842
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_светло-серый
Ns 384.399994
Ka 1.000000 1.000000 1.000000
Kd 0.701169 0.708298 0.680020
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_серый
Ns 313.600006
Ka 1.000000 1.000000 1.000000
Kd 0.425905 0.453456 0.442323
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_средне-серый
Ns 302.500000
Ka 1.000000 1.000000 1.000000
Kd 0.271577 0.293216 0.288816
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Резина_|_чёрная
Ns 102.399994
Ka 1.000000 1.000000 1.000000
Kd 0.002263 0.002932 0.003697
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,62 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Клеммник_|_синий_по_референсу
Ns 384.399994
Ka 1.000000 1.000000 1.000000
Kd 0.001963 0.133209 0.409826
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Металл_|_оцинкованный.001
Ns 562.500000
Ka 0.820000 0.820000 0.820000
Kd 0.566810 0.612066 0.625345
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Металл_|_тёмный.002
Ns 462.399994
Ka 0.750000 0.750000 0.750000
Kd 0.151058 0.176774 0.186989
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Пластик_|_графит.002
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.039947 0.046149 0.052842
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_тёмно-синий
Ns 313.600006
Ka 1.000000 1.000000 1.000000
Kd 0.000805 0.071761 0.212044
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Резина_|_чёрная.002
Ns 102.399994
Ka 1.000000 1.000000 1.000000
Kd 0.002263 0.002932 0.003697
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,12 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Лотки_|_глубокий_синий
Ns 360.000000
Ka 1.000000 1.000000 1.000000
Kd 0.000805 0.042987 0.183549
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,32 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Платформа_|_текстурированная
Ns 48.400013
Ka 1.000000 1.000000 1.000000
Kd 0.013473 0.016068 0.017936
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Разметка_|_жёлтая
Ns 360.000000
Ka 1.000000 1.000000 1.000000
Kd 0.804559 0.573159 0.000000
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Разметка_|_серая
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.344026 0.368591 0.378676
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,92 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Корпуса_|_серый_по_референсу.001
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.353741 0.383775 0.378676
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Металл_|_оцинкованный.002
Ns 562.500000
Ka 0.820000 0.820000 0.820000
Kd 0.566810 0.612066 0.625345
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Металл_|_тёмный.003
Ns 462.399994
Ka 0.750000 0.750000 0.750000
Kd 0.151058 0.176774 0.186989
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Панель_ПЛК_|_тёмный_графит
Ns 250.000000
Ka 1.000000 1.000000 1.000000
Kd 0.010398 0.013473 0.016988
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_графит.003
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.039947 0.046149 0.052842
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_светло-серый.002
Ns 384.399994
Ka 1.000000 1.000000 1.000000
Kd 0.701169 0.708298 0.680020
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_серый.001
Ns 313.600006
Ka 1.000000 1.000000 1.000000
Kd 0.425905 0.453456 0.442323
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_средне-серый.002
Ns 302.500000
Ka 1.000000 1.000000 1.000000
Kd 0.271577 0.293216 0.288816
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Резина_|_чёрная.003
Ns 102.399994
Ka 1.000000 1.000000 1.000000
Kd 0.002263 0.002932 0.003697
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,72 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Индикатор_|_зелёный
Ns 608.399963
Ka 1.000000 1.000000 1.000000
Kd 0.052842 0.573159 0.067725
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Корпуса_|_серый_по_референсу
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.353741 0.383775 0.378676
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Металл_|_тёмный.001
Ns 462.399994
Ka 0.750000 0.750000 0.750000
Kd 0.151058 0.176774 0.186989
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Пластик_|_графит.001
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.039947 0.046149 0.052842
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_светло-серый.001
Ns 384.399994
Ka 1.000000 1.000000 1.000000
Kd 0.701169 0.708298 0.680020
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_средне-серый.001
Ns 302.500000
Ka 1.000000 1.000000 1.000000
Kd 0.271577 0.293216 0.288816
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Резина_|_чёрная.001
Ns 102.399994
Ka 1.000000 1.000000 1.000000
Kd 0.002263 0.002932 0.003697
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,12 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Корпуса_|_серый_по_референсу.002
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.353741 0.383775 0.378676
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,82 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Крышка_|_прозрачная_синяя
Ns 705.600098
Ka 1.000000 1.000000 1.000000
Kd 0.056374 0.353741 0.535642
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 0.420000
illum 9
newmtl Крышка_|_синие_кромки
Ns 640.000000
Ka 1.000000 1.000000 1.000000
Kd 0.020951 0.173439 0.271577
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 0.650000
illum 9
newmtl Медь_|_катушка
Ns 291.599945
Ka 0.320000 0.320000 0.320000
Kd 0.560499 0.275833 0.121986
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Металл_|_оцинкованный.003
Ns 562.500000
Ka 0.820000 0.820000 0.820000
Kd 0.566810 0.612066 0.625345
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Металл_|_тёмный.004
Ns 462.399994
Ka 0.750000 0.750000 0.750000
Kd 0.151058 0.176774 0.186989
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 3
newmtl Пластик_|_графит.004
Ns 291.599945
Ka 1.000000 1.000000 1.000000
Kd 0.039947 0.046149 0.052842
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_средне-серый.003
Ns 302.500000
Ka 1.000000 1.000000 1.000000
Kd 0.271577 0.293216 0.288816
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
newmtl Пластик_|_тёмно-синий.001
Ns 313.600006
Ka 1.000000 1.000000 1.000000
Kd 0.000805 0.071761 0.212044
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,12 @@
# Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org
newmtl Лотки_|_глубокий_синий.001
Ns 360.000000
Ka 1.000000 1.000000 1.000000
Kd 0.000805 0.042987 0.183549
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.500000
d 1.000000
illum 2
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,7 @@
# Blender 5.2.1 LTS MTL File: 'None' # Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org # www.blender.org
newmtl Dark_tool_steel.002 newmtl Dark_tool_steel.003
Ns 504.100067 Ns 504.100067
Ka 0.820000 0.820000 0.820000 Ka 0.820000 0.820000 0.820000
Kd 0.160000 0.180000 0.200000 Kd 0.160000 0.180000 0.200000
@@ -21,7 +21,7 @@ Ni 1.500000
d 1.000000 d 1.000000
illum 3 illum 3
newmtl Satin_stainless_steel.002 newmtl Satin_stainless_steel.003
Ns 562.500000 Ns 562.500000
Ka 0.880000 0.880000 0.880000 Ka 0.880000 0.880000 0.880000
Kd 0.520000 0.560000 0.590000 Kd 0.520000 0.560000 0.590000
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,7 +1,7 @@
# Blender 5.2.1 LTS MTL File: 'None' # Blender 5.2.1 LTS MTL File: 'None'
# www.blender.org # www.blender.org
newmtl Black_elastomer newmtl Black_elastomer.001
Ns 193.600006 Ns 193.600006
Ka 1.000000 1.000000 1.000000 Ka 1.000000 1.000000 1.000000
Kd 0.012000 0.016000 0.019000 Kd 0.012000 0.016000 0.019000
@@ -11,7 +11,7 @@ Ni 1.500000
d 1.000000 d 1.000000
illum 2 illum 2
newmtl Dark_tool_steel.001 newmtl Dark_tool_steel.005
Ns 504.100067 Ns 504.100067
Ka 0.820000 0.820000 0.820000 Ka 0.820000 0.820000 0.820000
Kd 0.160000 0.180000 0.200000 Kd 0.160000 0.180000 0.200000
@@ -21,7 +21,7 @@ Ni 1.500000
d 1.000000 d 1.000000
illum 3 illum 3
newmtl Satin_stainless_steel.001 newmtl Satin_stainless_steel.005
Ns 562.500000 Ns 562.500000
Ka 0.880000 0.880000 0.880000 Ka 0.880000 0.880000 0.880000
Kd 0.520000 0.560000 0.590000 Kd 0.520000 0.560000 0.590000
@@ -31,7 +31,7 @@ Ni 1.500000
d 1.000000 d 1.000000
illum 3 illum 3
newmtl Socket_recess.001 newmtl Socket_recess.004
Ns 250.000000 Ns 250.000000
Ka 0.100000 0.100000 0.100000 Ka 0.100000 0.100000 0.100000
Kd 0.006000 0.007000 0.008000 Kd 0.006000 0.007000 0.008000
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,122 @@
#VRML_SIM R2025a utf8
# Original-size grant magazine. The sealant OBJ export is 10 times smaller
# than the other tool meshes, so scale only that tool visual.
# The OBJ meshes use Y as vertical; the default rotation maps Y to world Z.
PROTO GrantToolRack [
field SFVec3f translation 0 0 0
field SFRotation rotation 1 0 0 1.57079632679
]
{
Solid {
translation IS translation
rotation IS rotation
name "grant_tool_magazine"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.72 0.47 0.14
roughness 0.56
metalness 0.35
}
geometry Mesh {
url [ "../../objects/grant/tool-magizine.obj" ]
}
}
Solid {
translation -0.135 0.01 0
name "grant_vacuum_tool_docked"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.16 0.47 0.72
roughness 0.5
metalness 0.25
}
geometry Mesh {
url [ "../../objects/grant/vacum-tool.obj" ]
}
}
]
boundingObject Pose {
translation 0.00054 0.07 0
children [ Box { size 0.0821 0.14 0.081 } ]
}
}
Solid {
translation -0.045 0.01 0
name "grant_magnetic_tool_docked"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.43 0.30 0.65
roughness 0.4
metalness 0.45
}
geometry Mesh {
url [ "../../objects/grant/magnit-tool.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.07 0
children [ Box { size 0.036 0.14 0.036 } ]
}
}
Solid {
translation 0.045 0.01 0
name "grant_sealant_tool_docked"
locked TRUE
children [
Transform {
scale 10 10 10
children [
Shape {
appearance PBRAppearance {
baseColor 0.23 0.57 0.31
roughness 0.6
metalness 0.15
}
geometry Mesh {
url [ "../../objects/grant/germetic-tool.obj" ]
}
}
]
}
]
boundingObject Pose {
translation 0 0.07 0
children [ Box { size 0.05608 0.14 0.05608 } ]
}
}
Solid {
translation 0.135 0.01 0
name "grant_wrench_tool_docked"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.80 0.32 0.18
roughness 0.4
metalness 0.45
}
geometry Mesh {
url [ "../../objects/grant/wranch-tool.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.07 0
children [ Box { size 0.049 0.14 0.049 } ]
}
}
]
boundingObject Pose {
translation 0 0.005 0
children [ Box { size 0.42 0.01 0.14 } ]
}
}
}
@@ -0,0 +1,9 @@
Webots Project File version R2025a
perspectives: 000000ff00000000fd0000000300000000000001ca0000039ffc0200000001fb00000012005300630065006e0065005400720065006501000000000000039f0000000000000000000000010000023a00000390fc0200000001fb0000001400540065007800740045006400690074006f00720100000014000003900000003f00ffffff000000030000078000000039fc0100000002fb0000000e0043006f006e0073006f006c006501000001d0000005b00000000000000000fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c0100000000000007800000006900ffffff000005440000039000000004000000040000000100000008fc00000000
simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000002010000000101
sceneTreePerspectives: 000000ff00000001000000030000001c000002b2000000fa0100000002010000000201
maximizedDockId: -1
centralWidgetVisible: 1
orthographicViewHeight: 1
textFiles: -1
consoles: Console:All:All
@@ -0,0 +1,8 @@
Webots Project File version R2025a
perspectives: 000000ff00000000fd0000000300000000000001ca0000039ffc0200000001fb00000012005300630065006e0065005400720065006501000000000000039f0000000000000000000000010000023a00000390fc0200000001fb0000001400540065007800740045006400690074006f00720000000014000003900000003f00ffffff0000000300000780000000a0fc0100000002fb0000000e0043006f006e0073006f006c006501000001d0000005b00000000000000000fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c010000000000000780000000000000000000000780000003cb00000004000000040000000100000008fc00000000
simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000002010000000101
sceneTreePerspectives: 000000ff00000001000000030000001c000000c0000000fa0100000002010000000201
maximizedDockId: -1
centralWidgetVisible: 1
orthographicViewHeight: 1
textFiles: -1
@@ -0,0 +1,188 @@
#VRML_SIM R2025a utf8
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/backgrounds/protos/TexturedBackground.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/floors/protos/RectangleArena.proto"
EXTERNPROTO "../../resource/protos/CollaborativeRobotTable.proto"
EXTERNPROTO "../../resource/protos/WorkspaceLimiter.proto"
EXTERNPROTO "../../resource/protos/GrantToolRack.proto"
# Based on ../iiwa.wbt. The robot is spawned by iiwa_bringup at
# (-0.25, 0, 0.79), facing world +X. All workpieces stay on the table
# in front of its base. The tabletop is at world Z = 0.793 m.
# The workpiece OBJ meshes use Y as their vertical axis. The shared axis-angle
# rotation first maps Y to world Z, then turns the workpieces 45 degrees
# around world Z. Coordinates and dimensions are metres.
#
# Base scene: the hatch lies separately on the tabletop for pickup and
# transfer. The robot starts without an attached tool; the magazine holds
# four static tools. For an already installed
# hatch, use body_hatch_installed.wbt. For experiment 02, offset
# BODY_HATCH_BODY by +0.003 m in X. Experiment 03 keeps an empty fixture;
# experiment 12 omits the hatch.
WorldInfo {
title "Body and hatch - grant experiments"
basicTimeStep 32
optimalThreadCount 4
contactProperties [
ContactProperties {
material1 "TableMaterial"
coulombFriction [ 0.6 ]
bounce 0
bounceVelocity 0
softERP 1
softCFM 0.0001
}
ContactProperties {
material1 "tool"
material2 "TableMaterial"
bounce 0
softCFM 0.002
maxContactJoints 100
}
ContactProperties {
material1 "default"
material2 "default"
maxContactJoints 20
bounce 0
softCFM 0.001
}
]
}
Viewpoint {
orientation 0.19663259328507318 -0.09057124279298501 -0.9762850368805829 3.9867817928674034
position 1.75 -1.85 1.77
followType "Mounted Shot"
ambientOcclusionRadius 3
}
TexturedBackground {
}
TexturedBackgroundLight {
texture "noon_sunny_empty"
luminosity 2
}
RectangleArena {
name "Arena"
floorSize 12 12
wallHeight 2
}
CollaborativeRobotTable {
translation 0 0 -0.007
locked TRUE
showCabinet TRUE
}
DEF limiter Group {
children [
WorkspaceLimiter {
translation -1.56 -0.219999 1.01
rotation 0 0 1 1.5708
name "WorkspaceLimiter_back"
locked TRUE
scale 2.32 1 2
}
WorkspaceLimiter {
translation -0.04 1.18 1.01
name "WorkspaceLimiter_right"
locked TRUE
scale 2.43 1 2
}
]
}
DirectionalLight {
direction -0.1 0.1 0
intensity 2
}
# Fixture plate: bottom Y=-0.010 m rests on the tabletop. The two rails
# support the body at Y=+0.0161 m without intersecting its underside.
DEF BODY_HATCH_STAPEL Solid {
translation 0.30 0.12 0.803
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_stapel"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.30 0.34 0.39
roughness 0.55
metalness 0.55
}
geometry Mesh {
url [ "../../objects/grant/stapel.obj" ]
}
}
]
boundingObject Group {
children [
Pose {
translation 0 -0.005 0
children [ Box { size 0.35 0.01 0.22 } ]
}
Pose {
translation -0.104 0.008 0
children [ Box { size 0.014 0.016 0.156 } ]
}
Pose {
translation 0.104 0.008 0
children [ Box { size 0.014 0.016 0.156 } ]
}
]
}
}
# The body shares the fixture centre. Its +0.020 m height puts the
# underside on top of the fixture rails.
DEF BODY_HATCH_BODY Solid {
translation 0.30 0.12 0.823
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_body"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.64 0.68 0.72
roughness 0.45
metalness 0.45
}
geometry Mesh {
url [ "../../objects/grant/base-detail.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.000695 0
children [ Box { size 0.30 0.00915 0.17 } ]
}
}
DEF BODY_HATCH_CAP Solid {
translation 0.35 -0.25 0.790667
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_cap"
children [
Shape {
appearance PBRAppearance {
baseColor 0.78 0.82 0.86
roughness 0.35
metalness 0.55
}
geometry Mesh {
url [ "../../objects/grant/cap.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.004165 0
children [ Box { size 0.1384 0.00367 0.0984 } ]
}
physics Physics {
mass 0.1
}
}
# The rack is in the front-left work area, clear of the loose hatch.
# Its 180-degree yaw faces the tool sockets toward the robot.
GrantToolRack {
translation 0.12 -0.42 0.793
rotation 0 0.70710678118 0.70710678118 3.14159265359
}
@@ -0,0 +1,182 @@
#VRML_SIM R2025a utf8
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/backgrounds/protos/TexturedBackground.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/backgrounds/protos/TexturedBackgroundLight.proto"
EXTERNPROTO "https://raw.githubusercontent.com/cyberbotics/webots/R2025a/projects/objects/floors/protos/RectangleArena.proto"
EXTERNPROTO "../../resource/protos/CollaborativeRobotTable.proto"
EXTERNPROTO "../../resource/protos/WorkspaceLimiter.proto"
EXTERNPROTO "../../resource/protos/GrantToolRack.proto"
# Based on ../iiwa.wbt. The robot is spawned by iiwa_bringup at
# (-0.25, 0, 0.79), facing world +X. All workpieces stay on the table
# in front of its base. The tabletop is at world Z = 0.793 m.
# The workpiece OBJ meshes use Y as their vertical axis. The shared axis-angle
# rotation first maps Y to world Z, then turns the workpieces 45 degrees
# around world Z. Coordinates and dimensions are metres.
#
# Installed scene for experiments 04, 14 and 15: the hatch is fixed on
# the body surface. The magazine holds the four static tool models.
# For a loose hatch that the robot can pick up, use body_hatch.wbt.
WorldInfo {
title "Body with installed hatch and tool magazine"
basicTimeStep 32
optimalThreadCount 4
contactProperties [
ContactProperties {
material1 "TableMaterial"
coulombFriction [ 0.6 ]
bounce 0
bounceVelocity 0
softERP 1
softCFM 0.0001
}
ContactProperties {
material1 "tool"
material2 "TableMaterial"
bounce 0
softCFM 0.002
maxContactJoints 100
}
ContactProperties {
material1 "default"
material2 "default"
maxContactJoints 20
bounce 0
softCFM 0.001
}
]
}
Viewpoint {
orientation 0.19663259328507318 -0.09057124279298501 -0.9762850368805829 3.9867817928674034
position 1.75 -1.85 1.77
followType "Mounted Shot"
ambientOcclusionRadius 3
}
TexturedBackground {
}
TexturedBackgroundLight {
texture "noon_sunny_empty"
luminosity 2
}
RectangleArena {
name "Arena"
floorSize 12 12
wallHeight 2
}
CollaborativeRobotTable {
translation 0 0 -0.007
locked TRUE
showCabinet TRUE
}
DEF limiter Group {
children [
WorkspaceLimiter {
translation -1.56 -0.219999 1.01
rotation 0 0 1 1.5708
name "WorkspaceLimiter_back"
locked TRUE
scale 2.32 1 2
}
WorkspaceLimiter {
translation -0.04 1.18 1.01
name "WorkspaceLimiter_right"
locked TRUE
scale 2.43 1 2
}
]
}
DirectionalLight {
direction -0.1 0.1 0
intensity 2
}
# Fixture plate: bottom Y=-0.010 m rests on the tabletop. The two rails
# support the body at Y=+0.0161 m without intersecting its underside.
DEF BODY_HATCH_STAPEL Solid {
translation 0.30 0.12 0.803
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_stapel"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.30 0.34 0.39
roughness 0.55
metalness 0.55
}
geometry Mesh {
url [ "../../objects/grant/stapel.obj" ]
}
}
]
boundingObject Group {
children [
Pose {
translation 0 -0.005 0
children [ Box { size 0.35 0.01 0.22 } ]
}
Pose {
translation -0.104 0.008 0
children [ Box { size 0.014 0.016 0.156 } ]
}
Pose {
translation 0.104 0.008 0
children [ Box { size 0.014 0.016 0.156 } ]
}
]
}
}
# The body shares the fixture centre. Its +0.020 m height puts the
# underside on top of the fixture rails.
DEF BODY_HATCH_BODY Solid {
translation 0.30 0.12 0.823
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_body"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.64 0.68 0.72
roughness 0.45
metalness 0.45
}
geometry Mesh {
url [ "../../objects/grant/base-detail.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.000695 0
children [ Box { size 0.30 0.00915 0.17 } ]
}
}
DEF BODY_HATCH_CAP Solid {
translation 0.30 0.12 0.82594
rotation 0.862856209461 0.357406744337 0.357406744337 1.717771517458
name "body_hatch_cap"
locked TRUE
children [
Shape {
appearance PBRAppearance {
baseColor 0.78 0.82 0.86
roughness 0.35
metalness 0.55
}
geometry Mesh {
url [ "../../objects/grant/cap.obj" ]
}
}
]
boundingObject Pose {
translation 0 0.004165 0
children [ Box { size 0.1384 0.00367 0.0984 } ]
}
}
# The rack is visible in the front-left work area, facing the robot.
GrantToolRack {
translation 0.12 -0.42 0.793
rotation 0 0.70710678118 0.70710678118 3.14159265359
}
@@ -0,0 +1,75 @@
"""Both grant hatch worlds include the four-slot magazine and its tools."""
from pathlib import Path
import re
ROOT = Path(__file__).resolve().parents[2] / 'iiwa_description'
WORLDS = ROOT / 'worlds/grant'
RACK = ROOT / 'resource/protos/GrantToolRack.proto'
BRINGUP = ROOT.parent / 'iiwa_bringup/launch'
def pose(world: str, name: str):
match = re.search(rf'DEF {name} Solid \{{\s+translation ([^\n]+)', world)
assert match, name
return tuple(map(float, match.group(1).split()))
def test_both_worlds_have_magazine_next_to_work_zone():
for world_name in ('body_hatch.wbt', 'body_hatch_installed.wbt'):
world_path = WORLDS / world_name
world = world_path.read_text()
assert 'GrantToolRack {' in world
assert (world_path.parent / '../../resource/protos/GrantToolRack.proto').is_file()
rack = re.search(r'GrantToolRack \{\s+translation ([^\n]+)', world)
assert rack
x, y, z = map(float, rack.group(1).split())
assert x > -0.25 and abs(y) < 0.54 and abs(z - 0.793) < 1e-6
assert 'rotation 0 0.70710678118 0.70710678118 3.14159265359' in world
def test_magazine_contains_all_four_grant_tools():
text = RACK.read_text()
for asset in ('tool-magizine.obj', 'vacum-tool.obj', 'magnit-tool.obj',
'germetic-tool.obj', 'wranch-tool.obj'):
assert text.count(asset) == 1
assert (RACK.parent / '../../objects/grant' / asset).is_file()
for station in ('-0.135', '-0.045', '0.045', '0.135'):
assert f'translation {station} 0.01 0' in text
assert 'scale 4 4 4' not in text
assert text.count('scale 10 10 10') == 1
assert 'Box { size 0.42 0.01 0.14 }' in text
vacuum = (RACK.parent / '../../objects/grant/vacum-tool.obj').read_text()
assert 'Hollow_elastomer_vacuum_cup_OD_81.0_mm' in vacuum
assert 'Black_sealant_cartridge_body' not in vacuum
def test_installed_world_puts_hatch_on_body():
world = (WORLDS / 'body_hatch_installed.wbt').read_text()
body = pose(world, 'BODY_HATCH_BODY')
cap = pose(world, 'BODY_HATCH_CAP')
assert cap[:2] == body[:2]
assert abs(cap[2] + 0.002333 - (body[2] + 0.005273)) < 1e-6
cap_node = world.split('DEF BODY_HATCH_CAP Solid {', 1)[1].split('\n}', 1)[0]
assert 'locked TRUE' in cap_node
assert 'physics Physics {' not in cap_node
def test_robot_spawns_without_a_preinstalled_vacuum_tool():
main_launch = (BRINGUP / 'iiwa.launch.py').read_text()
controllers = (BRINGUP / 'supported/controllers.launch.py').read_text()
assert 'body_hatch_vacuum' not in main_launch
assert 'body_hatch_vacuum' not in controllers
assert 'body_hatch_robot_spawner' not in controllers
assert 'spawner_urdf = URDFSpawner(' in controllers
def test_loose_hatch_remains_separate_and_movable():
world = (WORLDS / 'body_hatch.wbt').read_text()
cap = world.split('DEF BODY_HATCH_CAP Solid {', 1)[1].split('\n}', 1)[0]
body = world.split('DEF BODY_HATCH_BODY Solid {', 1)[1].split('\n}', 1)[0]
cap_pose = re.search(r'translation ([^\n]+)', cap).group(1).split()
body_pose = re.search(r'translation ([^\n]+)', body).group(1).split()
assert abs(float(cap_pose[1]) - float(body_pose[1])) > 0.2
assert 'physics Physics {' in cap
assert 'locked TRUE' not in cap