Mujoco KDL Wrapper  0.3.18
MuJoCo + KDL bridge for robot kinematics and dynamics
Loading...
Searching...
No Matches
ex_gravity_comp.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2"""Gravity-compensation example ported from src/examples/ex_gravity_comp.cpp.
3
4Uses an Env with an on_reset hook (re-homes the arm) so the simulate-UI reset
5button restores the home pose, mirroring the C++ example.
6"""
7
8from __future__ import annotations
9
10import argparse
11
12import mj_kdl_wrapper as mjk
13
14HOME_POSE = [0.0, 0.2618, 3.1416, -2.2689, 0.0, 0.9599, 1.5708]
15
16
17def build_env(model_path: str) -> tuple[mjk.Env, mjk.Robot]:
18 spec = mjk.SceneSpec()
19 spec.timestep = 0.002
20 spec.add_floor = True
21 spec.add_skybox = True
22 robot_spec = mjk.RobotSpec()
23 robot_spec.path = model_path
24 spec.robots = [robot_spec]
25 env = mjk.Env.build(spec)
26 robot = env.create_robot("base_link", "bracelet_link")
27 return env, robot
28
29
30def run_loop(env: mjk.Env, robot: mjk.Robot, step_fn, *, duration: float, gui: bool) -> None:
31 if gui:
32 viewer = mjk.SimulateViewer.open(robot, "ex_gravity_comp.py")
33 prev = env.time()
34 try:
35 while viewer.is_running():
36 if env.time() < prev - 1e-6: # user pressed reset in the UI
37 env.reset()
38 prev = env.time()
39 step_fn()
40 if not viewer.step():
41 break
42 viewer.pace()
43 finally:
44 viewer.close()
45 return
46 end = env.time() + duration
47 while env.time() < end:
48 step_fn()
49 robot.step()
50 robot.pace()
51
52
53def main() -> int:
54 parser = argparse.ArgumentParser()
55 parser.add_argument("--gui", action="store_true")
56 args = parser.parse_args()
57
58 model_path = mjk.menagerie.model_path("kinova_gen3", env_var="MJ_KDL_MODEL")
59 env, robot = build_env(model_path)
60 try:
61 robot.ctrl_mode = mjk.CtrlMode.TORQUE
62 env.on_reset = lambda ctx: robot.set_joint_pos(HOME_POSE, call_forward=False)
63 env.reset()
64
65 robot.update()
66 start_frame = robot.fk_frame()
67 start = [start_frame.p.x(), start_frame.p.y(), start_frame.p.z()]
68
69 def step():
70 robot.update()
71 robot.jnt_trq_cmd = robot.gravity_torques(-9.81)
72
73 run_loop(env, robot, step, duration=2.0, gui=args.gui)
74 end_frame = robot.fk_frame()
75 end = [end_frame.p.x(), end_frame.p.y(), end_frame.p.z()]
76 drift = sum((end[i] - start[i]) ** 2 for i in range(3)) ** 0.5
77 print(f"EE drift: {drift:.6f} m")
78 finally:
79 env.close()
80 return 0
81
82
83if __name__ == "__main__":
84 raise SystemExit(main())
None run_loop(mjk.Env env, mjk.Robot robot, step_fn, *, float duration, bool gui)
tuple[mjk.Env, mjk.Robot] build_env(str model_path)