Circular_arc_with_zero_radius

We keep getting this error, when we use MoveP commands: CIRCULAR_ARC_WITH_ZERO_RADIUS

Have any of you experienced the same error, and do you know what the error means?

The error is shown when the moveP command at txtmsg(789) is called in the following script:

movel( p[-0.609394,-0.233981,0.291918,1.54318,-0.353185,-0.492905], a=1.2, v=0.0103947, r=0.00110432) movep( p[-0.609394,-0.233981,0.291918,1.54318,-0.353185,-0.492905], a=1.2, v=0.0103947, r=0.00110432) textmsg(771) textmsg("0.0103122 0.0103122 0.000206638 0.0200383 26.2362 2.34543") movep( p[-0.609369,-0.233948,0.291716,1.53388,-0.351838,-0.492445], a=1.2, v=0.0103122, r=0.00110332) textmsg(772) textmsg("0.0102429 0.0102429 0.000205185 0.0200319 26.2362 2.37233") movep( p[-0.609347,-0.233923,0.291513,1.52459,-0.350489,-0.491978], a=1.2, v=0.0102429, r=0.00110259) textmsg(773) textmsg("0.0101873 0.0101873 0.000204002 0.0200252 26.2362 2.28185") movep( p[-0.609327,-0.233907,0.291311,1.51529,-0.349138,-0.491505], a=1.2, v=0.0101873, r=0.001102) textmsg(774) textmsg("0.00998804 0.00998804 0.000201542 0.0201784 26.2519 125.151") movep( p[-0.60931,-0.233898,0.29111,1.50599,-0.347789,-0.491021], a=1.2, v=0.00998804, r=0.00110077) textmsg(775) textmsg("0.00482405 0.00482316 9.64632e-05 0.0199963 28.8592 6.01683") movep( p[-0.609246,-0.233863,0.291173,1.49552,-0.347056,-0.489674], a=1.2, v=0.00482316, r=0.00104823) textmsg(776) textmsg("0.00460298 0.00460298 9.30912e-05 0.0202241 28.875 6.27359") movep( p[-0.609183,-0.233839,0.291238,1.48504,-0.346322,-0.488317], a=1.2, v=0.00460298, r=0.00104655) textmsg(777) textmsg("0.00443917 0.00443917 8.95084e-05 0.0201633 28.875 6.7188") movep( p[-0.609123,-0.233824,0.291303,1.47457,-0.345584,-0.486954], a=1.2, v=0.00443917, r=0.00104475) textmsg(778) textmsg("0.00433913 0.00433913 8.71706e-05 0.0200894 28.875 6.98941") movep( p[-0.609066,-0.23382,0.291368,1.4641,-0.344841,-0.485586], a=1.2, v=0.00433913, r=0.00104359) textmsg(779) textmsg("0.00430731 0.00430731 8.61794e-05 0.0200077 28.875 7.03894") movep( p[-0.609011,-0.233827,0.291435,1.45363,-0.344093,-0.484212], a=1.2, v=0.00430731, r=0.00104309) textmsg(780) textmsg("0.00434522 0.00432907 8.65814e-05 0.0199256 28.875 6.85834") movep( p[-0.608959,-0.233843,0.291502,1.44316,-0.343341,-0.482832], a=1.2, v=0.00432907, r=0.00104329) textmsg(781) textmsg("0.00445108 0.00441786 8.83573e-05 0.0198508 28.875 6.4798") movep( p[-0.608909,-0.23387,0.291569,1.43269,-0.342584,-0.481447], a=1.2, v=0.00441786, r=0.00104418) textmsg(782) textmsg("0.0046202 0.00457135 9.1427e-05 0.0197885 28.875 5.96358") movep( p[-0.608862,-0.233908,0.291638,1.42222,-0.341823,-0.480057], a=1.2, v=0.00457135, r=0.00104571) textmsg(783) textmsg("0.00484595 0.00478328 9.56657e-05 0.0197414 28.875 5.09935") movep( p[-0.608817,-0.233955,0.291708,1.41176,-0.341057,-0.478661], a=1.2, v=0.00478328, r=0.00104783) textmsg(784) textmsg("0.00525638 0.00511348 0.00010227 0.0194563 28.8973 31.6397") movep( p[-0.608775,-0.234013,0.291781,1.40128,-0.34029,-0.477253], a=1.2, v=0.00511348, r=0.00105113) textmsg(785) textmsg("0.0194678 0.0193258 0.000386516 0.0198541 32.5452 1.90077") movep( p[-0.60873,-0.234087,0.292158,1.38925,-0.340109,-0.474699], a=1.2, v=0.0193258, r=0.00119326) textmsg(786) textmsg("0.0196894 0.0196301 0.000392601 0.0199397 32.5675 1.89122") movep( p[-0.608687,-0.234174,0.292538,1.37722,-0.339923,-0.472133], a=1.2, v=0.0196301, r=0.0011963) textmsg(787) textmsg("0.0199408 0.0198739 0.000397479 0.0199329 32.5675 1.83371") movep( p[-0.608646,-0.234276,0.29292,1.36518,-0.339729,-0.469564], a=1.2, v=0.0198739, r=0.00119874) textmsg(788) textmsg("0.0202208 0.0201467 0.000402934 0.0199267 32.5675 1.78445") movep( p[-0.608607,-0.23439,0.293305,1.35315,-0.339527,-0.46699], a=1.2, v=0.0201467, r=0.00120147) textmsg(789) textmsg("0.0206863 0.0205252 0.000410505 0.0198443 32.5807 6.27655") movep( p[-0.608571,-0.23452,0.293693,1.34111,-0.339318,-0.464411], a=1.2, v=0.0205252, r=0.00120525) textmsg(790) textmsg("0.0338998 0.033718 0.00067436 0.0198927 34.752 1.15074") movep( p[-0.608584,-0.234743,0.294329,1.3282,-0.339359,-0.461721], a=1.2, v=0.033718, r=0.00133718) textmsg(791) textmsg("0.0343141 0.0342061 0.000684123 0.0199371 34.7654 1.11399") movep( p[-0.608599,-0.234982,0.29497,1.31528,-0.33939,-0.459026], a=1.2, v=0.0342061, r=0.00134206) textmsg(792) movel( p[-0.609394,-0.233981,0.291918,1.54318,-0.353185,-0.492905], a=1.2, v=0.0103947, r=0.00110432)

