Ruckig 0.9.3
Motion Generation for Robots and Machines
Loading...
Searching...
No Matches
Example 14: Tracking of arbitrary signals with Velocity, Acceleration, and Jerk Limits

C++

// Only with Ruckig Pro
#include <cmath>
#include <iostream>
using namespace ruckig;
// Create the target state signal
TargetState<1> model_ramp(double t, double ramp_vel=0.5, double ramp_pos=1.0) {
const bool on_ramp = t < ramp_pos / std::abs(ramp_vel);
target.position[0] = on_ramp ? t * ramp_vel : ramp_pos;
target.velocity[0] = on_ramp ? ramp_vel : 0.0;
target.acceleration[0] = 0.0;
return target;
}
TargetState<1> model_constant_acceleration(double t, double ramp_acc=0.05) {
target.position[0] = t * t * ramp_acc;
target.velocity[0] = t * ramp_acc;
target.acceleration[0] = ramp_acc;
return target;
}
TargetState<1> model_sinus(double t, double ramp_vel=0.4) {
target.position[0] = std::sin(ramp_vel * t);
target.velocity[0] = ramp_vel * std::cos(ramp_vel * t);
target.acceleration[0] = -ramp_vel * ramp_vel * std::sin(ramp_vel * t);
return target;
}
int main() {
// Create instances: the Trackig OTG as well as input and output parameters
Trackig<1> otg {0.01}; // control cycle
// Set input parameters
input.current_position = {0.0};
input.current_velocity = {0.0};
input.current_acceleration = {0.0};
input.max_velocity = {0.8};
input.max_acceleration = {2.0};
input.max_jerk = {5.0};
// Optional minimum and maximum position
input.min_position = {-2.5};
input.max_position = {2.5};
otg.reactiveness = 1.0; // default value, should be in [0, 1]
// Generate the trajectory within the control loop
std::cout << "target | follow" << std::endl;
for (size_t t = 0; t < 500; t += 1) {
auto target_state = model_ramp(otg.delta_time * t);
auto res = otg.update(target_state, input, output);
std::cout << target_state.position[0] << " " << output.new_position[0] << std::endl;
output.pass_to_input(input);
}
}
int main()
Definition: 10_dynamic_dofs_waypoints.cpp:10
TargetState< 1 > model_constant_acceleration(double t, double ramp_acc=0.05)
Definition: 14_tracking.cpp:21
TargetState< 1 > model_sinus(double t, double ramp_vel=0.4)
Definition: 14_tracking.cpp:29
TargetState< 1 > model_ramp(double t, double ramp_vel=0.5, double ramp_pos=1.0)
Definition: 14_tracking.cpp:12
Input type of Ruckig.
Definition: input_parameter.hpp:36
Vector< double > current_velocity
Definition: input_parameter.hpp:76
std::optional< Vector< double > > max_position
Definition: input_parameter.hpp:93
Vector< double > current_acceleration
Definition: input_parameter.hpp:76
Vector< double > max_jerk
Definition: input_parameter.hpp:82
std::optional< Vector< double > > min_position
Definition: input_parameter.hpp:93
Vector< double > max_acceleration
Definition: input_parameter.hpp:82
Vector< double > max_velocity
Definition: input_parameter.hpp:82
Vector< double > current_position
Definition: input_parameter.hpp:76
Output type of Ruckig.
Definition: output_parameter.hpp:15
Vector< double > new_position
Definition: output_parameter.hpp:31
void pass_to_input(InputParameter< DOFs, CustomVector > &input) const
Definition: output_parameter.hpp:69
The kinematic target state for Trackig.
Definition: trackig.hpp:19
Vector< double > acceleration
Definition: trackig.hpp:28
Vector< double > position
Definition: trackig.hpp:26
Vector< double > velocity
Definition: trackig.hpp:27
The main interface for the Trackig algorithm.
Definition: trackig.hpp:61
Definition: block.hpp:12

Python

# Only with Ruckig Pro
from math import sin, cos
from pathlib import Path
from sys import path
# Path to the build directory including a file similar to 'ruckig.cpython-37m-x86_64-linux-gnu'.
build_path = Path(__file__).parent.absolute().parent / 'build'
path.insert(0, str(build_path))
from ruckig import Trackig, TargetState, InputParameter, OutputParameter
# Create the target state signal
def model_ramp(t, ramp_vel=0.5, ramp_pos=1.0):
target = TargetState(1)
on_ramp = t < ramp_pos / abs(ramp_vel)
target.position = [t * ramp_vel] if on_ramp else [ramp_pos]
target.velocity = [ramp_vel] if on_ramp else [0.0]
target.acceleration = [0.0]
return target
def model_constant_acceleration(t, ramp_acc=0.05):
target = TargetState(1)
target.position = [t * t * ramp_acc]
target.velocity = [t * ramp_acc]
target.acceleration = [ramp_acc]
return target
def model_sinus(t, ramp_vel=0.4):
target = TargetState(1)
target.position = [sin(ramp_vel * t)]
target.velocity = [ramp_vel * cos(ramp_vel * t)]
target.acceleration = [-ramp_vel * ramp_vel * sin(ramp_vel * t)]
return target
if __name__ == '__main__':
inp = InputParameter(1)
out = OutputParameter(inp.degrees_of_freedom)
otg = Trackig(inp.degrees_of_freedom, 0.01)
inp.current_position = [0.0]
inp.current_velocity = [0.0]
inp.current_acceleration = [0.0]
inp.max_velocity = [0.8]
inp.max_acceleration = [2.0]
inp.max_jerk = [5.0]
# Optional minimum and maximum position
inp.min_position = [-2.5]
inp.max_position = [2.5]
# otg.reactiveness = 1.0 # default value, should be in [0, 1]
print('\t'.join(['t'] + [str(i) for i in range(otg.degrees_of_freedom)]))
steps, target_list, follow_list = [], [], []
for t in range(500):
target_state = model_ramp(otg.delta_time * t)
steps.append(t)
res = otg.update(target_state, inp, out)
out.pass_to_input(inp)
print('\t'.join([f'{p:0.3f}' for p in target_state.position] + [f'{p:0.3f}' for p in out.new_position]) + f' in {out.calculation_duration:0.2f} [µs]')
target_list.append([target_state.position, target_state.velocity, target_state.acceleration])
follow_list.append([out.new_position, out.new_velocity, out.new_acceleration])
# Plot the trajectory
# import numpy as np
# import matplotlib.pyplot as plt
# follow_list = np.array(follow_list)
# target_list = np.array(target_list)
# plt.ylabel(f'DoF 1')
# plt.plot(steps, follow_list[:, 0], label='Follow Position')
# plt.plot(steps, follow_list[:, 1], label='Follow Velocity', linestyle='dotted')
# plt.plot(steps, follow_list[:, 2], label='Follow Acceleration', linestyle='dotted')
# plt.plot(steps, target_list[:, 0], color='r', label='Target Position')
# plt.grid(True)
# plt.legend()
# plt.savefig(Path(__file__).parent.absolute() / '13_trajectory.pdf')

Output Trajectory