Skip to main content

Python port of SPART: dynamics and control toolkit for free-flyer space robots

Reason this release was yanked:

Update naming conventions for consistency

Project description

SPARTpy

SPARTpy is the Python interface to SPART, an open-source toolkit for modeling and controlling floating-base space robots. It wraps MATLAB Coder-generated C functions via ctypes, delivering kinematics, differential kinematics, velocities, accelerations, and forward/inverse dynamics at speeds faster than native MATLAB execution, for use within Robotics/AI projects within Python.

Installation

pip install spartpy

The package ships the MATLAB Coder-generated C sources. On the first import on a new machine, gcc is invoked automatically to compile them into a shared library (SPART_C.so). Requires gcc with OpenMP support:

sudo apt install gcc   # Debian / Ubuntu

Dependencies

  • Python ≥ 3.8
  • NumPy
  • SciPy (optional — needed for trajectory integration)
  • yourdfpy / matplotlib (optional — needed for visualisation)

Building / Rebuilding the C Back-end

SPARTpy calls MATLAB Coder-generated C code through ctypes. The compiled shared library (SPART_C.so) is rebuilt automatically on first import whenever it is missing or out of date. Two system libraries must be present for this to work:

1. gcc with OpenMP

Used to compile SPART_C.so from the bundled .c sources:

# Debian / Ubuntu
sudo apt install gcc

# Conda (if preferred)
conda install -c conda-forge gcc

2. Intel OpenMP runtime (libiomp5.so)

The .so was generated by MATLAB Coder, which links against Intel OpenMP. The library is searched automatically in the following order:

  1. Any MATLAB installation under /usr/local/MATLAB/R*/sys/os/glnxa64/
  2. System paths: /usr/lib/x86_64-linux-gnu/libiomp5.so, /usr/lib/libiomp5.so, /usr/local/lib/libiomp5.so
  3. $MATLAB_ROOT/lib/libiomp5.so

If none of those exist, install it via conda or the Intel package:

conda install -c intel openmp
# or
sudo apt install intel-mkl          # ships libiomp5

Alternatively, add the directory containing libiomp5.so to LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=/path/to/dir/containing/libiomp5:$LD_LIBRARY_PATH

3. tmwtypes.h (build-time only)

The C sources include tmwtypes.h, a MATLAB Coder header. A copy is shipped alongside the .c files in the package, so no MATLAB installation is required at build time. If for any reason it is missing, the build logic searches for a MATLAB installation and copies it automatically. You can also force it by setting:

export MATLAB_ROOT=/usr/local/MATLAB/R2024b

When is a rebuild triggered?

The build is triggered automatically if:

  • SPART_C.so does not exist (e.g. first install on the machine)
  • SPART_C.so is older than any .c source file (sources were updated)
  • Loading the existing .so raises an OSError (e.g. wrong architecture)

Quick Start

import os
import numpy as np
from SPARTpy import SPART

# Load a URDF model
urdf = os.path.join('URDF_models', 'floating_7dof_manipulator.urdf')
spart = SPART(urdf)

# Robot state
R0    = np.eye(3)                                          # base orientation (DCM)
r0    = np.array([0., 0., 0.])                            # base position [m]
qm    = np.deg2rad([30., 20., 30., 20., 30., 20., 30.])  # joint angles [rad]
u0    = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])        # base twist [m/s, rad/s]
um    = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])   # joint rates [rad/s]
u0dot = np.zeros(6)   # base acceleration
umdot = np.zeros(7)   # joint acceleration
wF0   = np.zeros(6)   # external wrench on base
wFm   = np.zeros((6, spart.robot.n_links_joints))  # external wrenches on links

# Kinematics
RJ, RL, rJ, rL, e, g = spart.kinematics(R0, r0, qm)

# Differential kinematics
Bij, Bi0, P0, pm = spart.diff_kinematics(R0, r0, rL, e, g)

# Velocities
t0, tL = spart.velocities(Bij, Bi0, P0, pm, u0, um)

