Hello,
currently, I'm using ChainIkSolverVel_pinv::CartToJnt to control a robotc arm with 7 joints. But the arm doesn't reach the desired end effector position exactly. I have variations of some centimetres.
My program calculates the current end effector frame and the end effector frame at the next time stamp of 1 sec. Then I calculate the Twist with KDL::Twist twist = diff(KDL::Frame1, KDL::Frame2). After this, the rotational part of the twist is transformed into the end effector frame. finally the resulting twist builds the input for ChainIkSolverVel_pinv::CartToJnt.
I get the two KDL::Frames from MeMatrix4-matrices which results from
void MeQuaternionToTM ( MeMatrix4 tm, const MeVector4 q )
which is a function of MeMath.h. Maybe the transformation from a quaternion into a matrix is not exactly?
Or do you have an idea where the problem could be?
Some variations of end effector position while using ChainIkSolv
On Monday 11 August 2008 12:56:22 threelight wrote:
> Hello,
>
> currently, I'm using ChainIkSolverVel_pinv::CartToJnt to control a robotc
> arm with 7 joints. But the arm doesn't reach the desired end effector
> position exactly. I have variations of some centimetres. My program
> calculates the current end effector frame and the end effector frame at the
> next time stamp of 1 sec. Then I calculate the Twist with KDL::Twist twist
> = diff(KDL::Frame1, KDL::Frame2). After this, the rotational part of the
> twist is transformed into the end effector frame. finally the resulting
> twist builds the input for ChainIkSolverVel_pinv::CartToJnt. I get the two
> KDL::Frames from MeMatrix4-matrices which results from void
> MeQuaternionToTM ( MeMatrix4 tm, const MeVector4 q )
> which is a function of MeMath.h. Maybe the transformation from a quaternion
> into a matrix is not exactly?
>
> Or do you have an idea where the problem could be?
You should use the chainiksolvervel in a closed loop.
Each control step you should do the following (lets say at 100Hz or
something):
//Get the current joint positions
KDL::JntArray q_current=....;
//Calculate the forward kinematics to get the current cartesian position
KDL::Frame F_current;
bool succes = KDL::ChainFkSolverPos->JntToCart(q_current,F_current);
//Apply your control-law (this is feedback, Federico uses attraction fields)
KDL::Frame F_desired = ...;
KDL:: Twist V_control=K*diff(F_desired , F_current)
//Calculate the inverse kinematics:
KDL::JntArray q_dot_control(size);
succes = KDL::ChainIkSolverVel->CartToJnt(q_current,V_control,q_dot_control)
//Send the joint velocities to the robot
.....(q_dot_control)
This should do the trick.
Ruben
Some variations of end effector position while using ChainIkSolv
On Mon, 11 Aug 2008, threelight wrote:
> currently, I'm using ChainIkSolverVel_pinv::CartToJnt to control a robotc arm
> with 7 joints. But the arm doesn't reach the desired end effector position
> exactly. I have variations of some centimetres. My program calculates the
> current end effector frame and the end effector frame at the next time stamp
> of 1 sec. Then I calculate the Twist with KDL::Twist twist =
> diff(KDL::Frame1, KDL::Frame2). After this, the rotational part of the twist
> is transformed into the end effector frame. finally the resulting twist
> builds the input for ChainIkSolverVel_pinv::CartToJnt.
> I get the two KDL::Frames from MeMatrix4-matrices which results from
> void MeQuaternionToTM ( MeMatrix4 tm, const MeVector4 q ) which is a function
> of MeMath.h. Maybe the transformation from a quaternion into a matrix is not
> exactly?
>
> Or do you have an idea where the problem could be?
The best thing is to provide a complete example, that we can reproduce and
look for the bug(s).
But if you interpolate with 1sec intervals, you will make very large errors
at "normal" motion speeds! Typically, 1 milli second is used for decent
accuracy...
Herman
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
providing an example would
providing an example would be difficult because there is a lot of code involved.
I thought that 1 sec is the correct interpolation frequency since Ruben Smits told me that the twist which serves as an input for chainsolvervel_pinv is the velocity of the end effector, from the current end effector frame to the new end effector frame( that I will reach if I apply this twist for 1 sec)???
providing an example would
On Mon, 11 Aug 2008, threelight wrote:
> providing an example would be difficult because there is a lot of code
> involved.
> I thought that 1 sec is the correct interpolation frequency since Ruben Smits
> told me that the twist which serves as an input for chainsolvervel_pinv is
> the velocity of the end effector, from the current end effector frame to the
> new end effector frame( that I will reach if I apply this twist for 1 sec)???
For "one unit of time"... Whether this is okay or not depends on how much
your desired trajectory deviates from a "constant-twist" trajectory. In
other words: the joint velocities that correspond to a given end-effector
twist will, in general, not make the robot move along the Cartesian twist
path, since the IK is a non-linear transformation from Cartesian to joint
velocities: the jacobian matrix depends on the configuration, and that
configuration changes all the time...
Herman
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
ah, sorry, I already use an
ah, sorry, I already use an interpolation frequency of 1 msec. So this must be correct.