How do I check if a MoveL instruction can be completed without a singularity or avoid it?

Hello,

I have pretty much the same issue as this user back in August 2016: I'm sending points on a work object to a robot via a TCP socket. It then moves from point to point with MoveL and sends a response when it is done. However, I sometimes encounter singularities during this process. I'd like to either avoid these altogether or be able to restart after running into a singular point. Is it possible to implement any of the following solution ideas in RAPID?

  1. Given the robots current position and a target point, determine if a linear motion to the target can be executed without running into a singularity. If a singularity is encountered, SingArea is activated before any MoveL instruction is executed.
  2. The robot encounters a singulation while it is moving. The program should not be stopped. Instead, an error handler should be activated so the robot can execute a joint movement to get out of the singularity. The linear movement is then attempted again with SingArea activated.
  3. Sample several points along the path in a separate function using CalcRobT and check for joint configurations that might be near to a singularity and then just discard the path.
Regarding idea #2: How would I implement an error handler to catch this? I cannot find any ERR_* code in the reference manual. Is there a configuration parameter to make singularities catchable?

I'm using an IRB 1200 with an IRC5 compact controller.

Thanks for your help :)

MG

Best Answer

  • Adnan
    Adnan Göteborg admin
    Answer ✓

    Hi,

    In order to determ if the linear motion can be executed without running into singularity and without even running a robot you could use non motion execution. If you go to IRC5 with FlexPendant and search non motion execution this could be helpfull.

    The second point is really solved with the instruction SingArea with argument Wrist this will then avoid the singularíty by orientations around the problematic area but could also create some other problems.

    To determ if the position is close to singularity you could write some sort of logic in Rapid like below.
    First by defining singularity detection function like this:
    ********************************************************
    FUNC bool Singularity_Detection(jointtarget Origin_RobotJoint, jointtarget Target_RobotJoint)
    IF (((Target_RobotJoint.robax.rax_5 > 0) AND
    (Origin_RobotJoint.robax.rax_5 < 0)) OR
    ((Target_RobotJoint.robax.rax_5 < 0) AND
    (Origin_RobotJoint.robax.rax_5 > 0))) THEN
     RETURN (TRUE);
     ELSE
     RETURN (FALSE);
     ENDIF
    ENDFUNC
    ********************************************************

    And then call the function like this:
    ********************************************************
    PROC GoTo_XPosition()
     MotionSup \On \TuneValue := MotionSup_Sensitivity;
     IF (Singularity_Will_Occur) THEN
     MoveJ XPosition_Instance, v200 \V := (Percent_RobTCPSpeed_Multiplier * Percent_RobTCPSpeed_Instance), fine, x_Gun \WObj:=wobj0;
     ELSE
     MoveL XPosition_Instance, v200 \V := (Percent_RobTCPSpeed_Multiplier * Percent_RobTCPSpeed_Instance), fine, x_Gun \WObj:=wobj0;
     ENDIF
     MotionSup \Off;
    ENDPROC
    ********************************************************


    Hopefully it helps!

    Best Regards,

    Adnan

Answers

  • Hello Adnan,

    thank you very much for your reply! Is it possible to switch NonMotionMode on and off in the program? I can only find a command to read its state in the reference manual. Since the robot generates new movements based on visual feedback of the work object, switching the mode manually is not possible sadly.

    I'll definitely try your singularity detection function. That looks very promising :) Since some points are far away from each other I'll have to add some interpolation with CalcJointT between start and end, so I can catch all positions where the singularity could occur.

    One more question: Why do you turn Motion Supervision on and off?

    Best Regards,
    Marvin
  • For future reference: The ABB support hotline confirmed that it is not possible to catch MoveL errors before or during a movement, either with an error handler or an error interrupt. See this thread.
  • Adnan
    Adnan Göteborg admin

    Hi Marvin,

    The definition above is used in some other application so maybe if you modify it, it could be helpfull.

    But also rapid has allready all functions like ConfL On/Off so maybe it isn't nessesary.

    Good luck!

    /Adnan

  • daguilar
    daguilar Irun, Spain
    There is a new type ConfL from RW6.05 and above to avoid Singularity. Check it out in the manual.


    Un saludokind regards,


    Daniel Aguilar

    Automation Engineering


  • lemster68
    lemster68 United States ✭✭✭
    If you know that sooner or later a singularity will arise, as in:

     1.Given the robots current position and a target point, determine if a linear motion to the target can be executed without running into a singularity. If a singularity is encountered, SingArea is activated before any MoveL instruction is executed.

    Then simply turn SingArea\wrist on at all times.
    Lee Justice