Skip to content

Commit 3281990

Browse files
authored
Merge pull request #183 from utn-mi/juelg/refactor-sim-attribute-name-handling
refactor(sim): mujoco ids into config
2 parents 41aeb55 + ac9bf2b commit 3281990

11 files changed

Lines changed: 157 additions & 106 deletions

File tree

python/examples/fr3.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,14 +69,14 @@ def main():
6969
urdf_path = get_urdf_path(URDF_PATH, allow_none_if_not_found=False)
7070
assert urdf_path is not None
7171
ik = rcs.common.IK(urdf_path)
72-
robot = rcs.sim.SimRobot(simulation, "0", ik)
7372
cfg = sim.SimRobotConfig()
73+
cfg.add_id("0")
7474
cfg.tcp_offset = rcs.common.Pose(rcs.common.FrankaHandTCPOffset())
75-
cfg.realtime = False
76-
robot.set_parameters(cfg)
75+
robot = rcs.sim.SimRobot(simulation, ik, cfg)
7776

7877
gripper_cfg_sim = sim.SimGripperConfig()
79-
gripper = sim.SimGripper(simulation, "0", gripper_cfg_sim)
78+
gripper_cfg_sim.add_id("0")
79+
gripper = sim.SimGripper(simulation, gripper_cfg_sim)
8080

