rdiankov / openrave

Open Robotics Automation Virtual Environment: An environment for testing, developing, and deploying robotics motion planning algorithms.
http://www.openrave.org
Other
693 stars 343 forks source link

Bug in assert that checks f within bounds for IKasin/IKacos #1275

Open proyan opened 1 year ago

proyan commented 1 year ago

Hello @rdiankov Thanks for this wonderful library. I recently encountered a problem with IKFast, that I'll describe below. Unfortunately I can't provide a reproducible example because of the time constraints and the really specific nature of the problem, but I hope the problem and solution are easy to understand. I am available for any information that you might require. Best, Rohan

Setup: I'm using the IKFast feature of the full openrave installation (as a standalone command). It was possible for me to use it on our robot without any issues for more than a year. Then suddenly, in a specific problem, at one instant, I had the following assertion failed (line 131):

 129 inline double IKasin(double f)                                                                                                                                                                                
 130 {                                                                                                                                                                                                             
 131 IKFAST_ASSERT( f > -1-IKFAST_SINCOS_THRESH && f < 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver                                                                      
 132 if( f <= -1 ) return -IKPI_2;                                                                                                                                                                                 
 133 else if( f >= 1 ) return IKPI_2;                                                                                                                                                                              
 134 return asin(f);                                                                                                                                                                                               
 135 }                                                                                                                                                                                                                                                                                   

Problem After some digging, I found out that the problem is that the equality condition is not taken into account in the assert.

Before IKasin is called, there is a check that verifies - 1- thresh < f < 1 + thresh. But when f == -1-thresh or f==1+thresh, this check is not triggered, and the function is called regardless, which then fails

Solution A really simple solution is to allow equality inside the assertion at the time of code generation. For e.g., the following line in https://github.com/rdiankov/openrave/blob/a982f0ac0b757787ab4c9a9af94f69795e8281cb/python/ikfast_generator_cpp_sympy0_6.py#L286 would change to

 IKFAST_ASSERT( f >= -1-IKFAST_SINCOS_THRESH && f <= 1+IKFAST_SINCOS_THRESH ); // any more error implies something is wrong with the solver 

There are a few more instances of this assert in the generator file. The same change would apply there as well.

Test I tried it on my problem and it worked.