I have seen similar errors when the point I was trying to use was too close to the previous point and the system couldn’t figure out a trajectory. Just looking at your points you are somewhere in the 0.0004 m range of distance in the X,Y,Z frame from the previous point but your radius is .0012 m.

Have you tried using points that are not so close to each other? Would it be possible to use a servoj move instead of a movep? You would need to use something like servoj(get_inverse_kin(POSE), t=0.008) but then you would be feeding the robot a motion to make in each time slice.

Just a thought since don’t know your specific use case or how all of the points are being generated.

The error happens if the blend radius is larger than the distance between the points in a MoveP.
Since the robot would try to calculate a blend (circular arc path), but the distance is smaller than the radius of the arc, the math doesn’t “add up”.

@mbush’s solution might work with the ServoJ command, if it is possible to feed these data continuously.

Hello,
Thank you for your answer @mbush . The points are very close indeed, and i might be able to make larger distance between them. Normally what happens is that the controller eats away the points that is within the blend radius, and then just continue’s execution. At some point we often see the CIRCULAR ARC error.

I would gladly change the movep with servoj, I even have the joint trajectories. But then i might lose the inverse kinematics of the UR and also the interpolation will be in joint space and not tool-space, which would definitely require very close points. (i’ve seen deviations from linear paths up to 1mm for ~1mm movements due to joint space
interpolation). Also my experience getting servoj to follow a path are bad…

What i am doing is exchanging movep with movel instructions at the places where i have the error. I can do this with trial and error, but that is nasty work, and i (and my customers) would prefer that i can detect where to add movel automatically. Do you perhaps know how i can detect where these errors occour? I have looked at position,velocity and acceleration profiles, but there are no unique feature in the points where i get the error…

Thank you @jbm, i will try and make the distance between points larger, since reducing the radius below 1mm also gives errors, eg. “radius too small…”. One thing though, if my movement is purely rotational, say i rotate the tool around an axis, then my distance in meter is very small and my movep command might fail.

How can i make such a rotation with movep? or is that impossible?

The only way that I could think of is if you were to calculate the move distance and then compare to the radius that you are trying to use. If the move is below the radius you could convert that move to a movel. I assume that this is code being generated by a program of sorts whether offline or running on the machine so I’d think that could be possible.

Hello, suddenly I got the same error and I could not get past it. We have had some urscript lines executed in order to do two movec’s in sequence. This has worked up until now. The points are spaced no less than 60 mm between the points and no more than about 160 mm. on a curved edge which is cylindrical and has a radius of 950 mm.

I was able to get it working again by inserting a movel between the movec’s like so…

PolyScope version 3.13.1.10297

  weld_radius_seam = 1.0 / 1000
  weld_speed_w2 = 7.8
  weld_speed_w4 = 7.8
  movement_accel_linear_fast = 200.0 / 1000.0

  movec(MOD_WP_S_W2, MOD_WP_S_W3, a=movement_accel_linear_fast, v=weld_speed_w2 / 1000, r=weld_radius_seam)
  movel(get_actual_tcp_pose(), a=movement_accel_linear_fast, v=weld_speed_w2 / 1000)
  movec(MOD_WP_S_W4, MOD_WP_S_W5, a=movement_accel_linear_fast, v=weld_speed_w4 / 1000, r=weld_radius_seam)