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.1.tar.gz (6.3 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.1-cp39-cp39-manylinux2010_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.12+ x86-64

ruckig-0.2.1-cp39-cp39-manylinux1_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.9

ruckig-0.2.1-cp38-cp38-manylinux2010_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.12+ x86-64

ruckig-0.2.1-cp38-cp38-manylinux1_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.8

ruckig-0.2.1-cp37-cp37m-manylinux2010_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.7mmanylinux: glibc 2.12+ x86-64

ruckig-0.2.1-cp37-cp37m-manylinux1_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.7m

ruckig-0.2.1-cp36-cp36m-manylinux2010_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.6mmanylinux: glibc 2.12+ x86-64

ruckig-0.2.1-cp36-cp36m-manylinux1_x86_64.whl (82.1 kB view details)

Uploaded CPython 3.6m

File details

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

File metadata

  • Download URL: ruckig-0.2.1.tar.gz
  • Upload date:
  • Size: 6.3 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.1.tar.gz
Algorithm Hash digest
SHA256 11e09f57e9def6929235a01b7bedb10420fbccb0f78061b17b50aa6238c97196
MD5 71e1e0bfe29cf62a12c9f047e939ee9a
BLAKE2b-256 9dc8231ec66b3d79caccac653250cb25b0573be547e80812b8ee3cf20ec93d6c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruckig-0.2.1-cp39-cp39-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 82.1 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.1-cp39-cp39-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 1e2ad9fd50c8d752307302049a31727ad330710b8c20d77b97b7c687b96322af
MD5 e200267c4f7b7835f9339f9de97b307d
BLAKE2b-256 9047e78ac524929fd5340eb523c88eada51b5748ab3ed7341f1925bdc6721382

See more details on using hashes here.

File details

Details for the file ruckig-0.2.1-cp39-cp39-manylinux1_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.1-cp39-cp39-manylinux1_x86_64.whl
  • Upload date:
  • Size: 82.1 kB
  • Tags: CPython 3.9
  • 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.1-cp39-cp39-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 ce1311bfd6a7bb8bc71afd2d9311b5ee015175b0f2ee4615f3538bb540b3e073
MD5 0c54f59725c07f408aac620498405399
BLAKE2b-256 fa8398138339e7200f8ddef22a85e87da18b685fca76f9180881a379ee1059b6

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruckig-0.2.1-cp38-cp38-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 82.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.1-cp38-cp38-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 892c62e7dafcd6c4478c2553e46a2bd301b2e5c0416fcae9f07d10086b07f337
MD5 66690d813a374ec7960d6cb87badd0cd
BLAKE2b-256 ec858a8a68db39e6b6aba2bb06566b958616ea281682bc1faeb6cb6177ce35ab

See more details on using hashes here.

File details

Details for the file ruckig-0.2.1-cp38-cp38-manylinux1_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.1-cp38-cp38-manylinux1_x86_64.whl
  • Upload date:
  • Size: 82.1 kB
  • Tags: CPython 3.8
  • 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.1-cp38-cp38-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 41bd55bbf9f6d6ba1a02bd232d7697211995f96767c449a7ec6341a9361d99ac
MD5 d8c74e18d07a1ee80a787431b4241a60
BLAKE2b-256 9d7c1d5a8b67129cc5e0659bb7d4f3dd8ce128dd0a889b6639eceacdea9f4746

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruckig-0.2.1-cp37-cp37m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 82.1 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.1-cp37-cp37m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 154ce46e7614927e8d25ccd633059e80ef37a11e942b167bd9d39cb3b04e74b6
MD5 a4322a9a2dcdf108d972f33633d88b31
BLAKE2b-256 5afd1b0ce549a0a09f57228acab23f560f78b65e6e2246d1b885d5953f3a2dd7

See more details on using hashes here.

File details

Details for the file ruckig-0.2.1-cp37-cp37m-manylinux1_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.1-cp37-cp37m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 82.1 kB
  • Tags: CPython 3.7m
  • 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.1-cp37-cp37m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 56492921f29a0fce7657a599e41fc7183327fc792d491a1837f599667c89c9d8
MD5 c428f56d2b5a207a96ade83d2f1abc3e
BLAKE2b-256 856e381da4d6329b79fd8808b806cafd24e87e0db43d2af3f3fd88a2347b831b

See more details on using hashes here.

File details

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

File metadata

  • Download URL: ruckig-0.2.1-cp36-cp36m-manylinux2010_x86_64.whl
  • Upload date:
  • Size: 82.1 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.1-cp36-cp36m-manylinux2010_x86_64.whl
Algorithm Hash digest
SHA256 c11aa30817a216793417d8ae1aff27dc2f117ca1b4813c0a1bf6c2c94bd2cc12
MD5 ada806e97d7640e9947ed11186edf0e2
BLAKE2b-256 b3f5f712215a8b30fbd1aef4c267f86f15640d7d2e538a2d3f57bc45159f8136

See more details on using hashes here.

File details

Details for the file ruckig-0.2.1-cp36-cp36m-manylinux1_x86_64.whl.

File metadata

  • Download URL: ruckig-0.2.1-cp36-cp36m-manylinux1_x86_64.whl
  • Upload date:
  • Size: 82.1 kB
  • Tags: CPython 3.6m
  • 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.1-cp36-cp36m-manylinux1_x86_64.whl
Algorithm Hash digest
SHA256 2d8793e4bef352ad0e4f243655e9dcab8db81bfa206978c369232e90ce81f9d5
MD5 4fc82d65705f231a6a998c6ce867e8cf
BLAKE2b-256 ad011ccc1576f8a688869fcedc20bbed36f2a706e9f8eccbd741da6787bad802

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