Skip to content

Commit d93f10f

Browse files
authored
Merge pull request #165 from utn-mi/nava/digit_grippers
feat(sim): support for camera robot lab scene
2 parents 60f8eb8 + 2dda995 commit d93f10f

File tree

17 files changed

+404
-137
lines changed

17 files changed

+404
-137
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ __pycache__
88
.ruff_cache
99
.mypy_cache
1010
dist
11-
.venv
11+
*venv*
1212
config.yaml
1313
MUJOCO_LOG.TXT
1414
src/pybind/mujoco

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ FetchContent_MakeAvailable(libfranka rl pybind11)
9898
if (${INCLUDE_UTN_MODELS})
9999
if (DEFINED GITLAB_MODELS_TOKEN)
100100
include(download_scenes)
101-
set(ref b8234983a5e35e222c955f9145ac4cd129827a8e)
101+
set(ref bfdd70ae189ed3a925bf1c16d29162e847a21d56)
102102
FetchContent_Declare(
103103
scenes
104104
URL "https://gitos.rrze.fau.de/api/v4/projects/1100/repository/archive?path=scenes&sha=${ref}"

python/examples/env_cartesian_control.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
from rcsss.control.fr3_desk import FCI, Desk, DummyResourceManager
44
from rcsss.control.utils import load_creds_fr3_desk
55
from rcsss.envs.base import ControlMode, RelativeTo, RobotInstance
6-
from rcsss.envs.factories import (
6+
from rcsss.envs.factories import fr3_hw_env, fr3_sim_env
7+
from rcsss.envs.utils import (
78
default_fr3_hw_gripper_cfg,
89
default_fr3_hw_robot_cfg,
910
default_fr3_sim_gripper_cfg,
1011
default_fr3_sim_robot_cfg,
1112
default_mujoco_cameraset_cfg,
12-
fr3_hw_env,
13-
fr3_sim_env,
1413
)
1514

1615
logger = logging.getLogger(__name__)

python/examples/env_joint_control.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@
44
from rcsss.control.fr3_desk import FCI, Desk, DummyResourceManager
55
from rcsss.control.utils import load_creds_fr3_desk
66
from rcsss.envs.base import ControlMode, RelativeTo, RobotInstance
7-
from rcsss.envs.factories import (
7+
from rcsss.envs.factories import fr3_hw_env, fr3_sim_env
8+
from rcsss.envs.utils import (
89
default_fr3_hw_gripper_cfg,
910
default_fr3_hw_robot_cfg,
1011
default_fr3_sim_gripper_cfg,
1112
default_fr3_sim_robot_cfg,
1213
default_mujoco_cameraset_cfg,
13-
fr3_hw_env,
14-
fr3_sim_env,
1514
)
1615

1716
logger = logging.getLogger(__name__)

python/examples/grasp_demo.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ def generate_waypoints(self, start_pose: Pose, end_pose: Pose, num_waypoints: in
3232
for i in range(num_waypoints + 1):
3333
t = i / (num_waypoints + 1)
3434
waypoints.append(start_pose.interpolate(end_pose, t))
35+
waypoints.append(end_pose)
3536
return waypoints
3637

3738
def step(self, action: dict) -> dict:
@@ -81,8 +82,15 @@ def pickup(self, geom_name: str):
8182

8283

8384
def main():
84-
env = gym.make("rcs/SimplePickUpSim-v0", render_mode="human", delta_actions=True)
85+
# compatilbe with rcs/SimplePickUpSimDigitHand-v0 and rcs/SimplePickUpSim-v0
86+
env = gym.make(
87+
"rcs/SimplePickUpSimDigitHand-v0",
88+
render_mode="human",
89+
delta_actions=True,
90+
)
8591
env.reset()
92+
print(env.unwrapped.robot.get_cartesian_position().translation()) # type: ignore
93+
# assert False
8694
controller = PickUpDemo(env)
8795
controller.pickup("yellow_box_geom")
8896

python/examples/grasp_demo_lab.py

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import logging
2+
from typing import Any, cast
3+
4+
import gymnasium as gym
5+
import mujoco
6+
import numpy as np
7+
from rcsss._core.common import Pose
8+
from rcsss.envs.base import FR3Env, GripperWrapper
9+
10+
logger = logging.getLogger(__name__)
11+
logger.setLevel(logging.INFO)
12+
13+
14+
class PickUpDemo:
15+
def __init__(self, env: gym.Env):
16+
self.env = env
17+
self.unwrapped: FR3Env = cast(FR3Env, self.env.unwrapped)
18+
self.home_pose = self.unwrapped.robot.get_cartesian_position()
19+
20+
def _action(self, pose: Pose, gripper: float) -> dict[str, Any]:
21+
return {"xyzrpy": pose.xyzrpy(), "gripper": gripper}
22+
23+
def get_object_pose(self, geom_name) -> Pose:
24+
model = self.env.get_wrapper_attr("sim").model
25+
data = self.env.get_wrapper_attr("sim").data
26+
27+
geom_id = mujoco.mj_name2id(model, mujoco.mjtObj.mjOBJ_GEOM, geom_name)
28+
obj_pose_world_coordinates = Pose(
29+
translation=data.geom_xpos[geom_id], rotation=data.geom_xmat[geom_id].reshape(3, 3)
30+
)
31+
return self.unwrapped.robot.to_pose_in_robot_coordinates(obj_pose_world_coordinates)
32+
33+
def generate_waypoints(self, start_pose: Pose, end_pose: Pose, num_waypoints: int) -> list[Pose]:
34+
waypoints = []
35+
for i in range(num_waypoints + 1):
36+
t = i / (num_waypoints + 1)
37+
waypoints.append(start_pose.interpolate(end_pose, t))
38+
return waypoints
39+
40+
def step(self, action: dict) -> dict:
41+
return self.env.step(action)[0]
42+
43+
def plan_linear_motion(self, geom_name: str, delta_up: float, num_waypoints: int = 200) -> list[Pose]:
44+
end_eff_pose = self.unwrapped.robot.get_cartesian_position()
45+
goal_pose = self.get_object_pose(geom_name=geom_name)
46+
goal_pose *= Pose(translation=np.array([0, 0, delta_up]), quaternion=np.array([1, 0, 0, 0]))
47+
return self.generate_waypoints(end_eff_pose, goal_pose, num_waypoints=num_waypoints)
48+
49+
def execute_motion(self, waypoints: list[Pose], gripper: float = GripperWrapper.BINARY_GRIPPER_OPEN) -> dict:
50+
for i in range(1, len(waypoints)):
51+
# calculate delta action
52+
delta_action = waypoints[i] * waypoints[i - 1].inverse()
53+
obs = self.step(self._action(delta_action, gripper))
54+
return obs
55+
56+
def approach(self, geom_name: str):
57+
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=50)
58+
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN)
59+
60+
def grasp(self, geom_name: str):
61+
62+
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0, num_waypoints=50)
63+
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_OPEN)
64+
65+
self.step(self._action(Pose(), GripperWrapper.BINARY_GRIPPER_CLOSED))
66+
67+
waypoints = self.plan_linear_motion(geom_name=geom_name, delta_up=0.2, num_waypoints=50)
68+
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED)
69+
70+
def move_home(self):
71+
end_eff_pose = self.unwrapped.robot.get_cartesian_position()
72+
waypoints = self.generate_waypoints(end_eff_pose, self.home_pose, num_waypoints=50)
73+
self.execute_motion(waypoints=waypoints, gripper=GripperWrapper.BINARY_GRIPPER_CLOSED)
74+
75+
def pickup(self, geom_name: str):
76+
self.approach(geom_name)
77+
self.grasp(geom_name)
78+
self.move_home()
79+
80+
81+
def main():
82+
env = gym.make(
83+
"rcs/LabPickUpSimDigitHand-v0",
84+
render_mode="human",
85+
delta_actions=True,
86+
cam_robot_joints=np.array(
87+
[-0.78452318, -1.18096017, 1.75158399, -1.0718541, -0.11207275, 1.01050546, 2.47343638]
88+
),
89+
)
90+
env.reset()
91+
controller = PickUpDemo(env)
92+
controller.pickup("yellow_box_geom")
93+
94+
95+
if __name__ == "__main__":
96+
main()