# Inertias in inertial frame
I0, Im = spart.i_i(R0, RL)

# Accelerations
t0dot, tLdot = spart.accelerations(t0, tL, P0, pm, Bi0, Bij, u0, um, u0dot, umdot)

# Inverse dynamics
tau0, taum = spart.inverse_dynamics(wF0, wFm, t0, tL, t0dot, tLdot, P0, pm, I0, Im, Bij, Bi0)

# Forward dynamics
u0dot_out, umdot_out = spart.forward_dynamics(
    tau0, taum, wF0, wFm, t0, tL, P0, pm, I0, Im, Bij, Bi0, u0, um)

# Trajectory integration (requires scipy)
from scipy.integrate import solve_ivp

tau0_traj = np.zeros((6, 1))                         # no base torque
taum_traj = np.array([2., 1., 0.5, 0., 0., 0., 0.]) # joint torques [Nm]

_, y0, tau_ode = spart.space_robot_ode_input(
    0.0, R0, r0, np.zeros(6), qm, np.zeros(7), tau0_traj, taum_traj)

sol = solve_ivp(
    fun=lambda t, y: spart.space_robot_ode(t, y, tau_ode),
    t_span=(0.0, 10.0), y0=y0, method='RK45', max_step=0.05)

# Animate result (requires yourdfpy or matplotlib)
spart.animate_trajectory(sol.t, sol.y.T, fps=30, backend='matplotlib')

Available Functions

Method Description
kinematics(R0, r0, qm) Joint/link poses, joint axes and CoM positions
diff_kinematics(R0, r0, rL, e, g) Jacobian-related matrices Bij, Bi0, P0, pm
velocities(Bij, Bi0, P0, pm, u0, um) Spatial velocities of base and links
i_i(R0, RL) Inertia tensors expressed in the inertial frame
accelerations(t0, tL, P0, pm, Bi0, Bij, u0, um, u0dot, umdot) Spatial accelerations
inverse_dynamics(wF0, wFm, t0, tL, t0dot, tLdot, P0, pm, I0, Im, Bij, Bi0) Generalised forces from motion
forward_dynamics(tau0, taum, wF0, wFm, t0, tL, P0, pm, I0, Im, Bij, Bi0, u0, um) Accelerations from forces
space_robot_ode(t, y, tau) ODE right-hand side for scipy.integrate.solve_ivp
animate_trajectory(t, Y, fps, backend) Visualise a trajectory (matplotlib or yourdfpy)
benchmark(n_runs) Time all functions and print a summary table

License

BSD 3-Clause. See LICENSE.md.

Project details


Download files

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

Source Distribution

spartpy-1.0.2.tar.gz (118.3 kB view details)

Uploaded Source

Built Distribution

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

spartpy-1.0.2-py3-none-any.whl (131.4 kB view details)

Uploaded Python 3

File details

Details for the file spartpy-1.0.2.tar.gz.

File metadata

  • Download URL: spartpy-1.0.2.tar.gz
  • Upload date:
  • Size: 118.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for spartpy-1.0.2.tar.gz
Algorithm Hash digest
SHA256 7b3a2c45e9f145875f7193a72e4bd9c831e070f678a7335a716851d69cb818b4
MD5 3dceb814407de7c6715f68b9cf47f6d9
BLAKE2b-256 ceb6616833f7056632c27b1de507aa8344f8dba1a801b2dfab70fd7b38ebb9d6

See more details on using hashes here.

File details

Details for the file spartpy-1.0.2-py3-none-any.whl.

File metadata

  • Download URL: spartpy-1.0.2-py3-none-any.whl
  • Upload date:
  • Size: 131.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.19

File hashes

Hashes for spartpy-1.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 df35b8bcb1dacd4a7332a5eca93fac42dd8e7c510e5bcc6280c0436325cd686c
MD5 d268585a521fa43db465445a99518384
BLAKE2b-256 265fe37169426888994ba2b1c6c86aa54acb71a28e80a11c2a9ac60ae969102a

See more details on using hashes here.

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