Skip to main content

Online Trajectory Generation. Real-time. Time-optimal. Jerk-constrained.

Project description

Ruckig

Online Trajectory Generation. Real-time. Time-optimal. Jerk-constrained.

CI Issues Releases LGPL

Ruckig calculates a time-optimal trajectory given a target waypoint with position, velocity, and acceleration starting from any initial state limited by velocity, acceleration, and jerk constraints. Ruckig is a more powerful and open-source alternative to the Reflexxes Type IV library. In fact, Ruckig is the first Type V trajectory generator and even supports directional velocity and acceleration limits, while also being faster on top. For robotics and machining applications, Ruckig allows both instant reactions to unforeseen events as well as simple offline trajectory planning.

Installation

Ruckig has no dependencies (except for testing). To build Ruckig using CMake, just run

mkdir -p build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make

To install Ruckig in a system-wide directory, use (sudo) make install. An example of using Ruckig in your CMake project is given by examples/CMakeLists.txt. However, you can also include Ruckig as a directory within your project and call add_subdirectory(ruckig) in your parent CMakeLists.txt. A Python module can be built using the BUILD_PYTHON_MODULE CMake flag.

Tutorial

Furthermore, a tutorial will explain the basics to include online generated trajectories within your application. A working example can be found in the examples directory. A time-optimal trajectory for a single degree of freedom is shown in the figure below.

Trajectory Profile

Waypoint-based Trajectory Generation

Ruckig provides three main interface classes: the Ruckig, the InputParameter, and the OutputParameter class.

First, you'll need to create a Ruckig instance with the number of DoFs as a template parameter, and the control cycle (e.g. in seconds) in the constructor.

Ruckig<6> ruckig {0.001}; // Number DoFs; control cycle in [s]

The input type has 3 blocks of data: the current state, the target state and the corresponding kinematic limits.

InputParameter<6> input; // Number DoFs
input.current_position = {0.2, ...};
input.current_velocity = {0.1, ...};
input.current_acceleration = {0.1, ...};
input.target_position = {0.5, ...};
input.target_velocity = {-0.1, ...};
input.target_acceleration = {0.2, ...};
input.max_velocity = {0.4, ...};
input.max_acceleration = {1.0, ...};
input.max_jerk = {4.0, ...};

OutputParameter<6> output; // Number DoFs

Given all input and output resources, we can iterate over the trajectory at each discrete time step. For most applications, this loop must run within a real-time thread and controls the actual hardware.

while (ruckig.update(input, output) == Result::Working) {
  // Make use of the new state here!

  input.current_position = output.new_position;
  input.current_velocity = output.new_velocity;
  input.current_acceleration = output.new_acceleration;
}

During your update step, you'll need to copy the new kinematic state into the current state. If the current state is not the expected, pre-calculated trajectory, ruckig will calculate a new trajectory with the novel input. When the trajectory has reached the target state, the update function will return Result::Finished.

Input Parameter

To go into more detail, the InputParameter type has following members:

using Vector = std::array<double, DOFs>;

Vector current_position;
Vector current_velocity; // Initialized to zero
Vector current_acceleration; // Initialized to zero

Vector target_position;
Vector target_velocity; // Initialized to zero
Vector target_acceleration; // Initialized to zero

Vector max_velocity;
Vector max_acceleration;
Vector max_jerk;

std::optional<Vector> min_velocity; // If not given, the negative maximum velocity will be used.
std::optional<Vector> min_acceleration; // If not given, the negative maximum acceleration will be used.

std::array<bool, DOFs> enabled; // Initialized to true
std::optional<double> minimum_duration;

Interface interface; // The default position interface controls the full kinematic state.
Synchronization synchronization; // Synchronization behavior of multiple DoFs
DurationDiscretization duration_discretization; // Whether the duration should be a discrete multiple of the control cycle (off by default)

Members are implemented using the C++ standard array and optional type. Note that there are range constraints due to numerical reasons, see below for more details. To check the input before a calculation step, the ruckig.validate_input(input) method returns false if an input is not valid. Of course, the target state needs to be within the given kinematic limits. Additionally, the target acceleration needs to fulfil