8181
# add camera to have a rendering gui
8282
cameras = {

python/rcs/_core/sim.pyi

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,17 +113,23 @@ class SimCameraSetConfig:
113113
def frame_rate(self, arg0: int) -> None: ...
114114

115115
class SimGripper(rcs._core.common.Gripper):
116-
def __init__(self, sim: Sim, id: str, cfg: SimGripperConfig) -> None: ...
116+
def __init__(self, sim: Sim, cfg: SimGripperConfig) -> None: ...
117117
def get_parameters(self) -> SimGripperConfig: ...
118118
def get_state(self) -> SimGripperState: ...
119119
def set_parameters(self, cfg: SimGripperConfig) -> bool: ...
120120

121121
class SimGripperConfig(rcs._core.common.GripperConfig):
122+
actuator: str
123+
collision_geoms: list[str]
124+
collision_geoms_fingers: list[str]
122125
epsilon_inner: float
123126
epsilon_outer: float
124127
ignored_collision_geoms: list[str]
128+
joint1: str
129+
joint2: str
125130
seconds_between_callbacks: float
126131
def __init__(self) -> None: ...
132+
def add_id(self, id: str) -> None: ...
127133

128134
class SimGripperState(rcs._core.common.GripperState):
129135
def __init__(self) -> None: ...
@@ -140,20 +146,27 @@ class SimGripperState(rcs._core.common.GripperState):
140146

141147
class SimRobot(rcs._core.common.Robot):
142148
def __init__(
143-
self, sim: Sim, id: str, ik: rcs._core.common.IK, register_convergence_callback: bool = True
149+
self, sim: Sim, ik: rcs._core.common.IK, cfg: SimRobotConfig, register_convergence_callback: bool = True
144150
) -> None: ...
145151
def get_parameters(self) -> SimRobotConfig: ...
146152
def get_state(self) -> SimRobotState: ...
147153
def set_joints_hard(self, q: numpy.ndarray[M, numpy.dtype[numpy.float64]]) -> None: ...
148154
def set_parameters(self, cfg: SimRobotConfig) -> bool: ...
149155

150156
class SimRobotConfig(rcs._core.common.RobotConfig):
157+
actuators: list[str]
158+
arm_collision_geoms: list[str]
159+
attachment_site: str
160+
base: str
151161
joint_rotational_tolerance: float
162+
joints: list[str]
152163
realtime: bool
164+
robot_type: rcs._core.common.RobotType
153165
seconds_between_callbacks: float
154166
tcp_offset: rcs._core.common.Pose
155167
trajectory_trace: bool
156168
def __init__(self) -> None: ...
169+
def add_id(self, id: str) -> None: ...
157170

158171
class SimRobotState(rcs._core.common.RobotState):
159172
def __init__(self) -> None: ...

python/rcs/envs/creators.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ def __call__( # type: ignore
190190
simulation = sim.Sim(mjb_file)
191191

192192
ik = rcs.common.IK(urdf_path)
193-
robot = rcs.sim.SimRobot(simulation, "0", ik)
194-
robot.set_parameters(robot_cfg)
193+
robot = rcs.sim.SimRobot(simulation, ik, robot_cfg)
195194
env: gym.Env = RobotEnv(robot, control_mode)
196195
env = FR3Sim(env, simulation, sim_wrapper)
197196

@@ -200,7 +199,7 @@ def __call__( # type: ignore
200199
env = CameraSetWrapper(env, camera_set, include_depth=True)
201200

202201
if gripper_cfg is not None and isinstance(gripper_cfg, rcs.sim.SimGripperConfig):
203-
gripper = sim.SimGripper(simulation, "0", gripper_cfg)
202+
gripper = sim.SimGripper(simulation, gripper_cfg)
204203
env = GripperWrapper(env, gripper, binary=True)
205204
env = GripperWrapperSim(env, gripper)
206205

python/rcs/envs/sim.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,15 +158,15 @@ def env_from_xml_paths(
158158
sim_gui: bool = True,
159159
truncate_on_collision: bool = True,
160160
) -> "CollisionGuard":
161+
# TODO: this needs to support non FR3 robots
161162
assert isinstance(env.unwrapped, RobotEnv)
162163
simulation = sim.Sim(mjmld)
163164
ik = rcs.common.IK(urdf, max_duration_ms=300)
164-
robot = rcs.sim.SimRobot(simulation, id, ik)
165-
cfg = sim.SimRobotConfig()
165+
cfg = default_fr3_sim_robot_cfg(mjmld, id)
166166
cfg.realtime = False
167167
if tcp_offset is not None:
168168
cfg.tcp_offset = tcp_offset
169-
robot.set_parameters(cfg)
169+
robot = rcs.sim.SimRobot(simulation, ik, cfg)
170170
to_joint_control = False
171171
if control_mode is not None:
172172
if control_mode != env.unwrapped.get_control_mode():
@@ -181,7 +181,8 @@ def env_from_xml_paths(
181181
c_env = FR3Sim(c_env, simulation)
182182
if gripper:
183183
gripper_cfg = sim.SimGripperConfig()
184-
fh = sim.SimGripper(simulation, id, gripper_cfg)
184+
gripper_cfg.add_id(id)
185+
fh = sim.SimGripper(simulation, gripper_cfg)
185186
c_env = GripperWrapper(c_env, fh)
186187
c_env = GripperWrapperSim(c_env, fh)
187188
return cls(
@@ -250,8 +251,9 @@ def __init__(self, env, cam_robot_joints: VecType, scene: str = "lab_simple_pick
250251
self.unwrapped: RobotEnv
251252
assert isinstance(self.unwrapped.robot, sim.SimRobot), "Robot must be a sim.SimRobot instance."
252253
self.sim = env.get_wrapper_attr("sim")
254+
cfg = default_fr3_sim_robot_cfg(scene, "1")
253255
self.cam_robot = rcs.sim.SimRobot(
254-
self.sim, "1", env.unwrapped.robot.get_ik(), register_convergence_callback=False
256+
self.sim, env.unwrapped.robot.get_ik(), cfg, register_convergence_callback=False
255257
)
256258
self.cam_robot.set_parameters(default_fr3_sim_robot_cfg(scene))
257259
self.cam_robot_joints = cam_robot_joints

python/rcs/envs/utils.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@
1717
logger.setLevel(logging.INFO)
1818

1919

20-
def default_fr3_sim_robot_cfg(mjcf: str | Path = "fr3_empty_world") -> sim.SimRobotConfig:
20+
def default_fr3_sim_robot_cfg(mjcf: str | Path = "fr3_empty_world", idx: str = "0") -> sim.SimRobotConfig:
2121
cfg = sim.SimRobotConfig()
2222
cfg.tcp_offset = get_tcp_offset(mjcf)
2323
cfg.realtime = False
24+
cfg.robot_type = rcs.common.RobotType.FR3
25+
cfg.add_id(idx)
2426
return cfg
2527

2628

27-
def default_fr3_hw_robot_cfg(async_control: bool = False):
29+
def default_fr3_hw_robot_cfg(async_control: bool = False) -> FR3Config:
2830
robot_cfg = FR3Config()
2931
robot_cfg.tcp_offset = rcs.common.Pose(rcs.common.FrankaHandTCPOffset())
3032
robot_cfg.speed_factor = 0.1
@@ -33,7 +35,7 @@ def default_fr3_hw_robot_cfg(async_control: bool = False):
3335
return robot_cfg
3436

3537

36-
def default_fr3_hw_gripper_cfg(async_control: bool = False):
38+
def default_fr3_hw_gripper_cfg(async_control: bool = False) -> rcs.hw.FHConfig:
3739
gripper_cfg = rcs.hw.FHConfig()
3840
gripper_cfg.epsilon_inner = gripper_cfg.epsilon_outer = 0.1
3941
gripper_cfg.speed = 0.1
@@ -65,11 +67,13 @@ def default_realsense(name2id: dict[str, str] | None) -> RealSenseCameraSet | No
6567
return RealSenseCameraSet(cam_cfg)
6668

6769

68-
def default_fr3_sim_gripper_cfg():
69-
return sim.SimGripperConfig()
70+
def default_fr3_sim_gripper_cfg(idx: str = "0") -> sim.SimGripperConfig:
71+
cfg = sim.SimGripperConfig()
72+
cfg.add_id(idx)
73+
return cfg
7074

7175

72-
def default_mujoco_cameraset_cfg():
76+
def default_mujoco_cameraset_cfg() -> SimCameraSetConfig:
7377
cameras = {
7478
"wrist": SimCameraConfig(identifier="wrist_0", type=int(CameraType.fixed)),
7579
"default_free": SimCameraConfig(identifier="", type=int(CameraType.default_free)),
@@ -81,7 +85,7 @@ def default_mujoco_cameraset_cfg():
8185
)
8286

8387

84-
def get_tcp_offset(mjcf: str | Path):
88+
def get_tcp_offset(mjcf: str | Path) -> rcs.common.Pose:
8589
"""Reads out tcp offset set in mjcf file.
8690
8791
Convention: The tcp offset is stored in the model as a numeric attribute named "tcp_offset".

src/pybind/rcs.cpp

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,16 @@ PYBIND11_MODULE(_core, m) {
413413
&rcs::sim::SimRobotConfig::seconds_between_callbacks)
414414
.def_readwrite("realtime", &rcs::sim::SimRobotConfig::realtime)
415415
.def_readwrite("trajectory_trace",
416-
&rcs::sim::SimRobotConfig::trajectory_trace);
416+
&rcs::sim::SimRobotConfig::trajectory_trace)
417+
.def_readwrite("robot_type", &rcs::sim::SimRobotConfig::robot_type)
418+
.def_readwrite("arm_collision_geoms",
419+
&rcs::sim::SimRobotConfig::arm_collision_geoms)
420+
.def_readwrite("joints", &rcs::sim::SimRobotConfig::joints)
421+
.def_readwrite("attachment_site",
422+
&rcs::sim::SimRobotConfig::attachment_site)
423+
.def_readwrite("actuators", &rcs::sim::SimRobotConfig::actuators)
424+
.def_readwrite("base", &rcs::sim::SimRobotConfig::base)
425+
.def("add_id", &rcs::sim::SimRobotConfig::add_id, py::arg("id"));
417426
py::class_<rcs::sim::SimRobotState, rcs::common::RobotState>(sim,
418427
"SimRobotState")
419428
.def(py::init<>())
@@ -436,7 +445,15 @@ PYBIND11_MODULE(_core, m) {
436445
.def_readwrite("seconds_between_callbacks",
437446
&rcs::sim::SimGripperConfig::seconds_between_callbacks)
438447
.def_readwrite("ignored_collision_geoms",
439-
&rcs::sim::SimGripperConfig::ignored_collision_geoms);
448+
&rcs::sim::SimGripperConfig::ignored_collision_geoms)
449+
.def_readwrite("collision_geoms",
450+
&rcs::sim::SimGripperConfig::collision_geoms)
451+
.def_readwrite("collision_geoms_fingers",
452+
&rcs::sim::SimGripperConfig::collision_geoms_fingers)
453+
.def_readwrite("joint1", &rcs::sim::SimGripperConfig::joint1)
454+
.def_readwrite("joint2", &rcs::sim::SimGripperConfig::joint2)
455+
.def_readwrite("actuator", &rcs::sim::SimGripperConfig::actuator)
456+
.def("add_id", &rcs::sim::SimGripperConfig::add_id, py::arg("id"));
440457
py::class_<rcs::sim::SimGripperState, rcs::common::GripperState>(
441458
sim, "SimGripperState")
442459
.def(py::init<>())
@@ -462,18 +479,19 @@ PYBIND11_MODULE(_core, m) {
462479
.def("_stop_gui_server", &rcs::sim::Sim::stop_gui_server);
463480
py::class_<rcs::sim::SimGripper, rcs::common::Gripper,
464481
std::shared_ptr<rcs::sim::SimGripper>>(sim, "SimGripper")
465-
.def(py::init<std::shared_ptr<rcs::sim::Sim>, const std::string &,
482+
.def(py::init<std::shared_ptr<rcs::sim::Sim>,
466483
const rcs::sim::SimGripperConfig &>(),
467-
py::arg("sim"), py::arg("id"), py::arg("cfg"))
484+
py::arg("sim"), py::arg("cfg"))
468485
.def("get_parameters", &rcs::sim::SimGripper::get_parameters)
469486
.def("get_state", &rcs::sim::SimGripper::get_state)
470487
.def("set_parameters", &rcs::sim::SimGripper::set_parameters,
471488
py::arg("cfg"));
472489
py::class_<rcs::sim::SimRobot, rcs::common::Robot,
473490
std::shared_ptr<rcs::sim::SimRobot>>(sim, "SimRobot")
474-
.def(py::init<std::shared_ptr<rcs::sim::Sim>, const std::string &,
475-
std::shared_ptr<rcs::common::IK>, bool>(),
476-
py::arg("sim"), py::arg("id"), py::arg("ik"),
491+
.def(py::init<std::shared_ptr<rcs::sim::Sim>,
492+
std::shared_ptr<rcs::common::IK>, rcs::sim::SimRobotConfig,
493+
bool>(),
494+
py::arg("sim"), py::arg("ik"), py::arg("cfg"),
477495
py::arg("register_convergence_callback") = true)
478496
.def("get_parameters", &rcs::sim::SimRobot::get_parameters)
479497
.def("set_parameters", &rcs::sim::SimRobot::set_parameters,

src/sim/SimGripper.cpp

Lines changed: 12 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,49 +7,33 @@
77
#include <string>
88
#include <tuple>
99

10-
struct {
11-
// TODO(juelg): add camera mount collision (first a name needs to be
12-
// added to the model)
13-
std::vector<std::string> collision_geoms{"hand_c", "d435i_collision",
14-
"finger_0_left", "finger_0_right"};
15-
16-
std::vector<std::string> collision_geoms_fingers{"finger_0_left",
17-
"finger_0_right"};
18-
std::string joint1 = "finger_joint1";
19-
std::string joint2 = "finger_joint2";
20-
std::string actuator = "actuator8";
21-
} const gripper_names;
22-
2310
namespace rcs {
2411
namespace sim {
2512

26-
SimGripper::SimGripper(std::shared_ptr<Sim> sim, const std::string &id,
27-
const SimGripperConfig &cfg)
28-
: sim{sim}, cfg{cfg}, id{id} {
13+
SimGripper::SimGripper(std::shared_ptr<Sim> sim, const SimGripperConfig &cfg)
14+
: sim{sim}, cfg{cfg} {
2915
this->state = SimGripperState();
30-
this->actuator_id = mj_name2id(this->sim->m, mjOBJ_ACTUATOR,
31-
(gripper_names.actuator + "_" + id).c_str());
16+
this->actuator_id =
17+
mj_name2id(this->sim->m, mjOBJ_ACTUATOR, this->cfg.actuator.c_str());
3218
if (this->actuator_id == -1) {
3319
throw std::runtime_error(
34-
std::string("No actuator named " + gripper_names.actuator));
20+
std::string("No actuator named " + this->cfg.actuator));
3521
}
3622
// this->tendon_id =
3723
// mj_name2id(this->sim->m, mjOBJ_TENDON, ("split_" + id).c_str());
3824
this->joint_id_1 = this->sim->m->jnt_qposadr[mj_name2id(
39-
this->sim->m, mjOBJ_JOINT, (gripper_names.joint1 + "_" + id).c_str())];
25+
this->sim->m, mjOBJ_JOINT, this->cfg.joint1.c_str())];
4026
if (this->joint_id_1 == -1) {
41-
throw std::runtime_error(
42-
std::string("No joint named " + gripper_names.joint1));
27+
throw std::runtime_error(std::string("No joint named " + this->cfg.joint1));
4328
}
4429
this->joint_id_2 = this->sim->m->jnt_qposadr[mj_name2id(
45-
this->sim->m, mjOBJ_JOINT, (gripper_names.joint2 + "_" + id).c_str())];
30+
this->sim->m, mjOBJ_JOINT, this->cfg.joint2.c_str())];
4631
if (this->joint_id_2 == -1) {
47-
throw std::runtime_error(
48-
std::string("No joint named " + gripper_names.joint2));
32+
throw std::runtime_error(std::string("No joint named " + this->cfg.joint2));
4933
}
5034
// Collision geoms
51-
this->add_collision_geoms(gripper_names.collision_geoms, this->cgeom, false);
52-
this->add_collision_geoms(gripper_names.collision_geoms_fingers, this->cfgeom,
35+
this->add_collision_geoms(this->cfg.collision_geoms, this->cgeom, false);
36+
this->add_collision_geoms(this->cfg.collision_geoms_fingers, this->cfgeom,
5337
false);
5438

5539
this->sim->register_all_cb(std::bind(&SimGripper::convergence_callback, this),
@@ -68,7 +52,7 @@ void SimGripper::add_collision_geoms(const std::vector<std::string> &cgeoms_str,
6852
cgeoms_set.clear();
6953
}
7054
for (size_t i = 0; i < std::size(cgeoms_str); ++i) {
71-
std::string name = cgeoms_str[i] + "_" + id;
55+
std::string name = cgeoms_str[i];
7256

7357
int coll_id = mj_name2id(this->sim->m, mjOBJ_GEOM, name.c_str());
7458
if (coll_id == -1) {

src/sim/SimGripper.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,29 @@ struct SimGripperConfig : common::GripperConfig {
1818
double epsilon_outer = 0.005;
1919
double seconds_between_callbacks = 0.05; // 20 Hz
2020
std::vector<std::string> ignored_collision_geoms = {};
21+
std::vector<std::string> collision_geoms{"hand_c", "d435i_collision",
22+
"finger_0_left", "finger_0_right"};
23+
24+
std::vector<std::string> collision_geoms_fingers{"finger_0_left",
25+
"finger_0_right"};
26+
std::string joint1 = "finger_joint1";
27+
std::string joint2 = "finger_joint2";
28+
std::string actuator = "actuator8";
29+
30+
void add_id(const std::string &id) {
31+
for (auto &s : this->collision_geoms) {
32+
s = s + "_" + id;
33+
}
34+
for (auto &s : this->collision_geoms_fingers) {
35+
s = s + "_" + id;
36+
}
37+
for (auto &s : this->ignored_collision_geoms) {
38+
s = s + "_" + id;
39+
}
40+
this->joint1 = this->joint1 + "_" + id;
41+
this->joint2 = this->joint2 + "_" + id;
42+
this->actuator = this->actuator + "_" + id;
43+
}
2144
};
2245

2346
struct SimGripperState : common::GripperState {
@@ -38,7 +61,6 @@ class SimGripper : public common::Gripper {
3861
int joint_id_1;
3962
int joint_id_2;
4063
SimGripperState state;
41-
std::string id;
4264
bool convergence_callback();
4365
bool collision_callback();
4466
std::set<size_t> cgeom;
@@ -49,8 +71,7 @@ class SimGripper : public common::Gripper {
4971
void m_reset();
5072

5173
public:
52-
SimGripper(std::shared_ptr<Sim> sim, const std::string &id,
53-
const SimGripperConfig &cfg);
74+
SimGripper(std::shared_ptr<Sim> sim, const SimGripperConfig &cfg);
5475
~SimGripper() override;
5576

5677
bool set_parameters(const SimGripperConfig &cfg);

0 commit comments

Comments
 (0)