# Articles & Tutorials

## Franka-Emika Panda kinematics and singularities

The FE Panda is an increasingly popular robot for research and teaching.  It has 7 joints which make it a redundant robot, that is, it has more joints than it needs to achieve an arbitrary position and orientation in the Cartesian workspace.

Its kinematic parameters are described on this web page in terms of modified Denavit-Hartenberg parameters.

## Forward and inverse kinematics

Using the Robotics Toolbox for MATLAB, and for a nominal position (0.4, 0, 0.6) m and with the tool pointing straight down, we can solve the inverse kinematics numerically and show that the solution is valid

``````>> mdl_panda
>> T=transl(0.4, 0, 0.6)*trotx(pi)
T =
1.0000         0         0    0.4000
0   -1.0000         0         0
0         0   -1.0000    0.6000
0         0         0    1.0000

>> q = panda.ikine(T)
q =
0.0000    1.0323    0.0000    0.8247    0.0000    0.2076    0.0000

>> panda.fkine(q)
ans =
1         0   -0.0000       0.4
0        -1         0         0
-0.0000         0        -1       0.6
0         0         0         1``````

## Singularities

If the robot is vertical as shown in this figure

then joints 1, 3 and 5 would be aligned and the robot would lose two DoF, leaving it with just 5 DoF and incapable of certain motion. We can see this in the Jacobian where columns 1, 3 and 5 are the same.

``````>> J = panda.jacob0([0 0 0 0 0 0 0])
J =
0.0000    0.4830    0.0000   -0.1670    0.0000    0.2170         0
0.0880    0.0000    0.0880    0.0000    0.0880    0.0000         0
-0.0000   -0.0880         0    0.0055         0    0.0880         0
0         0         0         0         0         0         0
0.0000    1.0000         0   -1.0000         0   -1.0000   -0.0000
1.0000    0.0000    1.0000    0.0000    1.0000    0.0000   -1.0000

>> rank(J)
ans =
5

>> jsingu(J)
2 linearly dependent joints:
q3 depends on: q1
q5 depends on: q1 ``````

However, the robot is incapable of adopting this pose, joint 4 has a motion limit of -4 degrees off vertical (so the figure above is a little bit misleading)

``````>> J = panda.jacob0(qv)
J =
0.0000    0.4822    0.0000   -0.1662    0.0000    0.2226         0
0.0996    0.0000    0.0996    0.0000    0.0880    0.0000         0
-0.0000   -0.0996   -0.0000    0.0171   -0.0000    0.0726         0
-0.0000   -0.0000   -0.0000    0.0000    0.0698    0.0000   -0.0698
0    1.0000         0   -1.0000   -0.0000   -1.0000   -0.0000
1.0000    0.0000    1.0000    0.0000    0.9976    0.0000   -0.9976

>> rank(J)
ans =
6``````

which means that the robot has 6DoF and is not singular. We have lost only the redundant DoF.

View all posts