Abs(target_acceleration) <= Sqrt(2 * max_jerk * (max_velocity - Abs(target_velocity)))

If a DoF is not enabled, it will be ignored in the calculation. A minimum duration can be optionally given. Furthermore, the minimum velocity and acceleration can be specified. If it is not given, the negative maximum velocity or acceleration will be used (similar to the jerk limit). For example, this might be useful in human robot collaboration settings with a different velocity limit towards a human. Or, the dynamic limits at a given configuration of the robot can be approximated much better with different acceleration limits.

Furthermore, there are some options for advanced functionality, e.g. for velocity control or discrete trajectory durations. We refer to the API documentation of the enumerations within the ruckig namespace for all available options.

Result Type

The update function of the Ruckig class returns a Result type that indicates the current state of the algorithm. Currently, this can either be working, finished if the trajectory has finished, or an error type if something went wrong during calculation. The result type can be compared as a standard integer.

State Error Code
Working 0
Finished 1
Error -1
ErrorInvalidInput -100
ErrorTrajectoryDuration -101
ErrorExecutionTimeCalculation -110
ErrorSynchronizationCalculation -111

Output Parameter

The output class gives the new kinematic state of the trajectory.

Vector new_position;
Vector new_velocity;
Vector new_acceleration;

bool new_calculation; // Whether a new calculation was performed in the last cycle
double calculation_duration; // Duration of the calculation in the last cycle [µs]

Trajectory trajectory; // The current trajectory
double time; // The current, auto-incremented time. Reset to 0 at a new calculation.

Moreover, the trajectory class has a range of useful parameters and methods.

double duration; // Duration of the trajectory
std::array<double, DOFs> independent_min_durations; // Time-optimal profile for each independent DoF

<...> at_time(double time); // Get the kinematic state of the trajectory at a given time
<...> get_position_extrema(); // Returns information about the position extrema and their times

Again, we refer to the API documentation for the exact signatures.

Tests and Numerical Stability

The current test suite validates over 1.000.000.000 random trajectories. The numerical exactness is tested for the final position and final velocity to be within 1e-8, for the velocity, acceleration and jerk limit to be within 1e-12, and for the final acceleration as well to be within a numerical error of 1e-12. The maximal supported trajectory duration is 7e3, which sounds short but should suffice for most applications seeking for time-optimality. Note that Ruckig will also output values outside of this range, there is however no guarantee for correctness.

Benchmark

We find that Ruckig is around twice as fast as Reflexxes Type IV and well-suited for control cycles as low as half a millisecond.

Benchmark

Development

Ruckig is written in C++17. It is continuously tested on ubuntu-latest, macos-latest, and windows-latest against following versions

  • Doctest v2.4 (only for testing)
  • Pybind11 v2.6 (only for python wrapper)

Citation

A publication is submitted ;)

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

ruckig-0.2.6.tar.gz (6.4 kB view details)

Uploaded Source

Built Distributions

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

