C# Dynamic IK (Inverse Kinematics) Library
Budget: $30 – $250 CAD
As a roboticist with a specific robotic system in mind, I am seeking a C# dynamic Inverse Kinematics (IK) solver class. The class will use Cyclic Coordinate Descent to return the joint angles that position the end effector at the target position in 3D cartesian space. The input for the solver method will accept the joint parameters in a chain (length in MM, angle in degrees, rotation axis) as a parameter. The count of joints in the chain will be dynamic.
Here is an example of a Joint definition.
public class Joint {
public enum JointRotationAxisEnum {
X,
Y,
Z
}
// The axis that this joint can rotate
public JointRotationAxisEnum JointRotationAxis { get; set; }
// The length of this joint to the next (or end effector if it's the last joint in the chain)
public float LengthMM { get; set; }
// The current angle of this joint
public float AngleDegrees { get; set; }
}
For example, a generic 3 DOF robot arm may have this joint definition.
var joints = new List<Joint>();
// The first joint is a rotation that rotates the arm clockwise, counter clockwise
joints.Add(new Joint() { LengthMM = 0, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Z });
// The second joint is the first Y axis joint that raises and lowers the robot arm
joints.Add(new Joint() { LengthMM = 50, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Y });
// The third joint is a the second Y axis joint that is like an elbow of the arm, also raising and loweirng
joints.Add(new Joint() { LengthMM = 50, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Y });
The library you will create will have a public SolveIK() method that accepts the list of Joints and the target 3D cartesian coordinate of the end effector as parameters.
IE...
var target = new Vector3(5, 0, 10);
bool success = IKF.Solve(joints, target);
The response of IKF.Solve() will be whether or not the end effector target position was successfully achieved.
Here is an example of a Joint definition.
public class Joint {
public enum JointRotationAxisEnum {
X,
Y,
Z
}
// The axis that this joint can rotate
public JointRotationAxisEnum JointRotationAxis { get; set; }
// The length of this joint to the next (or end effector if it's the last joint in the chain)
public float LengthMM { get; set; }
// The current angle of this joint
public float AngleDegrees { get; set; }
}
For example, a generic 3 DOF robot arm may have this joint definition.
var joints = new List<Joint>();
// The first joint is a rotation that rotates the arm clockwise, counter clockwise
joints.Add(new Joint() { LengthMM = 0, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Z });
// The second joint is the first Y axis joint that raises and lowers the robot arm
joints.Add(new Joint() { LengthMM = 50, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Y });
// The third joint is a the second Y axis joint that is like an elbow of the arm, also raising and loweirng
joints.Add(new Joint() { LengthMM = 50, AngleDegrees = 0, JointRotationAxis = Joint.JointRotationAxisEnum.Y });
The library you will create will have a public SolveIK() method that accepts the list of Joints and the target 3D cartesian coordinate of the end effector as parameters.
IE...
var target = new Vector3(5, 0, 10);
bool success = IKF.Solve(joints, target);
The response of IKF.Solve() will be whether or not the end effector target position was successfully achieved.