python/rcsss/__init__.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
from gymnasium import register
77
from rcsss import camera, control, envs, sim
88
from rcsss._core import __version__, common, hw
9-
from rcsss.envs.factories import FR3Real, FR3SimplePickUpSim
9+
from rcsss.envs.factories import (
10+
FR3LabPickUpSimDigitHand,
11+
FR3Real,
12+
FR3SimplePickUpSim,
13+
FR3SimplePickUpSimDigitHand,
14+
)
1015

1116
# available mujoco scenes
1217
scenes = {
@@ -21,6 +26,16 @@
2126
id="rcs/SimplePickUpSim-v0",
2227
entry_point=FR3SimplePickUpSim(),
2328
)
29+
30+
register(
31+
id="rcs/SimplePickUpSimDigitHand-v0",
32+
entry_point=FR3SimplePickUpSimDigitHand(),
33+
)
34+
register(
35+
id="rcs/LabPickUpSimDigitHand-v0",
36+
entry_point=FR3LabPickUpSimDigitHand(),
37+
)
38+
2439
register(
2540
id="rcs/FR3Real-v0",
2641
entry_point=FR3Real(),

python/rcsss/_core/sim.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ class FHState(rcsss._core.common.GState):
8686
def max_unnormalized_width(self) -> float: ...
8787

8888
class FR3(rcsss._core.common.Robot):
89-
def __init__(self, sim: Sim, id: str, ik: rcsss._core.common.IK) -> None: ...
89+
def __init__(
90+
self, sim: Sim, id: str, ik: rcsss._core.common.IK, register_convergence_callback: bool = True
91+
) -> None: ...
9092
def get_parameters(self) -> FR3Config: ...
9193
def get_state(self) -> FR3State: ...
9294
def set_joints_hard(self, q: numpy.ndarray[typing.Literal[7], numpy.dtype[numpy.float64]]) -> None: ...

python/rcsss/control/keyboard_control.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,8 @@
77
from rcsss.control.fr3_desk import FCI, Desk
88
from rcsss.control.utils import load_creds_fr3_desk
99
from rcsss.envs.base import ControlMode, RelativeTo
10-
from rcsss.envs.factories import (
11-
default_fr3_hw_gripper_cfg,
12-
default_fr3_hw_robot_cfg,
13-
fr3_hw_env,
14-
)
10+
from rcsss.envs.factories import fr3_hw_env
11+
from rcsss.envs.utils import default_fr3_hw_gripper_cfg, default_fr3_hw_robot_cfg
1512

1613
logger = logging.getLogger(__name__)
1714
logger.setLevel(logging.INFO)

python/rcsss/control/vive.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,13 @@
1515
RelativeTo,
1616
RobotInstance,
1717
)
18-
from rcsss.envs.factories import (
18+
from rcsss.envs.factories import fr3_hw_env, fr3_sim_env
19+
from rcsss.envs.utils import (
1920
default_fr3_hw_gripper_cfg,
2021
default_fr3_hw_robot_cfg,
2122
default_fr3_sim_gripper_cfg,
2223
default_fr3_sim_robot_cfg,
2324
default_mujoco_cameraset_cfg,
24-
fr3_hw_env,
25-
fr3_sim_env,
2625
)
2726

2827
# import matplotlib.pyplot as plt

0 commit comments

Comments
 (0)