ruckig-0.2.6-cp39-cp39-manylinux2010_x86_64.whl (419.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

ruckig-0.2.6-cp39-cp39-macosx_10_15_x86_64.whl (351.7 kB view details)

Uploaded CPython 3.9macOS 10.15+ x86-64

ruckig-0.2.6-cp38-cp38-manylinux2010_x86_64.whl (419.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

ruckig-0.2.6-cp38-cp38-macosx_10_15_x86_64.whl (351.7 kB view details)

Uploaded CPython 3.8macOS 10.15+ x86-64

ruckig-0.2.6-cp37-cp37m-manylinux2010_x86_64.whl (419.2 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

ruckig-0.2.6-cp37-cp37m-macosx_10_15_x86_64.whl (338.8 kB view details)

Uploaded CPython 3.7mmacOS 10.15+ x86-64

ruckig-0.2.6-cp36-cp36m-manylinux2010_x86_64.whl (418.9 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

ruckig-0.2.6-cp36-cp36m-macosx_10_15_x86_64.whl (338.7 kB view details)

Uploaded CPython 3.6mmacOS 10.15+ x86-64

File details

Details for the file ruckig-0.2.6.tar.gz.

File metadata

  • Download URL: ruckig-0.2.6.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6.tar.gz
Algorithm Hash digest
SHA256 8c5b1fb85d87eae678a9ed42e2194eb4acd8900b048cceded362ed63efbe561a
MD5 9144239826f0cf5476be05f686342f2a
BLAKE2b-256 dc86c2d2b7b4ddbf47415e84e85f02c1613ab29ccbbc34a29178ee8d564fff92

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp39-cp39-manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 419.4 kB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f1fd24fa1c0974078836854a47a7e4db98ed6be119cadaec0b44fb142fd1c09a
MD5 a2aaf9abcfb731d6aa21ba878e95f1e7
BLAKE2b-256 8e2627bfe836d55116adee33aeb81b2dd38af5fddd9a6f9dc93347ce65e2053c

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp39-cp39-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp39-cp39-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 351.7 kB
  • Tags: CPython 3.9, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.9.2

File hashes

Hashes for ruckig-0.2.6-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 c91914dae34016e3e6eb70a46d617bc576890fb4f310b865e3dacd62370a4e09
MD5 2091f1fed1ba3d2d1dcbd03e02685f3f
BLAKE2b-256 44f54d516e9bbd310a92967ff415a6e5a9c53b60578ea5baa1646887cd94a09d

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp38-cp38-manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 419.1 kB
  • Tags: CPython 3.8, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 ca94fcf2b76c6d5bb647e3ad3b8e11ffe3ddf1857a134cbaa555e5adba095717
MD5 fc4b8e19e9f189876beb2fb12b074caa
BLAKE2b-256 8c55aa45b26ea55c4fd8c3c1a926ebf77c2e55fc8fa7cabfdc1f232688ba3af1

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp38-cp38-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp38-cp38-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 351.7 kB
  • Tags: CPython 3.8, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 94a15824bfe384dbc804de92b9976de7155208d57a3d16bf4a6da5b14c5d454e
MD5 5fd08883c184e3bb2549184492b09c0d
BLAKE2b-256 f99cc536933fbe2c4b3f27e89c84ab430d41e1cfcb625f1467240467c38eebdb

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp37-cp37m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 419.2 kB
  • Tags: CPython 3.7m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 cc915810ca306d5ca9d2435393d459bb0711284038379a41f369132fa599dc13
MD5 2c2ed20116df32176f9b9c0fd43d9884
BLAKE2b-256 008d158f6c0b9ec2b824b114da4aeeb4b9a75bb61826758149a41665013dec8b

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp37-cp37m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp37-cp37m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 338.8 kB
  • Tags: CPython 3.7m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.7.10

File hashes

Hashes for ruckig-0.2.6-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 265993e3482fc6ecbedf30a8743d7299d500bc5731bcd5698714c97178df0bb9
MD5 7f76a491eae78aa85f04b399f01df2cb
BLAKE2b-256 985c19c8282e385617c899a99eb23985310b0f5fff90662bd3a201decdd900f9

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp36-cp36m-manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 418.9 kB
  • Tags: CPython 3.6m, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.8.8

File hashes

Hashes for ruckig-0.2.6-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 4e1836f899736f43c43b7a6dac3cd76a144ee8f1e3c6ad6bfeab50ca81ce9b58
MD5 cdf4d4dc5e3b6b008c59a1544f1778f3
BLAKE2b-256 4f5ee235fb1084749513c12cdee282f23b59086f2fd6dccb9fcae806c493ea34

See more details on using hashes here.

File details

Details for the file ruckig-0.2.6-cp36-cp36m-macosx_10_15_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.6-cp36-cp36m-macosx_10_15_x86_64.whl
  • Upload date:
  • Size: 338.7 kB
  • Tags: CPython 3.6m, macOS 10.15+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/3.9.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.59.0 CPython/3.6.13

File hashes

Hashes for ruckig-0.2.6-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 25e9a15df89fd527c73660f313fd9b6b09f38ed83c6c452b89ce382ff8f22306
MD5 48e12dce8bd763b05ea2be887194a759
BLAKE2b-256 77c781d2e80ca61debb1fd16f9142b6d7fb42fad81a5d573f596d6d4967a1d2d

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