Inverse Kinematics checking for 6DOF robot

Hi,

I am trying to set a Pose in 3D space, so the robot can set the joints to achieve that pose. I have a simple function to do that, passing the Pose Matrix. However, there’s no guarantee the robot can achieve that configuration. I’d like a way to test is that point is valid within the joints values from the robot.



private List<List> FindJointsConf(IRobot robot, Matrix matrix)
{
IMotionInterpolator motionInterpolator = robot.RobotController.CreateMotionInterpolator();
IMotionTarget motionTarget = robot.RobotController.CreateTarget();

Matrix toolTCP = new Matrix();
toolTCP.SetP(new Vector3(0, 0, 120));

//Picking target
motionTarget.TargetMatrix = matrix;
motionTarget.TargetMode = TargetMode.World;
motionTarget.ToolMatrix = toolTCP;
motionTarget.MotionType = MotionType.Joint;
motionInterpolator.AddTarget(motionTarget);

List<List> joints = new List<List>();
foreach (IMotionTarget t in motionInterpolator.Targets)
{
joints.Add(new List { t.GetAllJointValues()[0],
t.GetAllJointValues()[1],
t.GetAllJointValues()[2],
t.GetAllJointValues()[3],
t.GetAllJointValues()[4],
t.GetAllJointValues()[5] });
}
motionInterpolator.Dispose();

return joints;
}


Thanks a lot,

André Castro.

Looks like this went unnoticed, sorry. The interpolator should provide a GetConfigWarning or GetConfigWarnings method for indicated the status or reachability of the target matrix given the robot’s configurations. From there, you could assign the robot a configuration that is solvable and safe for the position.

In Python API, there is now a forwardKin() method in vcPythonKinematics that makes it super easy to calculate forward kinematics. You also have the option to create a Jacobian object that can calculate forward kinematics as well as inverse kinematics with minimal code. There will be tutorials about these new features introduced in 4.1 coming soon along with a tutorial specifically about configuration warnings.

I mostly use Python, so not sure what the .NET counterparts are for all of this.

2 Likes

Hi,

many thanks for the reply, @zetsy. I guess it’s easy to reuse and adapt the code in Python in C#. Will be trying that!

Cheers!

André Castro.

Hello,
I am a new VC, I am very interested in vcPythonKinematics, may I ask where you said the tutorial can be found? My basic knowledge of robot kinematics is weak, is it possible to create a custom robot in VC with vcPythonKinematics? For the moment, I’m just looking at it as a learning purpose, and it doesn’t involve solving dynamics.
Thanks a lot,
Manfred

My basic case is that I can know some basic robot kinematics, but it’s a very complicated process for me in terms of specific calculations. I’ve seen Robot models solved by vcPythonKinematics, such as “Generic Scara Robot”, “UR10e” and “RVL40”. I think the person who wrote these scripts must have a good knowledge of robot kinematics and mathematics, and he must know in advance that there are several configurations of the kinematic solution of this robot before writing the script.Do they need to complete the mathematical model first with other tools (such as matlab) so that they know how many inverse solutions there are to the robot’s motion .Are these prerequisites necessary to create a custom robot from vcPythonKinematics?

Hey, Manfred. I had a similar interest, because I needed a way to check if a point can be reached by a given robot from a given position. I was worried I will have to do some sort of complicated process, as you call it, but I ended up using the getConfigWarning and getConfigWarnings methods of the vcMotionTarget class. Once you create a vcMotionTarget object out of the point (position matrix) you want the robot to reach, you can use these methods to determine if it is reachable, and even find out why not in the case it’s not reachable.

What if you try to get configurationwarnings from the target you are creating and check against ConfigurationWarnings

    //
    // Summary:
    //     State of motion target inverse kinematics.
    [Flags]
    public enum ConfigurationWarnings
    {
        //
        // Summary:
        //     Target can be reached.
        None = 0x0,
        //
        // Summary:
        //     Target cannot be reached.
        Unreachable = 0x1,
        //
        // Summary:
        //     Target cannot be reached due to joint limit constraints.
        JointLimit = 0x2,
        //
        // Summary:
        //     Target position creates a singularity, i.e. infinite solutions when one or two
        //     joints no longer represent independent controlling variables. For example, joints
        //     have a 0° value and become parallel.
        Singularity = 0x4,
        //
        // Summary:
        //     Inverse kinematics not calculated.
        NotCalculated = 0x8
    }

For example,

if (motionTarget.GetConfigurationWarnings(int index) != ConfigurationWarnings.None) #index is the current configuration
{
//cannot reach
return;
}

Yes, I implemented something very similar, but in Python. The function in the API assumes that the robot will try to reach the target from its current position; since my robot is mobile, I have to update its position matrix with the API and only after that call the function. Even so, I am pleased with the speed and I do not feel the need to make my own calculations.