Actin  Version 5.5.5
Software for Robotics Simulation and Control
Configuring Closed Kinematic Chains

Actin can control manipulators with closed kinematic chains by using EcEndEffector constraints. The physical EcIndividualManipulator must be structured as a branching kinematic chain. Some common use cases include controlling 4 bar linkage mechanisms, 4 bar slider mechanisms, and ball joints. These can be combined into many complicated robot types, including delta robots.

Best Practices for Model Structure

When creating the manipulator using the CAD converter or any other method, the manipulator must be composed of multiple branches which will ultimately reconnect later using EcEndEffector constraints. When configuring the links and their parent/child relationships, it is important that there are joints where the mechanism will be actuated by motors, servos, or pistons. This is important because the Actin control system limits the velocity of the driven joints, and if a driven joint is not actually a "joint", but held together with an end effector for example, then the rotational velocity of that "joint" will not be limited.

The model tree structure is defnined when creating the manipulator using the SolidWorks converter, or when programmatcally creating the manipulator with C++.

SWTreeStruct.png

Below is an example of a correct configuration (there may be many correct configurations). Note that the end links of each internal branch do not connect at a "driven" joint.

CorrectBranching.png
Correct Branching

Below is an example of an incorrect configuration.

IncorrectBranching.png
Incorrect Branching

Note that one the "driven" joints with a motor is not actually a joint and it's at the end of a branch. This does not allow for joint velocity limiting at that joint, which is important for end effector control.

Configuring Relative End Effectors

To close a kinematic chain in the Actin control system, EcEndEffector constraints are used to connect the branches of the chain.

The EcEndEffector is defined relative to the link that it should be "fixed" to. The EcEndEffector may have an offset from the primary frame of the link to define what point is fixed on the other link. If the constrained point is on the primary frame, the offset is not required. Setting the primary frame of the link at the location of where the link should connect, is a way to make constraint creation easier.

ConstraintDefine.png

The End Effector is constrained to solve for a specified "desired" or "goal" placement. In this case the placment is defined relative to primary frame of the "relative" link. This desired goal placement can be stored in the end effector itself, and ignore any other set desired end effector placements which may come from moving the mouse dragger, using the jogging interface, or commanded from a script.

To configure the end effector to store a "fixed" goal placement, go into the end effector setting and specify "set allow changing desired placment" to 0.

AllowChangeDesired.png

These EcEndEffectors should exist in all the end effector sets, including the joint control end effector set. If there is an end effector set that does not contain these constraints, the chains will come apart if that end effector set becomes active.

In cases where the links form a 4 bar linkage, an EcXyEndEffector is used. In this case, there are 2 joint degrees of freedom on the branch up to where it connects with the main branch.

Notice that the closed chains are solved as the Frame EE is moved

Individual closed chain 4 bar linkages are constrained using relative EcXyEndEffectors, seen here with the gripper fingers" .

In cases where a ball joint is used, and there are 3 joint degrees of freedom on the branch up to where it connects with the main branch a EcPointEndEffector can be used.

Here, the ball joints have a point end effector constrained relative to the "platform" .

Sometimes it may also be required to use a EcFreeSpinInZ end effector, if there are 5 joint degrees of freedom on the branch up to where it connects with another branch. This is common in 5 DOF delta robots.

It may also be the case that you require an internal constraint that doesnt seem to fit with any existing constraint. In this case, the EcGeneralSpatialEndEffector can be used to constraint 1 to 6 DOF in a confgurable way. For example, if you wish to constraint the X rotation relative to another link.

Configuring the Coordinated Joint End Effectors

The default EcCoordinatedJointEndEffector is generated to include all the joints in the manipulator. Configuring the Coordinated Joint End Effector set for joint level control involves removing any joint that isnt actually driven from the EcCoordinatedJointEndEffector.

Note that the closed chains are still handled when jogging the joints using the Joint Control EE set .

The EcEndEffectors should be copied from other ee sets into the Joint Control EE Set.

Passive Joint Setup

Any joint that is not driven by a motor should not contribute to the joint rate filter, which prevents the end effectors from driving the joints past a certain velocity. To configure this, we set a very high joint velocity limit, so it will not contribute to the end effector speed. To do this, go to Edit -> Advanced -> Joint Configuration.

AdvJointConfig.png

From here you can set the joint velocity limits to a very high value such as 1e300 radians/second.

MaxJointSpeed.png

Optionally you can also check the box for "is constrained". This will hide these joints from the manipulator configuration dialog slider table.

Delta Robot Approach

These methods can be used to constrain complicated robot mechanisms including delta type robots.

DeltaTogether.png

These can get very complicated. For example, this 5 DOF robot acually has 23 joints! which requires 18 defrees of constraint to properly configure the kinematics. Here you can see all the joints moved to show complexity.

DeltaBlownUp.png

In this case we have a number of internal relative constraints.

This totals 18 degrees of constraint, allowing for 5 degrees of freedom at the tool mount.

First we have 3x EcXyEndEffectors which constrain the 4 bar linkages on each of the 3 branches.

xy4BarExample.png

These EcXyEndEffectors are on each long link, relative to the "pivot link".

relativePivot.png

The "coupling" rotates on a joint with its parent link at one of the pivot links. The other 2 pivot links are at the end of their respective branches and need to be constrained relative to the coupling using point end effectors, because they each have 3 DOF up to the coupling (if you include the 4 bar linkages mentioned previously).

relativePointCoupling.png

There are 7 links and 6 joints that start from the base link and go to the tool mount. The 6th link down should be constrained with a EcFreeSpinInZEndEffector relative to the coupling link. This constrains 5 degrees of freedom. This allows it to be fully constrained minus the rotation within the coupling at the bearing.

FreeSpinCoupling.png

The last peice to be constrained is the x rotation (pitch) of the coupling, relative to the base.

generalSpatialRelToBase.png

There are many other configurations of delta robots, but these approaches will apply to many other types of robots.

Delta Robot Example

Intialization Considerations

When deploying Actin as part of a system to simulate or control a mechanism with a closed kinematic chain, care must be taken to intialize the manipulator from the known joint values. Simple manipulators with open branches can simply map the initial joint position state read from the encoders on the hardware to the state of the manipulator. With closed chains we don't have this luxury.

Generally this initialization involves solving for the initial state of all the joints given a known subset of joint positions. One way to initialize the state from the known joint positions, is to use an EcEndEffectorSet that constrains only the driven joints. In many cases this can also be the coordinated joint control end effector set.

To do this, set the desired placement in the joint control end effector, and calculate state until it has converged. This resulting state can be used to initialize the model.