Question

I am trying to do inverse kinematics for a serial chain of arbitrarily many links.

In the following paper, I have found an example for how to calculate the Jacobian matrix.

Entry (i, j) = v[j] * (s[i] - p[j])

where:

v[j] is the unit vector of the axis of rotation for joint j

s[i] is the position (int world coords?) of joint i

p[j] is the position (in world coords?) of joint j

The paper says that this works if j is a rotational joint with a single degree of freedom. But my rotational joints have no constraints on their rotation. What formula do I then want? (Or am I possibly misunderstanding the term "degree of freedom"?)

Was it helpful?

Solution

This question is old, but I'll answer anyway, as it is something I have thought about but never really gotten around to implement.

Rotational joints with no constraints are called ball joints or spherical joints; they have 3 degrees of freedom. You can use the formula in the tutorial for spherical joints also, if you parameterize each spherical joint in terms of 3 rotational (revolute) joints of one degree of freedom each.

For example: Let N be the number of spherical joints. Suppose each joint has a local transformation T_local[i] and a world transformation

T_world[i] = T_local[0] * ... * T_local[i]

Let R_world[i][k], k = 0, 1, 2, be the k-th column of the rotation matrix of T_world[i]. Define the 3 * N joint axes as

v[3 * j + 0] = R_world[i][0]
v[3 * j + 1] = R_world[i][1]
v[3 * j + 2] = R_world[i][2]

Compute the Jacobian J for some end-effector s[i], using the formula of the tutorial. All coordinates are in the world frame.

Using for example the pseudo-inverse method gives a displacement dq that moves the end-effector in a given direction dx.

The length of dq is 3 * N. Define

R_dq[j] = 
    R_x[dq[3 * j + 0]] *
    R_y[dq[3 * j + 1]] *
    R_z[dq[3 * j + 2]]

for j = 0, 1, ..., N-1, where R_x, R_y, R_z are the transformation matrices for rotation about the x-, y-, and z-axes.

Update the local transformations:

T_local[j] := T_local[j] * R_dq[j]

and repeat from the top to move the end-effector in other directions dx.

OTHER TIPS

Let me suggest a simpler approach to Jacobians in the context of arbitrary many DOFs: Basically, the Jacobian tells you, how far each joint moves, if you move the end effector frame in some arbitrarily chosen direction. Let f(θ) be the forward kinematics, where θ=[θ1,...,θn] are the joints. Then you can obtain the Jacobian by differentiating the forward kinematics with respect to the joint variables:

Jij = dfi/dθj

is your manipulator's Jacobian. Inverting it would give you the inverse kinematics with respect to velocities. It can still be useful though, if you want to know how far each joint has to move if you want to move your end effector by some small amount Δx in any direction (because on position level, this would effectively be a linearization): Δθ=J-1Δx
Hope that this helps.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top