# Difficulty using ikfast generator, "need 6 joints error" with Kuka Youbot

Hi,

I'm new to ikfast and I'm trying to understand it. I've been following the documentation here: http://moveit.ros.org/wiki/Kinematics/IKFast

I'm using a Kuka youbot urdf file which I converted to a .dae file.

When I do an --info links on my robot, I get the following:

base_footprint 0

## And when I look up the joints, I get: name index parents andy@andy-VirtualBox:~/catkin_ws/collada_files2\$ openrave0.8-robot.py youbot.dae --info joints name joint_index dof_index parent_link child_link mimic

Now, I apologize for my newness to the ikfast package, so I'm trying to understand exactly what this means. I assume a -1 means no dof is provided by the joint (so, it's fixed or something), and that each number 0 through 6 provides the cumulative dof at that joint.

Therefore, my understanding is that the correct 6DOF command to generate the IKSolver would be:

But I get the following error:

/usr/lib/python2.7/dist-packages/openravepy/_openravepy_0_8/ikfast.py:1122: RuntimeWarning: invalid value encountered in divide axisangle /= angle INFO: moved translation [0, 0, 13/100] to right end INFO: moved translation [0, 0, 19/1000] to left end INFO: moved translation on intersecting axis [0, 0, 0] to left INFO: [[1, 0, 0, 3/125],[0, 1, 0, 0],[0, 0, 1, 23/200]] INFO: [[cos(j0), -sin(j0), 0, 0],[sin(j0), cos(j0), 0, 0],[0, 0, 1, 0]] INFO: [[1, 0, 0, 33/1000],[0, 0, -1, 0],[0, 1, 0, 0]] INFO: [[cos(j1), -sin(j1), 0, 0],[sin(j1), cos(j1), 0, 0],[0, 0, 1, 0]] INFO: [[1, 0, 0, 0],[0, -1, 0, 31/200],[0, 0, -1, 0]] INFO: [[cos(j2), -sin(j2), 0, 0],[sin(j2), cos(j2), 0, 0],[0, 0, 1, 0]] INFO: [[1, 0, 0, 0],[0, -1, 0, -27/200],[0, 0, -1, 0]] INFO: [[cos(j3), -sin(j3), 0, 0],[sin(j3), cos(j3), 0, 0],[0, 0, 1, 0]] INFO: [[1, 0, 0, -1/500],[0, 0, 1, 0],[0, -1, 0, 0]] INFO: [[cos(j4), -sin(j4), 0, 0],[sin(j4), cos(j4), 0, 0],[0, 0, 1, 0]] INFO: [[1, 0, 0, 1/250],[0, 1, 0, -1/125],[0, 0, 1, 22/125]] Traceback (most recent call last): File "/usr/lib/python2.7/dist-packages/openravepy/_openravepy_0_8/ikfast.py", line 6121, in chaintree = solver.generateIkSolver(options.baselink,options.eelink,options.freeindices,solvefn=solvefn) File "/usr/lib/python2.7/dist-packages/openravepy/_openravepy_0_8/ikfast.py", line 1639, in generateIkSolver chaintree = solvefn(self, LinksRaw, jointvars, isolvejointvars) File "/usr/lib/python2.7/dist-packages/openravepy/_openravepy_0_8/ikfast.py", line 2104, in solveFullIK_6D raise self.CannotSolveError('need 6 joints') main.CannotSolveError: 'need 6 joints'

It seems like I've given it the 6 joints it's asked for. I've tried combinations like (2, 10), (2, 9), (2, 8), (1, 8), etc., but I can't seem to get any sort of helpful feedback. How am I supposed to specify the links given this link and joint info readout? How am I supposed to interpret it?

FWIW, I believe that the kuka youbot is 6dof with one redundant joint, but I don't think that matters for the purposes of this error, does it?

EDIT: after playing around with some print statements, I've discovered that there is only j0 through j4. Why are only four joints being found, when on a --list joints I find 7?

UPDATE: Thanks for the help. I ran this now instead using --iktype=translationdirection5d and it generated a .cpp file. As I move to the "create plugin" step though, it spits out "Error: Can't find robot youbot_moveit_config." It seems I need to make some sort of moveit_config package...but this is nowhere in the instructions. How am I supposed to create this? Does anyone know?

I also don't know if just throwing in the flag translationdirection5d was acceptable. Is there a reason why I would have to go through all that business from that google groups link?

Originally posted by aespielberg on ROS Answers with karma: 113 on 2013-06-25

Post score: 2

Comment by Martin Günther on 2013-06-25:
I can't really answer your question, but the Kuka youbot only has 5 DoF.

Comment by aespielberg on 2013-06-26:
It has 5 effective DoF, but 6 joints, right? So this would be a 6DoF arm with one redundant joint? I know there's a way to specify redundant joints, but I don't really understand the documentation there.

Comment by Martin Günther on 2013-07-03:
Re: Update - Are you planning on using arm_navigation or MoveIt? For MoveIt, there's a tutorial here: http://moveit.ros.org/wiki/PR2/Setup_Assistant/Quick_Start ; for arm_navigation, here: http://ros.org/wiki/arm_navigation/Tutorials/tools/Planning%20Description%20Configuration%20Wizard

Comment by aespielberg on 2013-07-03:
Okay, I think I've got it working now, thanks a lot for your help!

Comment by awied on 2020-10-26:
Hey I have the problem now that I cannot create the cpp file. I also use the Kuka Youbot and it doesn't work for youbot with or without base. Could you please provide that cpp file you generatedor tell me how you solved your problem? Was the iktype the only parameter you changed?I am using ros kinetic on Ubuntu 16.04. I always get the error message that my equations are too complex.

If you only consider the arm (not the base), it has 5 controllable joints according to this page ("arm joint 1-5"), plus one fixed joint. This makes it 5DoF.

Not sure what you mean by "redundant joint"; the way I understand the term, if you have a (6 + n) DoF manipulator (which the youbot doesn't), you have n redundant joints (since you only need 6 of the joints to find an inverse kinematic solution).

Since the youbot arm only has 5 joints, ikfast probably can't compute a transform6d IK (that's why it says "need 6 joints"). You can try specifying a translationdirection5d iktype instead; I'm currently trying to do that, but ran into trouble; I'll probably ask a question about how to get translationdirection5d working later today.

UPDATE: I've solved the problem I mentioned above; see this moveit-users post if you plan on creating a TranslationDirection5D ikfast plugin.

Originally posted by Martin Günther with karma: 11816 on 2013-06-26

This answer was ACCEPTED on the original site

Post score: 2

I believe Martin's answer is correct. When I read the YouBot specs here, it explicitly lists the YouBots as 5-DOF robots. For 5-DOF robots, you don't have sufficient degrees of freedom to calculate a full XYZWPR (transform6d) IK solution. Instead, you must use one of the lower-DOF solutions, such as translationdirection5d. See these other discussions:

Even if you were to use IKFast's redundant-joint flag, this will not allow it to create a 6DOF solution for a 5DOF robot. IKFast expects you to specify an arbitrary value for the redundant joint at runtime, and will solve for the remaining joints. This allows for analytic solutions of 7DOF robots: once the redundant joint value is specified, IKFast can treat the links on either side of that joint as a single rigid link, and calculate a normal 6DOF solution for the remaining 6 joints. This means that if you have a 6DOF robot with one redundant ("free") joint, then IKFast is still trying to calculate a 5DOF solution once you have specified the (arbitrary) value for the redundant joint.

Originally posted by Jeremy Zoss with karma: 4976 on 2013-06-27

This answer was NOT ACCEPTED on the original site

Post score: 1