Skip to main content

Numerical Inverse Kinematics based on JAX + MJX

Project description

MJINX

mypy ruff build PyPI version PyPI downloads

Mjinx is a library for auto-differentiable numerical inverse kinematics, powered by JAX and Mujoco MJX. The library was heavily inspired by the similar Pinocchio-based tool pink and Mujoco-based analogue mink.

Key features

  1. Flexibility. Each control problem is assembled via Components, which enforce desired behaviour or keeps system in a safety set.
  2. Different solution approaches. JAX (i.e. it's efficient sampling and autodifferentiation) allows to implement variety of solvers, which might be more beneficial in different scenarios.
  3. Fully Jax-compatible. Both optimal control problem and its solver are jax-compatible: jit-compilation and automatic vectorization are available for the whole problem.
  4. Convinience. The functionality is nicely wrapped to make the interaction with it easier.

Installation

The package is available in PyPI registry, and could be installed via pip:

pip install mjinx

Different installation versions:

  1. Visualization tool mjinx.visualization.BatchVisualizer is available in mjinx[visual]
  2. To run examples, install mjinx[examples]
  3. To install development version, install mjinx[dev] (preferably in editable mode)
  4. To build docs, install mjinx[docs]
  5. To install the repository with all dependencies, install mjikx[all]

Usage

Here is the example of mjinx usage:

from mujoco import mjx mjx
from mjinx.problem import Problem

# Initialize the robot model using MuJoCo
MJCF_PATH = "path_to_mjcf.xml"
mj_model = mj.MjModel.from_xml_path(MJCF_PATH)
mjx_model = mjx.put_model(mj_model)

# Create instance of the problem
problem = Problem(mjx_model)

# Add tasks to track desired behavior
frame_task = FrameTask("ee_task", cost=1, gain=20, body_name="link7")
problem.add_component(frame_task)

# Add barriers to keep robot in a safety set
joints_barrier = JointBarrier("jnt_range", gain=10)
problem.add_component(joints_barrier)

# Initialize the solver
solver = LocalIKSolver(mjx_model)

# Initializing initial condition
q0 = np.zeros(7)

# Initialize solver data
solver_data = solver.init()

# jit-compiling solve and integrate 
solve_jit = jax.jit(solver.solve)
integrate_jit = jax.jit(integrate, static_argnames=["dt"])

# === Control loop ===
for t in np.arange(0, 5, 1e-2):
    # Changing problem and compiling it
    frame_task.target_frame = np.array([0.1 * np.sin(t), 0.1 * np.cos(t), 0.1, 1, 0, 0,])
    problem_data = problem.compile()

    # Solving the instance of the problem
    opt_solution, solver_data = solve_jit(q, solver_data, problem_data)

    # Integrating
    q = integrate_jit(
        mjx_model,
        q,
        opt_solution.v_opt,
        dt,
    )

Examples

The list of examples includes:

  1. Kuka iiwa local inverse kinematics (single item, vmap over desired trajectory)
  2. Kuka iiwa global inverse kinematics (single item, vmap over desired trajectory)
  3. Go2 batched squats example

Contributing

We are always open for the suggestions and contributions. For contribution guidelines, see the CONTRIBUTING.md file.

Acknowledgement

The repository was highly inspired by pink and mink. Both authors, Stéphane Caron and Kevin Zakka, deeply inspire me to study robotics and contribute to the open source. Without them, this repository would not exist.

Some utility functions in this code are taken from source code of MuJoCo MJX. Apart from being a wonderful tool for batched computations and ML, the source code is compact yet readable and informative, and I encourage everyone to take a look at it to learn a little bit more about physical simulations, jax, and MuJoCo in general.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mjinx-0.1.0-py3-none-any.whl (50.0 kB view details)

Uploaded Python 3

File details

Details for the file mjinx-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: mjinx-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 50.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for mjinx-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 ab99a5d6f1092d2b3c6b8113bd2fb534033568eddd94bc912d53e17bcf8ff0e5
MD5 7a11c3625ab4fc777c23b22456693970
BLAKE2b-256 63ee23eb6fd92436f334969d74643f6170e226b662e52a45593253f32253d40b

See more details on using hashes here.

Provenance

The following attestation bundles were made for mjinx-0.1.0-py3-none-any.whl:

Publisher: build.yml on based-robotics/mjinx

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page