Instantaneous Motion Generation for Robots and Machines.
Port of ruckig to Structured Text, TwinCAT 3.
This repository ports pantor/ruckig to Structured Text to bring open-source powered Online-Trajectory-Generation to TwinCAT 3. Only the Community Version of Ruckig is ported and pro features are not available. Struckig itself is dual licenced, you can use the source code provided here accordingly to GPLv3. If you want to use this commercially and not disclose your own source code, Struckig is also available with a custom licence. In the latter case, contact me.
The original project,
ruckig is a submodule of this repository. The commit-hash reflects the commits that are ported already - I try to keep up with changes that are done in
Continuous integration & Documentation
This project is using zkbuild for continuous integration and zkdoc for generating the documentation. To run the tests manually, get a copy of TcUnit and activate the testing solution test\Struckig\Struckig_unittest.sln
Example: Create time-based profile for 1 axis
This examples shows how to create a single-axis trajectory from point A=0mm to point B=100mm.
The initial state assumes that the trajectory is in stillstand and target velocity and acceleration is set to
MinDuration parameter is set to
10s. Please not that
allow for a shorter travel time, but if
MinDuration together with Synchronization = SynchronizationType.TimeSync is set,
MinDuration parameter is considered instead.
PROGRAM Example VAR otg : Struckig.Otg(cycletime:=0.001, dofs:=1) := ( EnableAutoPropagate := TRUE, //< Automatically copies the new trajectory state to the current trajectory state with every otg() call Synchronization := SynchronizationType.TimeSync, //< Set to TimeSync, otherwise MinDuration is ignored MinDuration := 10.0, //< if MinDuration > 0 and Synchronization is set to TimeSync this sets the duration of the trajectory (if the other limitations would yields a shorter duration) MaxVelocity := [ 2000.0 ], MaxAcceleration := [ 20000.0 ], MaxJerk := [ 800000.0 ], CurrentPosition := [ 0.0 ], CurrentVelocity := [ 0.0 ], CurrentAcceleration := [ 0.0 ], TargetPosition := [ 100.0 ], TargetVelocity := [ 0.0 ], TargetAcceleration := [ 0.0 ] ); END_VAR // ===================================================================================================================== otg(); // axis.SetTargetPosition(otg.NewPosition); send the new position to your axis, which should be in a cyclic position mode // axis.SetVelocityOffset(otg.NewVelocity); send the new velocity to your axis, e.g. with a velocity feedforward // axis.SetTorqueOffset( accelerationTorqueFactor * otg.NewAcceleration) send the new acceleration to your acces, e.g. with a current feedforward
Note: Struckig supports motions with multiple degree of freedoms with the Otg function block. If you need to use only 1 degree of freedom you can also
utilize the specialized function block
Otg1. The latter function block uses single variables instead of arrays, which simplifies the usage a bit.