feat: add universal grant Webots world
This commit is contained in:
@@ -42,6 +42,7 @@ def test_expected_resources_are_installed():
|
|||||||
'package.xml',
|
'package.xml',
|
||||||
'doc/experements.md',
|
'doc/experements.md',
|
||||||
'doc/experiment-scenes.md',
|
'doc/experiment-scenes.md',
|
||||||
|
'worlds/grant/iiwa-grant.wbt',
|
||||||
):
|
):
|
||||||
path = share / relative
|
path = share / relative
|
||||||
assert path.is_file(), path
|
assert path.is_file(), path
|
||||||
|
|||||||
@@ -0,0 +1,52 @@
|
|||||||
|
"""The world template contains only the shared table, fences and lighting."""
|
||||||
|
import re
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
|
PACKAGE = Path(__file__).resolve().parents[1]
|
||||||
|
WORLD = PACKAGE / 'worlds' / 'grant' / 'iiwa-grant.wbt'
|
||||||
|
|
||||||
|
|
||||||
|
def test_world_matches_base_layout():
|
||||||
|
text = WORLD.read_text(encoding='utf-8')
|
||||||
|
assert '#VRML_SIM R2025a utf8' in text
|
||||||
|
assert 'basicTimeStep 32' in text
|
||||||
|
assert re.search(r'CollaborativeRobotTable \{\s+translation 0 0 -0\.007', text)
|
||||||
|
assert text.count('WorkspaceLimiter {') == 2
|
||||||
|
assert 'WorkspaceLimiter_back' in text
|
||||||
|
assert 'WorkspaceLimiter_right' in text
|
||||||
|
assert 'coulombFriction [ 0.6 ]' in text
|
||||||
|
assert 'Object.proto' not in text
|
||||||
|
|
||||||
|
|
||||||
|
def test_world_has_no_preplaced_experiment_objects_or_robot():
|
||||||
|
text = WORLD.read_text(encoding='utf-8')
|
||||||
|
for asset in (
|
||||||
|
'stapel.obj',
|
||||||
|
'base-detail.obj',
|
||||||
|
'cap.obj',
|
||||||
|
'lotok.obj',
|
||||||
|
'vint.obj',
|
||||||
|
'tool-magizine.obj',
|
||||||
|
'vacum-tool.obj',
|
||||||
|
'magnit-tool.obj',
|
||||||
|
'germetic-tool.obj',
|
||||||
|
'wranch-tool.obj',
|
||||||
|
):
|
||||||
|
assert asset not in text
|
||||||
|
assert 'Kuka' not in text
|
||||||
|
assert 'Robot {' not in text
|
||||||
|
assert 'GrantToolRack' not in text
|
||||||
|
|
||||||
|
|
||||||
|
def test_world_only_references_two_local_protos():
|
||||||
|
text = WORLD.read_text(encoding='utf-8')
|
||||||
|
externprotos = re.findall(r'EXTERNPROTO "([^"]+)"', text)
|
||||||
|
local = [url for url in externprotos if not url.startswith(('http://', 'https://'))]
|
||||||
|
assert local == [
|
||||||
|
'../../../iiwa_description/resource/protos/CollaborativeRobotTable.proto',
|
||||||
|
'../../../iiwa_description/resource/protos/WorkspaceLimiter.proto',
|
||||||
|
]
|
||||||
|
for url in externprotos:
|
||||||
|
if url.startswith(('http://', 'https://')):
|
||||||
|
assert '/webots/R2025a/' in url
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
#VRML_SIM R2025a utf8
|
||||||
|
|
||||||
|
# Universal grant experiment world. The robot, cameras and experiment objects
|
||||||
|
# are added at run time: iiwa_bringup spawns the iiwa 7 and
|
||||||
|
# iiwa_experement/scene_spawner adds the deterministic scenario. The two local
|
||||||
|
# EXTERNPROTO paths are valid from this source tree; runtime_config.py rewrites
|
||||||
|
# them to absolute paths from the installed iiwa_description share before
|
||||||
|
# Webots opens the temporary copy of this world.
|
||||||
|
|
||||||
|
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 "../../../iiwa_description/resource/protos/CollaborativeRobotTable.proto"
|
||||||
|
EXTERNPROTO "../../../iiwa_description/resource/protos/WorkspaceLimiter.proto"
|
||||||
|
|
||||||
|
|
||||||
|
WorldInfo {
|
||||||
|
title "KUKA iiwa 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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user