From 25e5a2753b13621e7157f634cebcf00281629b14 Mon Sep 17 00:00:00 2001 From: Seongjin Bien Date: Thu, 9 Apr 2026 15:52:39 +0200 Subject: [PATCH 1/5] add missing requirements in build_deps and tqdm --- pyproject.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index f9f56376..1a2c1772 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,6 +39,7 @@ dependencies = [ "simplejpeg", "mujoco==3.2.6", "pin==3.7.0", + "tqdm", ] readme = "README.md" maintainers = [{ name = "Tobias Jülg", email = "tobias.juelg@utn.de" }] @@ -71,6 +72,7 @@ dev = [ build_deps = [ "mujoco==3.2.6", "pin==3.7.0", + "scikit-build-core>=0.3.3", ] [tool.cibuildwheel] From ac7e6581b25f32d570d6ad19f9aa463977a5f4d8 Mon Sep 17 00:00:00 2001 From: Seongjin Bien Date: Thu, 9 Apr 2026 15:53:12 +0200 Subject: [PATCH 2/5] add taxim extension with updated example code --- .../scenes/fr3_digit_simple_pick_up/fr3_0.xml | 23 +--- .../fr3_digit_simple_pick_up/fr3_common.xml | 1 - .../scenes/fr3_digit_simple_pick_up/scene.xml | 21 ++- examples/fr3/grasp_digit_demo.py | 6 +- extensions/rcs_taxim/pyproject.toml | 27 ++++ .../rcs_taxim/src/rcs_taxim/__init__.py | 1 + .../rcs_taxim/src/rcs_taxim/creators.py | 124 ++++++++++++++++++ .../rcs_taxim/src/rcs_taxim/taxim_wrapper.py | 110 ++++++++++++++++ python/rcs/envs/sim.py | 4 +- 9 files changed, 278 insertions(+), 39 deletions(-) create mode 100644 extensions/rcs_taxim/pyproject.toml create mode 100644 extensions/rcs_taxim/src/rcs_taxim/__init__.py create mode 100644 extensions/rcs_taxim/src/rcs_taxim/creators.py create mode 100644 extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml index 1b45e7f5..e16d09f8 100644 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml +++ b/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml @@ -1,7 +1,4 @@ - - - @@ -102,10 +99,10 @@ - + - + @@ -123,7 +120,7 @@ - + @@ -162,18 +159,4 @@ - - - - - - - - - - - - - - diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml index a2c836dd..e6569313 100644 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml +++ b/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml @@ -61,7 +61,6 @@ - diff --git a/assets/scenes/fr3_digit_simple_pick_up/scene.xml b/assets/scenes/fr3_digit_simple_pick_up/scene.xml index 564fe576..26998a54 100644 --- a/assets/scenes/fr3_digit_simple_pick_up/scene.xml +++ b/assets/scenes/fr3_digit_simple_pick_up/scene.xml @@ -1,4 +1,4 @@ - + @@ -12,19 +12,14 @@ - - - - + + - - - + @@ -32,9 +27,9 @@ - - - + + + diff --git a/examples/fr3/grasp_digit_demo.py b/examples/fr3/grasp_digit_demo.py index 1f746b66..2dc80e5d 100644 --- a/examples/fr3/grasp_digit_demo.py +++ b/examples/fr3/grasp_digit_demo.py @@ -6,7 +6,7 @@ import numpy as np from rcs._core.common import Pose from rcs.envs.base import GripperWrapper, RobotEnv -from rcs_tacto.creators import FR3TactoSimplePickUpSimEnvCreator +from rcs_taxim.creators import FR3TaximSimplePickUpSimEnvCreator from tqdm import tqdm logger = logging.getLogger(__name__) @@ -79,7 +79,7 @@ def pickup(self, geom_name: str): def main(): - env_fact = FR3TactoSimplePickUpSimEnvCreator() + env_fact = FR3TaximSimplePickUpSimEnvCreator() env = env_fact( render_mode="human", delta_actions=False, @@ -89,7 +89,7 @@ def main(): # reset the environment env.reset() controller = PickUpDemo(env) - controller.pickup("yellow_box_geom") + controller.pickup("box_geom") env.close() diff --git a/extensions/rcs_taxim/pyproject.toml b/extensions/rcs_taxim/pyproject.toml new file mode 100644 index 00000000..3d533373 --- /dev/null +++ b/extensions/rcs_taxim/pyproject.toml @@ -0,0 +1,27 @@ +[build-system] +requires = ["setuptools"] +build-backend = "setuptools.build_meta" + +[project] +name = "rcs_taxim" +version = "0.6.3" +description = "RCS integration of mujoco-taxim" +dependencies = [ + "rcs>=0.6.3", + "omegaconf", + "mujoco-taxim@git+https://github.com/utn-air/mujoco-taxim.git@main", +] +readme = "README.md" +maintainers = [ + { name = "Seongjin Bien", email = "seongjin.bien@utn.de" }, + { name = "Tobias Jülg", email = "tobias.juelg@utn.de" }, +] +authors = [{ name = "Seongjin Bien", email = "seongjin.bien@utn.de" }] +requires-python = ">=3.10" + +[tool.black] +line-length = 120 +target-version = ["py310"] + +[tool.isort] +profile = "black" diff --git a/extensions/rcs_taxim/src/rcs_taxim/__init__.py b/extensions/rcs_taxim/src/rcs_taxim/__init__.py new file mode 100644 index 00000000..63af8876 --- /dev/null +++ b/extensions/rcs_taxim/src/rcs_taxim/__init__.py @@ -0,0 +1 @@ +__version__ = "0.6.3" diff --git a/extensions/rcs_taxim/src/rcs_taxim/creators.py b/extensions/rcs_taxim/src/rcs_taxim/creators.py new file mode 100644 index 00000000..70ee3232 --- /dev/null +++ b/extensions/rcs_taxim/src/rcs_taxim/creators.py @@ -0,0 +1,124 @@ +import logging +import typing + +import gymnasium as gym +import numpy as np +from gymnasium.envs.registration import EnvCreator +from rcs._core.common import Pose +from rcs._core.sim import CameraType +from rcs.camera.sim import SimCameraConfig +from rcs.envs.base import ControlMode +from rcs.envs.creators import SimTaskEnvCreator +from rcs.envs.utils import default_sim_robot_cfg +from rcs.sim import SimGripperConfig +from rcs_taxim.taxim_wrapper import TaximSimWrapper + +import rcs + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) + + +class FR3TaximSimplePickUpSimEnvCreator(EnvCreator): + def __call__( # type: ignore + self, + render_mode: str = "human", + control_mode: ControlMode = ControlMode.CARTESIAN_TRPY, + resolution: tuple[int, int] | None = None, + frame_rate: int = 0, + delta_actions: bool = True, + cam_list: tuple[str, ...] = ( + "wrist_0", + "bird_eye_cam", + "openvla_view", + "right_side", + "front", + "left_side", + "side_view", + ), + taxim_kwargs: dict[str, typing.Any] | None = None, + **kwargs, + ) -> gym.Env: + if resolution is None: + resolution = (256, 256) + cameras = { + cam: SimCameraConfig( + identifier=cam, + type=CameraType.fixed, + resolution_height=resolution[1], + resolution_width=resolution[0], + frame_rate=frame_rate, + ) + for cam in cam_list + } + robot_cfg = default_sim_robot_cfg(scene="fr3_digit_simple_pick_up") # id = 0 by default + # TODO: Figure out why feeding it the default doesn't work. + # Probably because Pinocchio freaks out over all the weird tags? + robot_cfg.kinematic_model_path = rcs.scenes["fr3_empty_world"].mjcf_robot + robot_cfg.tcp_offset = Pose( + translation=np.array([0.0, 0.0, 0.15]), # type: ignore + rotation=np.array([[0.707, 0.707, 0], [-0.707, 0.707, 0], [0, 0, 1]]), # type: ignore + ) + gripper_cfg = SimGripperConfig() + + # the digit gripper has some custom finger collisions + # not seen in the defaults. These need to be configured properly. + gripper_cfg.collision_geoms = [ + "hand_c", + "d435i_collision", + "finger_a_left", + "finger_b_left", + "finger_c_left", + "finger_a_right", + "finger_b_right", + "finger_c_right", + ] + gripper_cfg.collision_geoms_fingers = [ + "finger_a_left", + "finger_b_left", + "finger_c_left", + "finger_a_right", + "finger_b_right", + "finger_c_right", + ] + + # Append the id to keep it consistent with the model + gripper_cfg.add_id("0") + random_pos_args = {"joint_name": "box_joint"} + + env = SimTaskEnvCreator()( + robot_cfg, + render_mode, + control_mode, + delta_actions, + cameras, + gripper_cfg=gripper_cfg, + random_pos_args=random_pos_args, + **kwargs, + ) + + ''' + env: gym.Env, + taxim_sites: list[str], + taxim_pad_geoms: list[str], + target_geom_mesh_dict: dict[str, str], + taxim_sensor_type: str = "digit", + taxim_bg_idx: int = 0, + taxim_bg_randomize: bool = False, + enable_depth: bool = False, + taxim_fps: int = 60, + visualize: bool = False, + ''' + # Here, we feed some default values for the taxim wrapper + # that aligns with what we have in the fr3_digit_simple_pick_up + if taxim_kwargs is None: + taxim_kwargs = {} + taxim_kwargs["taxim_sites"] = ["left_taxim_pad_0", "right_taxim_pad_0"] + taxim_kwargs["taxim_pad_geoms"] = ["finger_1_left_0", "finger_1_right_0"] + taxim_kwargs["target_geom_mesh_dict"] = {"box_geom": "box_geom"} + taxim_kwargs["taxim_sensor_type"] = "digit" + taxim_kwargs["taxim_fps"] = 60 + taxim_kwargs["enable_depth"] = True + taxim_kwargs["visualize"] = True + + return TaximSimWrapper(env, **taxim_kwargs) diff --git a/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py b/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py new file mode 100644 index 00000000..ea6a0657 --- /dev/null +++ b/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py @@ -0,0 +1,110 @@ +import logging +import os +from importlib.resources import files +from typing import Any + +import cv2 +import gymnasium as gym +from TaximSensor import TaximSensor +from omegaconf import OmegaConf + +logger = logging.getLogger(__name__) + + +class TaximSimWrapper(gym.Wrapper): + """Wrapper to use Taxim with RCS Sim.""" + + def __init__( + self, + env: gym.Env, + taxim_sites: list[str], + taxim_pad_geoms: list[str], + target_geom_mesh_dict: dict[str, str], + taxim_sensor_type: str = "digit", + taxim_bg_idx: int = 0, + taxim_bg_randomize: bool = False, + enable_depth: bool = False, + taxim_fps: int = 60, + visualize: bool = False, + ): + """ + Initialize Taxim sensor with the given configuration. + Args: + env (gym.Env): The environment to wrap. + simulation (sim.Sim): The simulation instance. + taxim_sites (list[str]): List of sites to mount Taxim cameras. + taxim_pad_geoms (list[str]): List of tactile sensor pad geoms which should act as the contact surfaces. + target_geom_mesh_dict (dict[str, str]): Dictionary mapping mjGeom names to mjMesh names. + taxim_sensor_type (str)="digit": The type of Taxim sensor to use. either 'digit' or 'gelsight_r1.5'. + taxim_bg_idx (int)=0: The index of the background image to use. + taxim_bg_randomize (bool)=False: Whether to randomize the background image for every contact. + enable_depth (bool)=False: Whether to enable depth rendering. + taxim_fps (int)=60: Frames per second for Taxim rendering. + visualize (bool)=False: Whether to visualize Taxim rendering in a separate window. + """ + super().__init__(env) + self.env = env + self.taxim_sensors = [] + + self.model = self.env.get_wrapper_attr("sim").model + self.data = self.env.get_wrapper_attr("sim").data + + self.taxim_sites = taxim_sites + self.taxim_pad_geoms = taxim_pad_geoms + self.target_geom_mesh_dict = target_geom_mesh_dict + self.taxim_sensor_type = taxim_sensor_type + self.taxim_bg_idx = taxim_bg_idx + self.taxim_bg_randomize = taxim_bg_randomize + + self.colors = [] + self.depths = [] + + self.taxim_fps = taxim_fps + self.taxim_last_render = -1 + self.enable_depth = enable_depth + + self.initialized = False + self.visualize = visualize + + def reset( + self, seed: int | None = None, options: dict[str, Any] | None = None + ) -> tuple[dict[str, Any], dict[str, Any]]: + obs, info = super().reset(seed=seed, options=options) + if not self.initialized: + # Create taxim sensors for each specified site + print(self.taxim_sites) + for i, site in enumerate(self.taxim_sites): + sensor = TaximSensor(resize=(240,320), sensor_type=self.taxim_sensor_type, preprocess_bg=False) + sensor.add_camera_mujoco(site, self.model, self.data) + sensor.change_bg(self.taxim_bg_idx) + # Add the target geoms to the sensor + for geom, mesh in self.target_geom_mesh_dict.items(): + sensor.add_geom_mujoco(geom, self.model, self.data, mesh) + + sensor.set_sensor_pad_geom(self.taxim_pad_geoms[i]) + self.taxim_sensors.append(sensor) + + self.initialized = True + + self.taxim_last_render = -1 # Reset last render time + + for i, sensor in enumerate(self.taxim_sensors): + rgb, depth, _ = sensor.render_taxim(self.model, self.data, visualize=False) + obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("rgb", {})["data"] = rgb + if self.enable_depth: + obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("depth", {})["data"] = depth + return obs, info + + def step(self, action: dict[str, Any]): + obs, reward, done, truncated, info = super().step(action) + if self.taxim_last_render + (1 / self.taxim_fps) > self.data.time: + return obs, reward, done, truncated, info + + for i, sensor in enumerate(self.taxim_sensors): + rgb, depth, _ = sensor.render_taxim(self.model, self.data, visualize=self.visualize) + self.taxim_last_render = self.data.time + obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("rgb", {})["data"] = rgb + if self.enable_depth: + obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("depth", {})["data"] = depth + + return obs, reward, done, truncated, info diff --git a/python/rcs/envs/sim.py b/python/rcs/envs/sim.py index 589b49fd..1a1cf60f 100644 --- a/python/rcs/envs/sim.py +++ b/python/rcs/envs/sim.py @@ -410,12 +410,12 @@ class PickCubeSuccessWrapper(gym.Wrapper): - whether the arm is standing still once the task is solved. """ - def __init__(self, env, cube_joint_name="box_joint"): + def __init__(self, env, cube_joint_name="box_joint", cube_geom_name="box_geom"): super().__init__(env) self.unwrapped: RobotEnv assert isinstance(self.unwrapped.robot, sim.SimRobot), "Robot must be a sim.SimRobot instance." self.sim = env.get_wrapper_attr("sim") - self.cube_geom_name = "box_geom" + self.cube_geom_name = cube_geom_name self.home_pose = self.unwrapped.robot.get_cartesian_position() self._gripper_closing = 0 self._gripper = self.get_wrapper_attr("_gripper") From 6af3a6c3a1ad7af0fa61e709a4df27d467a25068 Mon Sep 17 00:00:00 2001 From: Seongjin Bien Date: Thu, 9 Apr 2026 15:56:44 +0200 Subject: [PATCH 3/5] ! remove references to deprecated rcs_tacto --- .github/workflows/ci.yaml | 2 +- .../scenes/fr3_digit_simple_pick_up/fr3_0.xml | 8 +- .../fr3_digit_simple_pick_up/fr3_common.xml | 4 +- docs/extensions/index.md | 2 +- docs/extensions/overview.md | 2 +- docs/extensions/rcs_tacto.md | 6 +- extensions/rcs_tacto/README.md | 8 -- extensions/rcs_tacto/pyproject.toml | 27 ----- .../rcs_tacto/src/rcs_tacto/__init__.py | 1 - .../rcs_tacto/src/rcs_tacto/creators.py | 110 ------------------ .../rcs_tacto/src/rcs_tacto/tacto_wrapper.py | 102 ---------------- pyproject.toml | 6 +- python/rcs/__init__.py | 1 - 13 files changed, 15 insertions(+), 264 deletions(-) delete mode 100644 extensions/rcs_tacto/README.md delete mode 100644 extensions/rcs_tacto/pyproject.toml delete mode 100644 extensions/rcs_tacto/src/rcs_tacto/__init__.py delete mode 100644 extensions/rcs_tacto/src/rcs_tacto/creators.py delete mode 100644 extensions/rcs_tacto/src/rcs_tacto/tacto_wrapper.py diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 609b2596..0a5ef362 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -72,7 +72,7 @@ jobs: - rcs_xarm7 - rcs_realsense - rcs_robotiq2f85 - - rcs_tacto + - rcs_taxim - rcs_usb_cam runs-on: ubuntu-latest steps: diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml index e16d09f8..ea5d5bd4 100644 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml +++ b/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml @@ -92,14 +92,14 @@ - + - + @@ -113,14 +113,14 @@ - + - + diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml index e6569313..a266ad31 100644 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml +++ b/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml @@ -18,10 +18,10 @@ - + - + diff --git a/docs/extensions/index.md b/docs/extensions/index.md index 58c0391e..79936223 100644 --- a/docs/extensions/index.md +++ b/docs/extensions/index.md @@ -10,7 +10,7 @@ rcs_xarm7 rcs_so101 rcs_realsense rcs_usb_cam -rcs_tacto +rcs_taxim rcs_robotics_library rcs_robotiq2f85 ``` diff --git a/docs/extensions/overview.md b/docs/extensions/overview.md index 84334d4e..89ec0269 100644 --- a/docs/extensions/overview.md +++ b/docs/extensions/overview.md @@ -28,7 +28,7 @@ RCS comes with several supported extensions: - **rcs_so101**: Support for the SO101 robot. - **rcs_realsense**: Support for Intel RealSense cameras. - **rcs_usb_cam**: Support for generic USB webcams. -- **rcs_tacto**: Integration with the Tacto tactile sensor simulator. +- **rcs_taxim**: Integration with the Taxim tactile sensor simulator. - **rcs_robotics_library**: Integration with the Robotics Library (RL). - **rcs_robotiq2f85**: Integration with the Robotiq 2F-85 Gripper. diff --git a/docs/extensions/rcs_tacto.md b/docs/extensions/rcs_tacto.md index a1b94112..8d67a520 100644 --- a/docs/extensions/rcs_tacto.md +++ b/docs/extensions/rcs_tacto.md @@ -1,9 +1,9 @@ -# RCS Tacto Extension +# RCS Taxim Extension -This extension provides integration with the [Tacto](https://github.com/facebookresearch/tacto) tactile sensor simulator. +This extension provides integration with the [Taxim](https://github.com/Robo-Touch/Taxim) tactile sensor simulator. ## Installation ```shell -pip install -ve extensions/rcs_tacto +pip install -ve extensions/rcs_taxim ``` diff --git a/extensions/rcs_tacto/README.md b/extensions/rcs_tacto/README.md deleted file mode 100644 index 3951f76e..00000000 --- a/extensions/rcs_tacto/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# TACTO integration for RCS -This package can be installed by running `pip install -e extensions/rcs_tacto` from the RCS repository root. - -An example on how to create the environment is found in `{REPO_ROOT}/examples/grasp_digit_demo.py`. - -Particularly, take a look at `FR3TactoSimplePickUpSimEnvCreator` to understand how Tacto is inserted into the RCS stack. - -Note that it is rather tricky to get the correct contact simulation settings to allow for a robust grasping of objects, so when using it, you will need to play around with the simulation settings. We recommend taking a look at the corresponding [MuJoCo documentation](https://mujoco.readthedocs.io/en/stable/computation/index.html) for more tips. \ No newline at end of file diff --git a/extensions/rcs_tacto/pyproject.toml b/extensions/rcs_tacto/pyproject.toml deleted file mode 100644 index f69dd2cb..00000000 --- a/extensions/rcs_tacto/pyproject.toml +++ /dev/null @@ -1,27 +0,0 @@ -[build-system] -requires = ["setuptools"] -build-backend = "setuptools.build_meta" - -[project] -name = "rcs_tacto" -version = "0.6.3" -description = "RCS integration of tacto" -dependencies = [ - "rcs>=0.6.3", - "omegaconf", - "mujoco-tacto@git+https://github.com/utn-air/mujoco-tacto.git@main", -] -readme = "README.md" -maintainers = [ - { name = "Tobias Jülg", email = "tobias.juelg@utn.de" }, - { name = "Seongjin Bien", email = "seongjin.bien@utn.de" }, -] -authors = [{ name = "Seongjin Bien", email = "seongjin.bien@utn.de" }] -requires-python = ">=3.10" - -[tool.black] -line-length = 120 -target-version = ["py310"] - -[tool.isort] -profile = "black" diff --git a/extensions/rcs_tacto/src/rcs_tacto/__init__.py b/extensions/rcs_tacto/src/rcs_tacto/__init__.py deleted file mode 100644 index 63af8876..00000000 --- a/extensions/rcs_tacto/src/rcs_tacto/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__version__ = "0.6.3" diff --git a/extensions/rcs_tacto/src/rcs_tacto/creators.py b/extensions/rcs_tacto/src/rcs_tacto/creators.py deleted file mode 100644 index e78581ee..00000000 --- a/extensions/rcs_tacto/src/rcs_tacto/creators.py +++ /dev/null @@ -1,110 +0,0 @@ -import logging -import typing - -import gymnasium as gym -import numpy as np -from gymnasium.envs.registration import EnvCreator -from rcs._core.common import Pose -from rcs._core.sim import CameraType -from rcs.camera.sim import SimCameraConfig -from rcs.envs.base import ControlMode -from rcs.envs.creators import SimTaskEnvCreator -from rcs.envs.utils import default_sim_robot_cfg -from rcs.sim import SimGripperConfig -from rcs_tacto.tacto_wrapper import TactoSimWrapper - -import rcs - -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) - - -class FR3TactoSimplePickUpSimEnvCreator(EnvCreator): - def __call__( # type: ignore - self, - render_mode: str = "human", - control_mode: ControlMode = ControlMode.CARTESIAN_TRPY, - resolution: tuple[int, int] | None = None, - frame_rate: int = 0, - delta_actions: bool = True, - cam_list: tuple[str, ...] = ( - "wrist_0", - "bird_eye_cam", - "openvla_view", - "right_side", - "front", - "left_side", - "side_view", - ), - tacto_kwargs: dict[str, typing.Any] | None = None, - **kwargs, - ) -> gym.Env: - if resolution is None: - resolution = (256, 256) - cameras = { - cam: SimCameraConfig( - identifier=cam, - type=CameraType.fixed, - resolution_height=resolution[1], - resolution_width=resolution[0], - frame_rate=frame_rate, - ) - for cam in cam_list - } - robot_cfg = default_sim_robot_cfg(scene="fr3_digit_simple_pick_up") # id = 0 by default - # TODO: Figure out why feeding it the default doesn't work. - # Probably because Pinocchio freaks out over all the weird tags? - robot_cfg.kinematic_model_path = rcs.scenes["fr3_empty_world"].mjcf_robot - robot_cfg.tcp_offset = Pose( - translation=np.array([0.0, 0.0, 0.15]), # type: ignore - rotation=np.array([[0.707, 0.707, 0], [-0.707, 0.707, 0], [0, 0, 1]]), # type: ignore - ) - gripper_cfg = SimGripperConfig() - - # the digit gripper has some custom finger collisions - # not seen in the defaults. These need to be configured properly. - gripper_cfg.collision_geoms = [ - "hand_c", - "d435i_collision", - "finger_a_left", - "finger_b_left", - "finger_c_left", - "finger_a_right", - "finger_b_right", - "finger_c_right", - ] - gripper_cfg.collision_geoms_fingers = [ - "finger_a_left", - "finger_b_left", - "finger_c_left", - "finger_a_right", - "finger_b_right", - "finger_c_right", - ] - - # Append the id to keep it consistent with the model - gripper_cfg.add_id("0") - random_pos_args = {"joint_name": "yellow-box-joint"} - - env = SimTaskEnvCreator()( - robot_cfg, - render_mode, - control_mode, - delta_actions, - cameras, - gripper_cfg=gripper_cfg, - random_pos_args=random_pos_args, - **kwargs, - ) - - # Here, we feed some default values for the tacto wrapper - # that aligns with what we have in the fr3_digit_simple_pick_up - if tacto_kwargs is None: - tacto_kwargs = {} - tacto_kwargs["tacto_sites"] = ["left_tacto_pad_0", "right_tacto_pad_0"] - tacto_kwargs["tacto_geoms"] = ["yellow_box_geom"] - tacto_kwargs["tacto_fps"] = 60 - tacto_kwargs["enable_depth"] = True - tacto_kwargs["visualize"] = True - - return TactoSimWrapper(env, **tacto_kwargs) diff --git a/extensions/rcs_tacto/src/rcs_tacto/tacto_wrapper.py b/extensions/rcs_tacto/src/rcs_tacto/tacto_wrapper.py deleted file mode 100644 index 89e30956..00000000 --- a/extensions/rcs_tacto/src/rcs_tacto/tacto_wrapper.py +++ /dev/null @@ -1,102 +0,0 @@ -import logging -import os -from importlib.resources import files -from typing import Any - -import cv2 -import gymnasium as gym -import tacto -from omegaconf import OmegaConf - -logger = logging.getLogger(__name__) - - -class TactoSimWrapper(gym.Wrapper): - """Wrapper to use Tacto with RCS Sim.""" - - def __init__( - self, - env: gym.Env, - tacto_sites: list[str], - tacto_geoms: list[str], - tacto_meshes: dict[str, str] | None = None, - tacto_config: str | None = None, - tacto_bg: str | None = None, - enable_depth: bool = False, - tacto_fps: int = 60, - visualize: bool = False, - ): - """ - Initialize Tacto sensor with the given configuration. - Args: - env (gym.Env): The environment to wrap. - simulation (sim.Sim): The simulation instance. - tacto_sites (list[str]): List of sites to mount Tacto cameras. - tacto_geoms (list[str]): List of mjOBJ_GEOM names to add. - tacto_meshes (dict[str, str] | None): Dictionary mapping geom names to mesh names. - Needed when geom names are not the same as the mesh name in the XML. - tacto_config (str)=None: Absolute path to the Tacto configuration folder containing "digit.yaml". - If None, package default is used. - tacto_bg (str)=None: Absolute path to the background image for Tacto, ending with ".jpg". - If None, package default is used. - enable_depth (bool)=False: Whether to enable depth rendering. - tacto_fps (int)=60: Frames per second for Tacto rendering. - visualize (bool)=False: Whether to visualize Tacto rendering in a separate window. - """ - super().__init__(env) - self.env = env - if tacto_config is None: - tacto_config = os.path.dirname(str(files("tacto") / "cfg" / "digit.yaml")) - logger.warning(f"No tacto_config provided, using default from package: {tacto_config}/digit.yaml") - if tacto_bg is None: - tacto_bg = str(files("tacto") / "assets" / "bg_digit_240_320.jpg") - logger.warning(f"No tacto_bg provided, using default from package: {tacto_bg}") - config_path = os.path.join(tacto_config, "digit.yaml") - t_config = OmegaConf.load(config_path) - self.tacto_sensor = tacto.Sensor(**t_config.tacto, background=cv2.imread(tacto_bg)) - self.tacto_fps = tacto_fps - self.tacto_last_render = -1 - self.tacto_sites = tacto_sites - self.tacto_geoms = tacto_geoms - self.tacto_meshes = tacto_meshes if tacto_meshes is not None else {} - self.enable_depth = enable_depth - self.model = self.env.get_wrapper_attr("sim").model - self.data = self.env.get_wrapper_attr("sim").data - self.initialized = False - self.visualize = visualize - - def reset( - self, seed: int | None = None, options: dict[str, Any] | None = None - ) -> tuple[dict[str, Any], dict[str, Any]]: - obs, info = super().reset(seed=seed, options=options) - if not self.initialized: - # Set up Tacto sensor with the simulation - for site in self.tacto_sites: - self.tacto_sensor.add_camera_mujoco(site, self.model, self.data) - for geom in self.tacto_geoms: - if geom in self.tacto_meshes: - self.tacto_sensor.add_geom_mujoco(geom, self.model, self.data, self.tacto_meshes[geom]) - else: - self.tacto_sensor.add_geom_mujoco(geom, self.model, self.data) - self.initialized = True - self.tacto_last_render = -1 # Reset last render time - colors, depths = self.tacto_sensor.render(self.model, self.data) - for site, color, depth in zip(self.tacto_sites, colors, depths, strict=False): - obs.setdefault("frames", {}).setdefault(f"tactile_{site}", {}).setdefault("rgb", {})["data"] = color - if self.enable_depth: - obs.setdefault("frames", {}).setdefault(f"tactile_{site}", {}).setdefault("depth", {})["data"] = depth - return obs, info - - def step(self, action: dict[str, Any]): - obs, reward, done, truncated, info = super().step(action) - if self.tacto_last_render + (1 / self.tacto_fps) < self.data.time: - colors, depths = self.tacto_sensor.render(self.model, self.data) - self.tacto_sensor.updateGUI(colors, depths) if self.visualize else None - self.tacto_last_render = self.data.time - for site, color, depth in zip(self.tacto_sites, colors, depths, strict=False): - obs.setdefault("frames", {}).setdefault(f"tactile_{site}", {}).setdefault("rgb", {})["data"] = color - if self.enable_depth: - obs.setdefault("frames", {}).setdefault(f"tactile_{site}", {}).setdefault("depth", {})[ - "data" - ] = depth - return obs, reward, done, truncated, info diff --git a/pyproject.toml b/pyproject.toml index 1a2c1772..6cdcb7f8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -213,9 +213,9 @@ version_files = [ "extensions/rcs_ur5e/src/rcs_ur5e/__init__.py:__version__", "extensions/rcs_ur5e/pyproject.toml:\"rcs>=(.*)\"", - "extensions/rcs_tacto/pyproject.toml:version", - "extensions/rcs_tacto/src/rcs_tacto/__init__.py:__version__", - "extensions/rcs_tacto/pyproject.toml:\"rcs>=(.*)\"", + "extensions/rcs_taxim/pyproject.toml:version", + "extensions/rcs_taxim/src/rcs_taxim/__init__.py:__version__", + "extensions/rcs_taxim/pyproject.toml:\"rcs>=(.*)\"", "extensions/rcs_robotiq2f85/pyproject.toml:version", "extensions/rcs_robotiq2f85/src/rcs_robotiq2f85/__init__.py:__version__", diff --git a/python/rcs/__init__.py b/python/rcs/__init__.py index 8c4efd3a..d47a0076 100644 --- a/python/rcs/__init__.py +++ b/python/rcs/__init__.py @@ -102,7 +102,6 @@ def get_scene_urdf(scene_name: str) -> str | None: entry_point=FR3LabDigitGripperPickUpSimEnvCreator(), ) -# Genius TODO: Add the tacto version of the SimEnvCreator # TODO: gym.make("rcs/FR3SimEnv-v0") results in a pickling error: # TypeError: cannot pickle 'rcs._core.sim.SimRobotConfig' object # cf. https://pybind11.readthedocs.io/en/stable/advanced/classes.html#deepcopy-support From e9946b8bc3883609bdf8a571cc7d8c3e92f149d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20J=C3=BClg?= Date: Fri, 24 Apr 2026 13:55:45 +0200 Subject: [PATCH 4/5] refactor(taxim): refresh extension packaging on current master --- .../extensions/{rcs_tacto.md => rcs_taxim.md} | 0 examples/fr3/grasp_digit_demo.py | 78 +++--- extensions/rcs_taxim/README.md | 11 + extensions/rcs_taxim/pyproject.toml | 4 +- .../rcs_taxim/src/rcs_taxim/creators.py | 233 ++++++++++-------- .../rcs_taxim/src/rcs_taxim/taxim_wrapper.py | 138 ++++++----- pyproject.toml | 6 +- 7 files changed, 266 insertions(+), 204 deletions(-) rename docs/extensions/{rcs_tacto.md => rcs_taxim.md} (100%) create mode 100644 extensions/rcs_taxim/README.md diff --git a/docs/extensions/rcs_tacto.md b/docs/extensions/rcs_taxim.md similarity index 100% rename from docs/extensions/rcs_tacto.md rename to docs/extensions/rcs_taxim.md diff --git a/examples/fr3/grasp_digit_demo.py b/examples/fr3/grasp_digit_demo.py index 2dc80e5d..d98791cb 100644 --- a/examples/fr3/grasp_digit_demo.py +++ b/examples/fr3/grasp_digit_demo.py @@ -5,71 +5,77 @@ import mujoco import numpy as np from rcs._core.common import Pose -from rcs.envs.base import GripperWrapper, RobotEnv -from rcs_taxim.creators import FR3TaximSimplePickUpSimEnvCreator -from tqdm import tqdm +from rcs._core.sim import SimRobot +from rcs.envs.base import GripperWrapper logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) +def _progress(iterable): + try: + from tqdm import tqdm + except ImportError: + return iterable + return tqdm(iterable) + + class PickUpDemo: def __init__(self, env: gym.Env): self.env = env - self.unwrapped: RobotEnv = cast(RobotEnv, self.env.unwrapped) - self.home_pose = self.unwrapped.robot.get_cartesian_position() + self._robot = cast(SimRobot, self.env.get_wrapper_attr("robot")["robot"]) + self.home_pose = self._robot.get_cartesian_position() def _action(self, pose: Pose, gripper: list[float]) -> dict[str, Any]: - return {"xyzrpy": pose.xyzrpy(), "gripper": gripper} + return {"robot": {"xyzrpy": pose.xyzrpy(), "gripper": gripper}} - def get_object_pose(self, geom_name) -> Pose: + def get_object_pose(self, geom_name: str) -> Pose: model = self.env.get_wrapper_attr("sim").model data = self.env.get_wrapper_attr("sim").data geom_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, geom_name) obj_pose_world_coordinates = Pose( translation=data.geom_xpos[geom_id], rotation=data.geom_xmat[geom_id].reshape(3, 3) - ) - return self.unwrapped.robot.to_pose_in_robot_coordinates(obj_pose_world_coordinates) + ) * Pose(rpy_vector=np.array([0, 0, np.pi]), translation=np.array([0.0, 0.0, 0.0])) + return self._robot.to_pose_in_robot_coordinates(obj_pose_world_coordinates) def generate_waypoints(self, start_pose: Pose, end_pose: Pose, num_waypoints: int) -> list[Pose]: - waypoints = [] - for i in range(num_waypoints + 1): - t = i / (num_waypoints) - waypoints.append(start_pose.interpolate(end_pose, t)) - return waypoints + return [start_pose.interpolate(end_pose, i / num_waypoints) for i in range(num_waypoints + 1)] - def step(self, action: dict) -> dict: + def step(self, action: dict[str, Any]) -> dict[str, Any]: return self.env.step(action)[0] - def plan_linear_motion(self, geom_name: str, delta_up: float, num_waypoints: int = 200) -> list[Pose]: - end_eff_pose = self.unwrapped.robot.get_cartesian_position() + def plan_linear_motion(self, geom_name: str, delta_up: float, num_waypoints: int = 20) -> list[Pose]: + end_eff_pose = self._robot.get_cartesian_position() goal_pose = self.get_object_pose(geom_name=geom_name) - goal_pose *= Pose(translation=np.array([0, 0, delta_up]), quaternion=np.array([1, 0, 0, 0])) # type: ignore + goal_pose *= Pose(translation=np.array([0, 0, delta_up]), quaternion=np.array([1, 0, 0, 0])) return self.generate_waypoints(end_eff_pose, goal_pose, num_waypoints=num_waypoints) - def execute_motion(self, waypoints: list[Pose], gripper: list[float] = GripperWrapper.BINARY_GRIPPER_OPEN) -> dict: - for i in range(len(waypoints)): - obs = self.step(self._action(waypoints[i], gripper)) + def execute_motion( + self, waypoints: list[Pose], gripper: list[float] = GripperWrapper.BINARY_GRIPPER_OPEN + ) -> dict[str, Any]: + obs: dict[str, Any] = {} + for waypoint in waypoints: + obs = self.step(self._action(waypoint, gripper)) return obs def approach(self, geom_name: str): - waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=5) + waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=60) self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN) def grasp(self, geom_name: str): - - waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=-0.01, num_waypoints=15) + waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=-0.005, num_waypoints=60) self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN) - self.step(self._action(Pose(), GripperWrapper.BINARY_GRIPPER_CLOSED)) + for _ in range(4): + self.step(self._action(self._robot.get_cartesian_position(), GripperWrapper.BINARY_GRIPPER_CLOSED)) - waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=15) + waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=60) self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED) def move_home(self): - end_eff_pose = self.unwrapped.robot.get_cartesian_position() - waypoints = self.generate_waypoints(end_eff_pose, self.home_pose, num_waypoints=10) + end_eff_pose = self._robot.get_cartesian_position() + waypoints = self.generate_waypoints(end_eff_pose, self.home_pose, num_waypoints=60) self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED) def pickup(self, geom_name: str): @@ -79,17 +85,19 @@ def pickup(self, geom_name: str): def main(): + try: + from rcs_taxim.creators import FR3TaximSimplePickUpSimEnvCreator + except ImportError as exc: + msg = "This example requires the rcs_taxim extension, install it with `pip install -e extensions/rcs_taxim`." + raise ImportError(msg) from exc + env_fact = FR3TaximSimplePickUpSimEnvCreator() - env = env_fact( - render_mode="human", - delta_actions=False, - ) + env = env_fact(render_mode="human", delta_actions=False) - for _ in tqdm(range(100)): - # reset the environment + for _ in _progress(range(100)): env.reset() controller = PickUpDemo(env) - controller.pickup("box_geom") + controller.pickup("_box_geom") env.close() diff --git a/extensions/rcs_taxim/README.md b/extensions/rcs_taxim/README.md new file mode 100644 index 00000000..2625c78d --- /dev/null +++ b/extensions/rcs_taxim/README.md @@ -0,0 +1,11 @@ +# RCS Taxim Extension + +This extension provides integration with the [Taxim](https://github.com/Robo-Touch/Taxim) tactile sensor simulator. + +It ports the tactile pick-up example onto the current RCS scene/config stack by swapping in a TAXIM-equipped Franka hand while reusing the current FR3 pick setup. + +## Installation + +```shell +pip install -ve extensions/rcs_taxim +``` diff --git a/extensions/rcs_taxim/pyproject.toml b/extensions/rcs_taxim/pyproject.toml index 3d533373..9019067b 100644 --- a/extensions/rcs_taxim/pyproject.toml +++ b/extensions/rcs_taxim/pyproject.toml @@ -9,12 +9,12 @@ description = "RCS integration of mujoco-taxim" dependencies = [ "rcs>=0.6.3", "omegaconf", - "mujoco-taxim@git+https://github.com/utn-air/mujoco-taxim.git@main", + "mujoco-taxim@git+https://github.com/utn-air/mujoco-taxim.git@956b7d05e1f28d6d186eb1d386f4c13d7b014308", ] readme = "README.md" maintainers = [ - { name = "Seongjin Bien", email = "seongjin.bien@utn.de" }, { name = "Tobias Jülg", email = "tobias.juelg@utn.de" }, + { name = "Seongjin Bien", email = "seongjin.bien@utn.de" }, ] authors = [{ name = "Seongjin Bien", email = "seongjin.bien@utn.de" }] requires-python = ">=3.10" diff --git a/extensions/rcs_taxim/src/rcs_taxim/creators.py b/extensions/rcs_taxim/src/rcs_taxim/creators.py index 70ee3232..0f3febb3 100644 --- a/extensions/rcs_taxim/src/rcs_taxim/creators.py +++ b/extensions/rcs_taxim/src/rcs_taxim/creators.py @@ -1,124 +1,157 @@ -import logging -import typing +from __future__ import annotations + +import copy +from pathlib import Path +from typing import Any import gymnasium as gym import numpy as np -from gymnasium.envs.registration import EnvCreator -from rcs._core.common import Pose -from rcs._core.sim import CameraType -from rcs.camera.sim import SimCameraConfig -from rcs.envs.base import ControlMode -from rcs.envs.creators import SimTaskEnvCreator -from rcs.envs.utils import default_sim_robot_cfg -from rcs.sim import SimGripperConfig +from rcs._core.common import GripperType, Pose +from rcs._core.sim import SimCameraConfig, SimGripperConfig +from rcs.envs.base import ControlMode, RelativeTo +from rcs.envs.configs import EmptyWorldFR3 from rcs_taxim.taxim_wrapper import TaximSimWrapper import rcs -logger = logging.getLogger(__name__) -logger.setLevel(logging.INFO) +_TAXIM_GRIPPER_TYPE = GripperType("TaximDigit") -class FR3TaximSimplePickUpSimEnvCreator(EnvCreator): - def __call__( # type: ignore - self, - render_mode: str = "human", - control_mode: ControlMode = ControlMode.CARTESIAN_TRPY, - resolution: tuple[int, int] | None = None, - frame_rate: int = 0, - delta_actions: bool = True, - cam_list: tuple[str, ...] = ( - "wrist_0", - "bird_eye_cam", - "openvla_view", - "right_side", - "front", - "left_side", - "side_view", - ), - taxim_kwargs: dict[str, typing.Any] | None = None, - **kwargs, - ) -> gym.Env: - if resolution is None: - resolution = (256, 256) - cameras = { - cam: SimCameraConfig( - identifier=cam, - type=CameraType.fixed, - resolution_height=resolution[1], - resolution_width=resolution[0], - frame_rate=frame_rate, - ) - for cam in cam_list - } - robot_cfg = default_sim_robot_cfg(scene="fr3_digit_simple_pick_up") # id = 0 by default - # TODO: Figure out why feeding it the default doesn't work. - # Probably because Pinocchio freaks out over all the weird tags? - robot_cfg.kinematic_model_path = rcs.scenes["fr3_empty_world"].mjcf_robot - robot_cfg.tcp_offset = Pose( - translation=np.array([0.0, 0.0, 0.15]), # type: ignore - rotation=np.array([[0.707, 0.707, 0], [-0.707, 0.707, 0], [0, 0, 1]]), # type: ignore - ) - gripper_cfg = SimGripperConfig() +def _digit_model_path() -> Path: + return Path(rcs.RCS_PREFIX, "assets", "sensors", "digit", "digit.xml") + + +def _prefixed(name: str) -> str: + return f"gripper{name}" + + +def _make_camera_cfgs( + base_cfgs: dict[str, SimCameraConfig], + cam_list: tuple[str, ...], + resolution: tuple[int, int] | None, + frame_rate: int, +) -> dict[str, SimCameraConfig]: + camera_cfgs: dict[str, SimCameraConfig] = {} + for cam in cam_list: + if cam not in base_cfgs: + available = ", ".join(sorted(base_cfgs)) + msg = f"Unknown camera {cam!r}. Available cameras: {available}" + raise ValueError(msg) + cfg = copy.deepcopy(base_cfgs[cam]) + if resolution is not None: + cfg.resolution_width = resolution[0] + cfg.resolution_height = resolution[1] + if frame_rate > 0: + cfg.frame_rate = frame_rate + camera_cfgs[cam] = cfg + return camera_cfgs + - # the digit gripper has some custom finger collisions - # not seen in the defaults. These need to be configured properly. - gripper_cfg.collision_geoms = [ - "hand_c", - "d435i_collision", +def _taxim_gripper_cfg() -> SimGripperConfig: + return SimGripperConfig( + epsilon_inner=0.005, + epsilon_outer=0.005, + seconds_between_callbacks=0.1, + ignored_collision_geoms=[], + collision_geoms=[ "finger_a_left", "finger_b_left", "finger_c_left", + "finger_1_left", "finger_a_right", "finger_b_right", "finger_c_right", - ] - gripper_cfg.collision_geoms_fingers = [ + "finger_1_right", + ], + collision_geoms_fingers=[ "finger_a_left", "finger_b_left", "finger_c_left", + "finger_1_left", "finger_a_right", "finger_b_right", "finger_c_right", - ] - - # Append the id to keep it consistent with the model - gripper_cfg.add_id("0") - random_pos_args = {"joint_name": "box_joint"} - - env = SimTaskEnvCreator()( - robot_cfg, - render_mode, - control_mode, - delta_actions, - cameras, - gripper_cfg=gripper_cfg, - random_pos_args=random_pos_args, - **kwargs, + "finger_1_right", + ], + joints=["finger_joint1", "finger_joint2"], + max_joint_width=0.04, + min_joint_width=0.0, + actuator="hand_actuator", + max_actuator_width=255.0, + min_actuator_width=0.0, + gripper_type=_TAXIM_GRIPPER_TYPE, + ) + + +class FR3TaximSimplePickUpSimEnvCreator: + def __call__( + self, + render_mode: str = "human", + control_mode: ControlMode = ControlMode.CARTESIAN_TRPY, + resolution: tuple[int, int] | None = None, + frame_rate: int = 0, + delta_actions: bool = True, + cam_list: tuple[str, ...] | None = None, + taxim_kwargs: dict[str, Any] | None = None, + **kwargs: Any, + ) -> gym.Env: + binary_gripper = kwargs.pop("binary_gripper", True) + home_on_reset = kwargs.pop("home_on_reset", True) + max_relative_movement = kwargs.pop("max_relative_movement", None) + if kwargs: + unexpected = ", ".join(sorted(kwargs)) + msg = f"Unexpected keyword arguments: {unexpected}" + raise TypeError(msg) + + rcs.GRIPPER_PATHS[_TAXIM_GRIPPER_TYPE] = str(_digit_model_path()) + + scene = EmptyWorldFR3() + cfg = scene.config() + cfg.control_mode = control_mode + cfg.headless = render_mode != "human" + cfg.sim_cfg.realtime = render_mode == "human" + cfg.sim_cfg.async_control = render_mode == "human" + cfg.sim_cfg.frequency = 30 + cfg.wrapper_cfg.binary_gripper = binary_gripper + cfg.wrapper_cfg.home_on_reset = home_on_reset + cfg.max_relative_movement = ( + max_relative_movement if max_relative_movement is not None else (0.2, np.deg2rad(45)) ) + cfg.relative_to = RelativeTo.LAST_STEP if delta_actions else RelativeTo.NONE + if not delta_actions: + cfg.max_relative_movement = None + cfg.gripper_cfgs = {"robot": _taxim_gripper_cfg()} + cfg.gripper_offsets = None + cfg.root_frame_objects = { + "": ( + rcs.OBJECT_PATHS["green_cube"], + Pose(translation=np.array([0.5, 0.0, 0.05]), quaternion=np.array([0.0, 0.0, 0.0, 1.0])), + ) + } + + cam_list = tuple(cam_list or ()) + if cam_list: + cfg.camera_cfgs = _make_camera_cfgs(cfg.camera_cfgs or {}, cam_list, resolution, frame_rate) + cfg.camera_adds = ( + {name: cfg.camera_adds[name] for name in cam_list} if cfg.camera_adds is not None else None + ) + else: + cfg.camera_cfgs = None + cfg.camera_adds = None - ''' - env: gym.Env, - taxim_sites: list[str], - taxim_pad_geoms: list[str], - target_geom_mesh_dict: dict[str, str], - taxim_sensor_type: str = "digit", - taxim_bg_idx: int = 0, - taxim_bg_randomize: bool = False, - enable_depth: bool = False, - taxim_fps: int = 60, - visualize: bool = False, - ''' - # Here, we feed some default values for the taxim wrapper - # that aligns with what we have in the fr3_digit_simple_pick_up - if taxim_kwargs is None: - taxim_kwargs = {} - taxim_kwargs["taxim_sites"] = ["left_taxim_pad_0", "right_taxim_pad_0"] - taxim_kwargs["taxim_pad_geoms"] = ["finger_1_left_0", "finger_1_right_0"] - taxim_kwargs["target_geom_mesh_dict"] = {"box_geom": "box_geom"} - taxim_kwargs["taxim_sensor_type"] = "digit" - taxim_kwargs["taxim_fps"] = 60 - taxim_kwargs["enable_depth"] = True - taxim_kwargs["visualize"] = True - - return TaximSimWrapper(env, **taxim_kwargs) + env = scene.create_env(cfg) + merged_taxim_kwargs: dict[str, Any] = { + "taxim_sites": [_prefixed("left_taxim_pad"), _prefixed("right_taxim_pad")], + "taxim_pad_geoms": [_prefixed("finger_1_left"), _prefixed("finger_1_right")], + "target_geom_mesh_dict": {"_box_geom": "_box_geom"}, + "taxim_sensor_type": "digit", + "taxim_fps": 60, + "enable_depth": True, + "visualize": False, + } + if taxim_kwargs is not None: + merged_taxim_kwargs.update(taxim_kwargs) + env = TaximSimWrapper(env, **merged_taxim_kwargs) + if render_mode == "human": + env.get_wrapper_attr("sim").open_gui() + return env diff --git a/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py b/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py index ea6a0657..f6de3023 100644 --- a/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py +++ b/extensions/rcs_taxim/src/rcs_taxim/taxim_wrapper.py @@ -1,18 +1,12 @@ -import logging -import os -from importlib.resources import files +import copy from typing import Any -import cv2 import gymnasium as gym -from TaximSensor import TaximSensor -from omegaconf import OmegaConf - -logger = logging.getLogger(__name__) +import numpy as np class TaximSimWrapper(gym.Wrapper): - """Wrapper to use Taxim with RCS Sim.""" + """Wrapper to render TAXIM tactile observations alongside regular RCS observations.""" def __init__( self, @@ -27,27 +21,11 @@ def __init__( taxim_fps: int = 60, visualize: bool = False, ): - """ - Initialize Taxim sensor with the given configuration. - Args: - env (gym.Env): The environment to wrap. - simulation (sim.Sim): The simulation instance. - taxim_sites (list[str]): List of sites to mount Taxim cameras. - taxim_pad_geoms (list[str]): List of tactile sensor pad geoms which should act as the contact surfaces. - target_geom_mesh_dict (dict[str, str]): Dictionary mapping mjGeom names to mjMesh names. - taxim_sensor_type (str)="digit": The type of Taxim sensor to use. either 'digit' or 'gelsight_r1.5'. - taxim_bg_idx (int)=0: The index of the background image to use. - taxim_bg_randomize (bool)=False: Whether to randomize the background image for every contact. - enable_depth (bool)=False: Whether to enable depth rendering. - taxim_fps (int)=60: Frames per second for Taxim rendering. - visualize (bool)=False: Whether to visualize Taxim rendering in a separate window. - """ super().__init__(env) - self.env = env - self.taxim_sensors = [] - + self.taxim_sensors: list[Any] = [] self.model = self.env.get_wrapper_attr("sim").model self.data = self.env.get_wrapper_attr("sim").data + self.last_tactile_frames: dict[str, dict[str, dict[str, Any]]] = {} self.taxim_sites = taxim_sites self.taxim_pad_geoms = taxim_pad_geoms @@ -55,56 +33,88 @@ def __init__( self.taxim_sensor_type = taxim_sensor_type self.taxim_bg_idx = taxim_bg_idx self.taxim_bg_randomize = taxim_bg_randomize - - self.colors = [] - self.depths = [] - self.taxim_fps = taxim_fps - self.taxim_last_render = -1 + self.taxim_last_render = -1.0 self.enable_depth = enable_depth - self.initialized = False self.visualize = visualize + self.observation_space = copy.deepcopy(env.observation_space) + if not isinstance(self.observation_space, gym.spaces.Dict): + msg = "Expected wrapped observation space to be a gym.spaces.Dict." + raise TypeError(msg) + + frame_spaces = self.observation_space.spaces.get("frames") + if frame_spaces is None: + frame_spaces = gym.spaces.Dict({}) + self.observation_space.spaces["frames"] = frame_spaces + if not isinstance(frame_spaces, gym.spaces.Dict): + msg = "Expected frames observation space to be a gym.spaces.Dict." + raise TypeError(msg) + + tactile_space: dict[str, gym.Space[Any]] = { + "rgb": gym.spaces.Dict( + { + "data": gym.spaces.Box(low=0, high=255, shape=(320, 240, 3), dtype=np.uint8), + } + ) + } + if self.enable_depth: + tactile_space["depth"] = gym.spaces.Dict( + { + "data": gym.spaces.Box(low=-np.inf, high=np.inf, shape=(320, 240), dtype=np.float64), + } + ) + frame_spaces.spaces.update( + {f"tactile_{site}": gym.spaces.Dict(copy.deepcopy(tactile_space)) for site in self.taxim_sites} + ) + + def _ensure_initialized(self) -> None: + if self.initialized: + return + from TaximSensor import TaximSensor + + for site, pad_geom in zip(self.taxim_sites, self.taxim_pad_geoms, strict=True): + sensor = TaximSensor(resize=(240, 320), sensor_type=self.taxim_sensor_type, preprocess_bg=False) + sensor.add_camera_mujoco(site, self.model, self.data) + sensor.change_bg(self.taxim_bg_idx) + for geom, mesh in self.target_geom_mesh_dict.items(): + sensor.add_geom_mujoco(geom, self.model, self.data, mesh) + sensor.set_sensor_pad_geom(pad_geom) + self.taxim_sensors.append(sensor) + self.initialized = True + + def _render_tactile_frames(self, visualize: bool) -> dict[str, dict[str, dict[str, Any]]]: + frames: dict[str, dict[str, dict[str, Any]]] = {} + for site, sensor in zip(self.taxim_sites, self.taxim_sensors, strict=True): + rgb, depth, _ = sensor.render_taxim(self.model, self.data, visualize=visualize) + tactile_obs: dict[str, dict[str, Any]] = {"rgb": {"data": rgb}} + if self.enable_depth: + tactile_obs["depth"] = {"data": depth} + frames[f"tactile_{site}"] = tactile_obs + return frames + + def _update_obs(self, obs: dict[str, Any]) -> None: + frames = obs.setdefault("frames", {}) + for site, tactile_obs in self.last_tactile_frames.items(): + frames[site] = copy.deepcopy(tactile_obs) + def reset( self, seed: int | None = None, options: dict[str, Any] | None = None ) -> tuple[dict[str, Any], dict[str, Any]]: obs, info = super().reset(seed=seed, options=options) - if not self.initialized: - # Create taxim sensors for each specified site - print(self.taxim_sites) - for i, site in enumerate(self.taxim_sites): - sensor = TaximSensor(resize=(240,320), sensor_type=self.taxim_sensor_type, preprocess_bg=False) - sensor.add_camera_mujoco(site, self.model, self.data) - sensor.change_bg(self.taxim_bg_idx) - # Add the target geoms to the sensor - for geom, mesh in self.target_geom_mesh_dict.items(): - sensor.add_geom_mujoco(geom, self.model, self.data, mesh) - - sensor.set_sensor_pad_geom(self.taxim_pad_geoms[i]) - self.taxim_sensors.append(sensor) - - self.initialized = True - - self.taxim_last_render = -1 # Reset last render time - - for i, sensor in enumerate(self.taxim_sensors): - rgb, depth, _ = sensor.render_taxim(self.model, self.data, visualize=False) - obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("rgb", {})["data"] = rgb - if self.enable_depth: - obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("depth", {})["data"] = depth + self._ensure_initialized() + self.taxim_last_render = -1.0 + self.last_tactile_frames = self._render_tactile_frames(visualize=False) + self._update_obs(obs) return obs, info def step(self, action: dict[str, Any]): obs, reward, done, truncated, info = super().step(action) - if self.taxim_last_render + (1 / self.taxim_fps) > self.data.time: - return obs, reward, done, truncated, info - - for i, sensor in enumerate(self.taxim_sensors): - rgb, depth, _ = sensor.render_taxim(self.model, self.data, visualize=self.visualize) + self._ensure_initialized() + if self.taxim_last_render + (1 / self.taxim_fps) <= self.data.time: + self.last_tactile_frames = self._render_tactile_frames(visualize=self.visualize) self.taxim_last_render = self.data.time - obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("rgb", {})["data"] = rgb - if self.enable_depth: - obs.setdefault("frames", {}).setdefault(f"tactile_{self.taxim_sites[i]}", {}).setdefault("depth", {})["data"] = depth + self._update_obs(obs) return obs, reward, done, truncated, info diff --git a/pyproject.toml b/pyproject.toml index 0de993fe..fc8c5466 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -214,9 +214,9 @@ version_files = [ "extensions/rcs_ur5e/src/rcs_ur5e/__init__.py:__version__", "extensions/rcs_ur5e/pyproject.toml:\"rcs>=(.*)\"", - "extensions/rcs_tacto/pyproject.toml:version", - "extensions/rcs_tacto/src/rcs_tacto/__init__.py:__version__", - "extensions/rcs_tacto/pyproject.toml:\"rcs>=(.*)\"", + "extensions/rcs_taxim/pyproject.toml:version", + "extensions/rcs_taxim/src/rcs_taxim/__init__.py:__version__", + "extensions/rcs_taxim/pyproject.toml:\"rcs>=(.*)\"", "extensions/rcs_robotiq2f85/pyproject.toml:version", "extensions/rcs_robotiq2f85/src/rcs_robotiq2f85/__init__.py:__version__", From 9ec046f2a292d3d247c6a155417ae40cc92630d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20J=C3=BClg?= Date: Fri, 24 Apr 2026 13:55:57 +0200 Subject: [PATCH 5/5] refactor(taxim): drop obsolete vendored pick scene assets --- .../Panda_RealSenseD435_Camera_Mount.obj | 1 - .../Panda_RealSenseD435_Camera_Mount.stl | 1 - .../assets/bg_digit_240_320.jpg | 1 - .../assets/bird_eye_cam_realsense_mount.stl | 1 - .../assets/d435i_0.obj | 1 - .../assets/d435i_1.obj | 1 - .../assets/d435i_2.obj | 1 - .../assets/d435i_3.obj | 1 - .../assets/d435i_4.obj | 1 - .../assets/d435i_5.obj | 1 - .../assets/d435i_6.obj | 1 - .../assets/d435i_7.obj | 1 - .../assets/d435i_8.obj | 1 - .../assets/digit_finger.obj | 1 - .../digit_finger_attachment_collision.stl | 1 - .../digit_finger_backplate_collision.stl | 1 - .../assets/digit_sensor_no_backplate.obj | 1 - .../digit_sensor_no_backplate_collision.stl | 1 - .../assets/digit_sensor_pad.obj | 1 - .../assets/finger_0.obj | 1 - .../assets/finger_1.obj | 1 - .../assets/fr3_link0.stl | 1 - .../assets/fr3_link0_0.obj | 1 - .../assets/fr3_link0_1.obj | 1 - .../assets/fr3_link0_2.obj | 1 - .../assets/fr3_link0_3.obj | 1 - .../assets/fr3_link0_4.obj | 1 - .../assets/fr3_link0_5.obj | 1 - .../assets/fr3_link0_6.obj | 1 - .../assets/fr3_link1.obj | 1 - .../assets/fr3_link1.stl | 1 - .../assets/fr3_link2.obj | 1 - .../assets/fr3_link2.stl | 1 - .../assets/fr3_link3.stl | 1 - .../assets/fr3_link3_0.obj | 1 - .../assets/fr3_link3_1.obj | 1 - .../assets/fr3_link4.stl | 1 - .../assets/fr3_link4_0.obj | 1 - .../assets/fr3_link4_1.obj | 1 - .../assets/fr3_link5.stl | 1 - .../assets/fr3_link5_0.obj | 1 - .../assets/fr3_link5_1.obj | 1 - .../assets/fr3_link5_2.obj | 1 - .../assets/fr3_link6.stl | 1 - .../assets/fr3_link6_0.obj | 1 - .../assets/fr3_link6_1.obj | 1 - .../assets/fr3_link6_2.obj | 1 - .../assets/fr3_link6_3.obj | 1 - .../assets/fr3_link6_4.obj | 1 - .../assets/fr3_link6_5.obj | 1 - .../assets/fr3_link6_6.obj | 1 - .../assets/fr3_link6_7.obj | 1 - .../assets/fr3_link7.stl | 1 - .../assets/fr3_link7_0.obj | 1 - .../assets/fr3_link7_1.obj | 1 - .../assets/fr3_link7_2.obj | 1 - .../assets/fr3_link7_3.obj | 1 - .../assets/franka_hand.stl | 1 - .../assets/franka_hand_0.obj | 1 - .../assets/franka_hand_1.obj | 1 - .../assets/franka_hand_2.obj | 1 - .../assets/franka_hand_3.obj | 1 - .../assets/franka_hand_4.obj | 1 - .../scenes/fr3_digit_simple_pick_up/fr3_0.xml | 162 ---------- .../fr3_digit_simple_pick_up/fr3_common.xml | 137 --------- .../fr3_digit_simple_pick_up/robot.urdf | 276 ------------------ .../scenes/fr3_digit_simple_pick_up/scene.xml | 35 --- 67 files changed, 673 deletions(-) delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/bg_digit_240_320.jpg delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/bird_eye_cam_realsense_mount.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_3.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_4.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_5.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_6.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_7.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/d435i_8.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_attachment_collision.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_backplate_collision.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate_collision.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_pad.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/finger_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/finger_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_3.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_4.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_5.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_6.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_3.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_4.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_5.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_6.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_7.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_3.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand.stl delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_0.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_1.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_2.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_3.obj delete mode 120000 assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_4.obj delete mode 100644 assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml delete mode 100644 assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml delete mode 100644 assets/scenes/fr3_digit_simple_pick_up/robot.urdf delete mode 100644 assets/scenes/fr3_digit_simple_pick_up/scene.xml diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.obj deleted file mode 120000 index bcb794bc..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/Panda_RealSenseD435_Camera_Mount.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.stl deleted file mode 120000 index c58e37f0..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/Panda_RealSenseD435_Camera_Mount.stl +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/stl/Panda_RealSenseD435_Camera_Mount.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/bg_digit_240_320.jpg b/assets/scenes/fr3_digit_simple_pick_up/assets/bg_digit_240_320.jpg deleted file mode 120000 index 8981fdc6..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/bg_digit_240_320.jpg +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./bg_digit_240_320.jpg \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/bird_eye_cam_realsense_mount.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/bird_eye_cam_realsense_mount.stl deleted file mode 120000 index aade4a49..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/bird_eye_cam_realsense_mount.stl +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/stl/bird_eye_cam_realsense_mount.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_0.obj deleted file mode 120000 index 764b871a..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_1.obj deleted file mode 120000 index 77840457..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_2.obj deleted file mode 120000 index 928d54f5..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_3.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_3.obj deleted file mode 120000 index 24897dfe..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_3.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_3.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_4.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_4.obj deleted file mode 120000 index 8243fe6a..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_4.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_4.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_5.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_5.obj deleted file mode 120000 index 24c3c4b1..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_5.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_5.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_6.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_6.obj deleted file mode 120000 index 93a98319..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_6.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_6.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_7.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_7.obj deleted file mode 120000 index 82396dd1..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_7.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_7.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_8.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_8.obj deleted file mode 120000 index aa9a0467..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/d435i_8.obj +++ /dev/null @@ -1 +0,0 @@ -../../../cameras/real_sense/obj/d435i_8.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger.obj deleted file mode 120000 index 9621357c..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger.obj +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_finger.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_attachment_collision.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_attachment_collision.stl deleted file mode 120000 index f06b88a8..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_attachment_collision.stl +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_finger_attachment_collision.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_backplate_collision.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_backplate_collision.stl deleted file mode 120000 index a73d0557..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_finger_backplate_collision.stl +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_finger_backplate_collision.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate.obj deleted file mode 120000 index 4d83ca07..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate.obj +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_sensor_no_backplate.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate_collision.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate_collision.stl deleted file mode 120000 index 0fb83212..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_no_backplate_collision.stl +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_sensor_no_backplate_collision.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_pad.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_pad.obj deleted file mode 120000 index 8596be4a..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/digit_sensor_pad.obj +++ /dev/null @@ -1 +0,0 @@ -../../../sensors/digit/./digit_sensor_pad.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/finger_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/finger_0.obj deleted file mode 120000 index d7be52c8..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/finger_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fingers/obj/finger_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/finger_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/finger_1.obj deleted file mode 120000 index 525864ac..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/finger_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fingers/obj/finger_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0.stl deleted file mode 120000 index d510caf1..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link0.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_0.obj deleted file mode 120000 index 43127ef4..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_1.obj deleted file mode 120000 index 2048aee7..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_2.obj deleted file mode 120000 index b7ab5823..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_3.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_3.obj deleted file mode 120000 index 8aca1411..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_3.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_3.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_4.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_4.obj deleted file mode 120000 index 3d0f7fa5..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_4.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_4.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_5.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_5.obj deleted file mode 120000 index 49e606ee..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_5.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_5.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_6.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_6.obj deleted file mode 120000 index 608e5fb4..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link0_6.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link0_6.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.obj deleted file mode 120000 index 16c563cd..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.stl deleted file mode 120000 index 17e4d804..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link1.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link1.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.obj deleted file mode 120000 index a84c06e7..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.stl deleted file mode 120000 index cd8051c9..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link2.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link2.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3.stl deleted file mode 120000 index 64de9b4e..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link3.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_0.obj deleted file mode 120000 index 576c35aa..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link3_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_1.obj deleted file mode 120000 index 3a653088..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link3_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link3_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4.stl deleted file mode 120000 index 094b8a5d..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link4.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_0.obj deleted file mode 120000 index f285626b..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link4_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_1.obj deleted file mode 120000 index 1f4368a9..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link4_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link4_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5.stl deleted file mode 120000 index ea38dcd7..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link5.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_0.obj deleted file mode 120000 index 765df164..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link5_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_1.obj deleted file mode 120000 index cd880faa..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link5_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_2.obj deleted file mode 120000 index b70efa30..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link5_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link5_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6.stl deleted file mode 120000 index af123358..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link6.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_0.obj deleted file mode 120000 index 44acdeb5..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_1.obj deleted file mode 120000 index 42241f68..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_2.obj deleted file mode 120000 index 45c4e31e..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_3.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_3.obj deleted file mode 120000 index fbd51bd0..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_3.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_3.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_4.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_4.obj deleted file mode 120000 index 953ad9e6..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_4.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_4.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_5.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_5.obj deleted file mode 120000 index b2a58f3f..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_5.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_5.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_6.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_6.obj deleted file mode 120000 index 32042fe4..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_6.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_6.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_7.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_7.obj deleted file mode 120000 index e88427e6..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link6_7.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link6_7.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7.stl deleted file mode 120000 index ca848a16..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7.stl +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/stl/fr3_link7.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_0.obj deleted file mode 120000 index ef995169..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link7_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_1.obj deleted file mode 120000 index 2f2ee5db..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link7_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_2.obj deleted file mode 120000 index 3e1cb093..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link7_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_3.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_3.obj deleted file mode 120000 index 355b5c35..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/fr3_link7_3.obj +++ /dev/null @@ -1 +0,0 @@ -../../../fr3/obj/fr3_link7_3.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand.stl b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand.stl deleted file mode 120000 index 65c89d81..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand.stl +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/stl/franka_hand.stl \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_0.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_0.obj deleted file mode 120000 index 81a9343e..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_0.obj +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/obj/franka_hand_0.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_1.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_1.obj deleted file mode 120000 index fefd3003..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_1.obj +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/obj/franka_hand_1.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_2.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_2.obj deleted file mode 120000 index 1cbe9e14..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_2.obj +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/obj/franka_hand_2.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_3.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_3.obj deleted file mode 120000 index 2587a25f..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_3.obj +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/obj/franka_hand_3.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_4.obj b/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_4.obj deleted file mode 120000 index 13606d10..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/assets/franka_hand_4.obj +++ /dev/null @@ -1 +0,0 @@ -../../../grippers/franka_hand/obj/franka_hand_4.obj \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml deleted file mode 100644 index ea5d5bd4..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_0.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml b/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml deleted file mode 100644 index a266ad31..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/fr3_common.xml +++ /dev/null @@ -1,137 +0,0 @@ - - - - \ No newline at end of file diff --git a/assets/scenes/fr3_digit_simple_pick_up/robot.urdf b/assets/scenes/fr3_digit_simple_pick_up/robot.urdf deleted file mode 100644 index c2a869e8..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/robot.urdf +++ /dev/null @@ -1,276 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/scenes/fr3_digit_simple_pick_up/scene.xml b/assets/scenes/fr3_digit_simple_pick_up/scene.xml deleted file mode 100644 index 26998a54..00000000 --- a/assets/scenes/fr3_digit_simple_pick_up/scene.xml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -