To construct the kinematics file, we used the following procedure from Robert Schilling's Fundamentals of Robotics: Analysis and Control:

0.
Number the joints from
1 to n
starting with the base and ending with the tool yaw, pitch, and roll,
in that order.

1. Assign a right-handed orthonormal coordinate frame L_{0 }to
the robot base, making sure that z^{0}^{ }aligns
to the axis of joint 1. Set k = 1.

2. Align z^{k}^{
}with the axis of joint k + 1.

3. Locate the origin of L_{k
}at the intersection of the z^{k}^{
}and z^{k+1}^{
}axes. If they do not intersect, use the
intersection of z^{k}^{
}witha common normal between z^{k}^{
}and z^{k-1}.

4. Select x^{k}^{
}to be orthogonal to both z^{k}^{
}and z^{k-1}.
If z^{k}^{
}and z^{k-1}
are parallel, point x^{k}^{
}away from z^{k-1}.

5. Select y^{k}^{
}to form a right-handed orthonormal coordinate
frame L_{k}.

6. Set k = k+1. If k < n, go to step 2; else, continue.

7. Set the origin of L_{n
}at the tool tip. Align z^{n}^{
}with the approach vector, y^{n}^{
}with the sliding vector, and x^{n}^{
}with the normal vector of the tool. Set k = 1.

8. Locate point b^{k}^{
}at the intersection of the x^{k}^{
}and z^{k}^{-1
}axes. If they do not intersect, use the
intersection of x^{k}^{
}with a common normal between x^{k}^{
}and z^{k}^{-1 }.

9. Compute Θ_{k }as
the angle of rotation from x^{k-1}^{
}to x^{k}^{
}measured about
z^{k}^{-1 }.

10. Compute d_{k }as
the distance from the origin of frame L_{k-1 }to
point b^{k}^{
}measured along z^{k}^{-1 }.

11. Compute a_{k }as
the distance from point b^{k}
to the origin of frame L_{k }measured
along x^{k}^{ }.

12. Compute α_{k }as
the angle of rotation from z^{k}^{-1
}to z^{k
}measured about x^{k}^{ }.

13. Set k = k+1. If k ≤ n, go to step 8; else, stop.

1. Assign a right-handed orthonormal coordinate frame L

2. Align z

3. Locate the origin of L

4. Select x

5. Select y

6. Set k = k+1. If k < n, go to step 2; else, continue.

7. Set the origin of L

8. Locate point b

9. Compute Θ

10. Compute d

11. Compute a

12. Compute α

13. Set k = k+1. If k ≤ n, go to step 8; else, stop.

(Schilling, page 54)

We followed this procedure and ended up with a kinematics file where each entry resembles the following:

[Arm_LINK3]The basic parameters are obvious from the Denavit-Hartenburg procedure from Schilling's book. However, Tekkotsu adds a few other notable fields.

joint_type: 0

immobile: 0

theta: -1.570796326794895

d: 0.0

a: 154.0

alpha: 0.0

theta_min: -1.570796326794895

theta_max: 1.570796326794895

m: 0.0

cx: 0.0

cy: 0.0

cz: 0.0

Ixx: 0.0

Ixy: 0.0

Ixz: 0.0

Iyy: 0.0

Iyz: 0.0

Izz: 0.0

tekkotsu_output: 2

- joint_type is 0 for a rotational joint and 1 for a prismatic joint (such as the arm's gripper).
- theta_min and theta_max are additive offsets from theta. We believed that they were also limits for the maximum joint values for the kinematics solver in ROBOOP, but to our dismay, we discovered that this was not the case.
- tekkotsu_output corresponds to a motor entry specified elsewhere in Tekkotsu.

Regardless, forward kinematics were functional if we were to assume that our arm existed in a perfect world where the servos were always where we told them to be. It was the best that we could possibly do.