Mujoco KDL Wrapper  0.2.2
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 finally:
43 viewer.close()
44 return
45 end = env.time() + duration
46 while env.time() < end:
47 step_fn()
48 robot.step()
49
50
51def main() -> int:
52 parser = argparse.ArgumentParser()
53 parser.add_argument("--gui", action="store_true")
54 args = parser.parse_args()
55
56 model_path = mjk.menagerie.model_path("kinova_gen3", env_var="MJ_KDL_MODEL")
57 env, robot = build_env(model_path)
58 try:
59 robot.ctrl_mode = mjk.CtrlMode.TORQUE
60 env.on_reset = lambda ctx: robot.set_joint_pos(HOME_POSE, call_forward=False)
61 env.reset()
62
63 robot.update()
64 start_frame = robot.fk_frame()
65 start = [start_frame.p.x(), start_frame.p.y(), start_frame.p.z()]
66
67 def step():
68 robot.update()
69 robot.jnt_trq_cmd = robot.gravity_torques(-9.81)
70
71 run_loop(env, robot, step, duration=2.0, gui=args.gui)
72 end_frame = robot.fk_frame()
73 end = [end_frame.p.x(), end_frame.p.y(), end_frame.p.z()]
74 drift = sum((end[i] - start[i]) ** 2 for i in range(3)) ** 0.5
75 print(f"EE drift: {drift:.6f} m")
76 finally:
77 env.close()
78 return 0
79
80
81if __name__ == "__main__":
82 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)