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 to 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 for arbitrary target states 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.

More information can be found in the corresponding paper Jerk-limited Real-time Trajectory Generation with Arbitrary Target States, accepted for the Robotics: Science and Systems (RSS), 2021 conference.

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.

Ruckig is also available as a Python module, in particular for development or debugging purposes. It can be installed from PyPI via

pip install ruckig

When using CMake, the Python module can be built using the BUILD_PYTHON_MODULE flag. If you're only interested in the Python module (and not in the C++ library), you can build and install Ruckig via pip install ..

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 different synchronization behavior (i.a. phase or time synchonization).
  • for the control interface (position or velocity control).
  • for 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 5.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

@article{berscheid2021jerk,
  title={Jerk-limited Real-time Trajectory Generation with Arbitrary Target States},
  author={Berscheid, Lars and Kr{\"o}ger, Torsten},
  journal={Robotics: Science and Systems XVII},
  year={2021}
}

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.3.0.tar.gz (7.5 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.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (366.0 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

ruckig-0.3.0-cp39-cp39-macosx_10_15_x86_64.whl (289.0 kB view details)

Uploaded CPython 3.9macOS 10.15+ x86-64

ruckig-0.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (366.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

ruckig-0.3.0-cp38-cp38-macosx_10_15_x86_64.whl (288.9 kB view details)

Uploaded CPython 3.8macOS 10.15+ x86-64

ruckig-0.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (381.3 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

ruckig-0.3.0-cp37-cp37m-macosx_10_15_x86_64.whl (276.5 kB view details)

Uploaded CPython 3.7mmacOS 10.15+ x86-64

ruckig-0.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl (381.8 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

ruckig-0.3.0-cp36-cp36m-macosx_10_15_x86_64.whl (276.5 kB view details)

Uploaded CPython 3.6mmacOS 10.15+ x86-64

File details

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

File metadata

  • Download URL: ruckig-0.3.0.tar.gz
  • Upload date:
  • Size: 7.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.10

File hashes

Hashes for ruckig-0.3.0.tar.gz
Algorithm Hash digest
SHA256 bb8a761ceb0780c46b7d8e211e92ccf140b086d6bd857c38c2a3d177cbdef37c
MD5 a099988d0a032a687570500e9a343a08
BLAKE2b-256 065ac87090cbc54bcac28bbfa25c01564a0a02d5d160768714f329e0c04fd7c8

See more details on using hashes here.

File details

Details for the file ruckig-0.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • Upload date:
  • Size: 366.0 kB
  • Tags: CPython 3.9, manylinux: glibc 2.12+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.10

File hashes

Hashes for ruckig-0.3.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 f3eeac626c2d2bc04b586724179839b283f5e4d0d11312f0caab8e70ffde1cf8
MD5 657c8c7dbf330886d9160ee8b57658d7
BLAKE2b-256 87ea9b8244d0384c05624a1469deef9d06bce0688eccf30e0c723e715e33ba73

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruckig-0.3.0-cp39-cp39-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 2e36c297a7f75cc37df2a3cdb402b97c762a3a8899b60f718b6931fa2749ce73
MD5 5bf3582e2f653d99031aae6cdd72cd9e
BLAKE2b-256 0a100de042897ae9d8abd4f7632044b177ab0fea09bd2347dda4c1c1ae7b65f3

See more details on using hashes here.

File details

Details for the file ruckig-0.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

  • Download URL: ruckig-0.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
  • Upload date:
  • Size: 366.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/4.5.0 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.61.1 CPython/3.8.10

File hashes

Hashes for ruckig-0.3.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 feb57d097a554708ab23d7cda0f75095e2cd04a5f0b4774e811378158e72ed28
MD5 88e6836ab3d39eb3c025aa311d190ae4
BLAKE2b-256 458ff24384b662d4e198513626d32278ab791d7be500937806e82e5aa99b4c04

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruckig-0.3.0-cp38-cp38-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 ac0681155670f73fb6fadd9bd28c028419ab87844526f61a9ccb5c716ec954c1
MD5 8fabbf2217743ab1f57377a9445ef431
BLAKE2b-256 e6d8d2702531c3b77b04fa1e71e5f5d01eeb34fffa3298cebcd6646469c29121

See more details on using hashes here.

File details

Details for the file ruckig-0.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for ruckig-0.3.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 3b96664e5bcc8604173c6194b4a604066f6254edca1ae55e305b896364f84b56
MD5 b0cbba2fb9ea69dbbb7e8849ba6180f7
BLAKE2b-256 97ef5c26f2cc5b12babfb63c3ad29200ec09cf26f7787b23caf885c2736d1b1b

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruckig-0.3.0-cp37-cp37m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 b1238eb75feee77c631898622f64be6b11968ae4284f36b8e76c9cc74a1ee4f4
MD5 ee6a31dd34b74531f333ef5b7d3d1768
BLAKE2b-256 9b76da267e6defbeb595dde27e21a7b400883104b7e3723c2adec6820407e7f8

See more details on using hashes here.

File details

Details for the file ruckig-0.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl.

File metadata

File hashes

Hashes for ruckig-0.3.0-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 e45c8d0eadac47d45d96180463154ca1a34e620fdccf6856c5a94928351e3d0e
MD5 861a7a134867811adf7ea8ccb6b758c1
BLAKE2b-256 1140e2fe5a8b24de760f46f67001f61738a948b21889716513c48ab448ac49cf

See more details on using hashes here.

File details

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

File metadata

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

File hashes

Hashes for ruckig-0.3.0-cp36-cp36m-macosx_10_15_x86_64.whl
Algorithm Hash digest
SHA256 621f4aa5ecc32c68062ac45e90a22166f23327cc8d4a9e3b1f17fbbcb5977f98
MD5 90e3e79cbbcf0a62ea2a3158aac8bf87
BLAKE2b-256 b7c257c3748771221e11644e21b66514046213dcbcbd8e6fa2534aa5bd1cddea

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