166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
#
|
|
# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
|
#
|
|
# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
|
|
# property and proprietary rights in and to this material, related
|
|
# documentation and any modifications thereto. Any use, reproduction,
|
|
# disclosure or distribution of this material and related documentation
|
|
# without an express license agreement from NVIDIA CORPORATION or
|
|
# its affiliates is strictly prohibited.
|
|
#
|
|
|
|
# Standard Library
|
|
import sys
|
|
|
|
# Third Party
|
|
import pytest
|
|
import torch
|
|
|
|
# CuRobo
|
|
from curobo.geom.sdf.world import CollisionQueryBuffer, WorldCollisionConfig
|
|
from curobo.geom.types import Cuboid, WorldConfig
|
|
from curobo.types.base import TensorDeviceType
|
|
from curobo.util_file import get_world_configs_path, join_path, load_yaml
|
|
|
|
try:
|
|
# Third Party
|
|
from nvblox_torch.mapper import Mapper
|
|
|
|
# CuRobo
|
|
from curobo.geom.sdf.world_blox import WorldBloxCollision
|
|
|
|
except ImportError:
|
|
pytest.skip("Nvblox Torch not available", allow_module_level=True)
|
|
|
|
|
|
def test_world_blox_trajectory():
|
|
tensor_args = TensorDeviceType()
|
|
world_file = "collision_nvblox.yml"
|
|
data_dict = load_yaml(join_path(get_world_configs_path(), world_file))
|
|
world_cfg = WorldConfig.from_dict(data_dict)
|
|
coll_cfg = WorldCollisionConfig(world_model=world_cfg, tensor_args=TensorDeviceType())
|
|
coll_check = WorldBloxCollision(coll_cfg)
|
|
x_sph = torch.as_tensor(
|
|
[[0.1, 0.2, 0.0, 10.5], [10.0, 0.0, 0.0, 0.0], [0.01, 0.01, 0.0, 0.1]], **vars(tensor_args)
|
|
).view(1, -1, 1, 4)
|
|
# create buffers:
|
|
query_buffer = CollisionQueryBuffer.initialize_from_shape(
|
|
x_sph.shape, tensor_args, coll_check.collision_types
|
|
)
|
|
weight = tensor_args.to_device([1])
|
|
act_distance = tensor_args.to_device([0.0])
|
|
d_sph = coll_check.get_swept_sphere_distance(
|
|
x_sph, query_buffer, weight, act_distance, act_distance + 0.01, 4, True
|
|
).view(-1)
|
|
|
|
assert d_sph[0] > 10.0
|
|
assert d_sph[1] == 0.0
|
|
assert d_sph[2] == 0.0
|
|
|
|
|
|
def test_world_blox():
|
|
tensor_args = TensorDeviceType()
|
|
world_file = "collision_nvblox.yml"
|
|
data_dict = load_yaml(join_path(get_world_configs_path(), world_file))
|
|
world_cfg = WorldConfig.from_dict(data_dict)
|
|
coll_cfg = WorldCollisionConfig(world_model=world_cfg, tensor_args=TensorDeviceType())
|
|
coll_check = WorldBloxCollision(coll_cfg)
|
|
x_sph = torch.as_tensor(
|
|
[[0.1, 0.2, 0.0, 10.5], [10.0, 0.0, 0.0, 0.0], [0.01, 0.01, 0.0, 0.1]], **vars(tensor_args)
|
|
).view(1, 1, -1, 4)
|
|
# create buffers:
|
|
query_buffer = CollisionQueryBuffer.initialize_from_shape(
|
|
x_sph.shape, tensor_args, coll_check.collision_types
|
|
)
|
|
weight = tensor_args.to_device([1])
|
|
act_distance = tensor_args.to_device([0.0])
|
|
d_sph = coll_check.get_sphere_distance(x_sph, query_buffer, weight, act_distance).view(-1)
|
|
|
|
assert d_sph[0] > 10.0
|
|
assert d_sph[1] == 0.0
|
|
assert d_sph[2] == 0.0
|
|
|
|
|
|
def test_world_blox_bounding():
|
|
tensor_args = TensorDeviceType()
|
|
world_file = "collision_nvblox.yml"
|
|
data_dict = load_yaml(join_path(get_world_configs_path(), world_file))
|
|
world_cfg = WorldConfig.from_dict(data_dict)
|
|
coll_cfg = WorldCollisionConfig(world_model=world_cfg, tensor_args=TensorDeviceType())
|
|
coll_check = WorldBloxCollision(coll_cfg)
|
|
bounding_cube = Cuboid("test", pose=[0, 0, 0, 1, 0, 0, 0], dims=[1.0, 1.0, 1.0])
|
|
mesh = coll_check.get_mesh_in_bounding_box(
|
|
bounding_cube,
|
|
voxel_size=0.05,
|
|
)
|
|
assert len(mesh.vertices) > 0
|
|
|
|
|
|
def test_world_blox_get_mesh():
|
|
world_file = "collision_nvblox.yml"
|
|
tensor_args = TensorDeviceType()
|
|
|
|
data_dict = load_yaml(join_path(get_world_configs_path(), world_file))
|
|
world_cfg = WorldConfig.from_dict(data_dict)
|
|
coll_cfg = WorldCollisionConfig(world_model=world_cfg, tensor_args=TensorDeviceType())
|
|
coll_check = WorldBloxCollision(coll_cfg)
|
|
|
|
world_mesh = coll_check.get_mesh_from_blox_layer("world")
|
|
assert len(world_mesh.vertices) > 10
|
|
|
|
|
|
@pytest.mark.skipif(sys.version_info < (3, 8), reason="pyglet requires python 3.8+")
|
|
def test_nvblox_world_from_primitive_world():
|
|
world_file = "collision_cubby.yml"
|
|
tensor_args = TensorDeviceType()
|
|
data_dict = load_yaml(join_path(get_world_configs_path(), world_file))
|
|
world_cfg = WorldConfig.from_dict(data_dict).get_mesh_world(True)
|
|
mesh = world_cfg.mesh[0].get_trimesh_mesh()
|
|
# world_cfg.mesh[0].save_as_mesh("world.obj")
|
|
# Third Party
|
|
from nvblox_torch.datasets.mesh_dataset import MeshDataset
|
|
|
|
# CuRobo
|
|
from curobo.geom.sdf.world import CollisionCheckerType
|
|
from curobo.geom.types import BloxMap
|
|
from curobo.types.camera import CameraObservation
|
|
from curobo.types.math import Pose
|
|
|
|
# create a nvblox collision checker:
|
|
world_config = WorldConfig(
|
|
blox=[
|
|
BloxMap(
|
|
name="world",
|
|
pose=[0, 0, 0, 1, 0, 0, 0],
|
|
voxel_size=0.02,
|
|
integrator_type="tsdf",
|
|
)
|
|
]
|
|
)
|
|
config = WorldCollisionConfig(
|
|
tensor_args=tensor_args, world_model=world_config, checker_type=CollisionCheckerType.BLOX
|
|
)
|
|
world_coll = WorldBloxCollision(config)
|
|
m_dataset = MeshDataset(
|
|
None, n_frames=100, image_size=1000, save_data_dir=None, trimesh_mesh=mesh
|
|
)
|
|
for i in range(len(m_dataset)):
|
|
data = m_dataset[i]
|
|
cam_obs = CameraObservation(
|
|
rgb_image=data["rgba"].permute(1, 2, 0),
|
|
depth_image=data["depth"],
|
|
intrinsics=data["intrinsics"],
|
|
pose=Pose.from_matrix(data["pose"].to(device=tensor_args.device)),
|
|
)
|
|
world_coll.add_camera_frame(cam_obs, "world")
|
|
|
|
world_coll.process_camera_frames("world")
|
|
world_coll.update_blox_mesh("world")
|
|
integrated_mesh = world_coll.get_mesh_from_blox_layer("world")
|
|
if len(integrated_mesh.vertices) > 0:
|
|
assert True
|
|
# print("saving World")
|
|
# integrated_mesh.save_as_mesh("collision_test.obj")
|
|
else:
|
|
assert True
|