2011-10-28 2 views
0

Hey je reçois une valeur de retour de "Pas un numéro" de la fonction suivante:inverse Cinématique ACos erreur QNAN, INAN

void Spider::setAngles(double x,double y, double l1, double l2){ 
double theta1, theta2; 
theta2=acos((pow(x,2)+pow(y,2)-pow(l1,2)-pow(l2,2))/(2*l1*l2)); 
cout<<theta2* 180/PI<<endl; 
theta1=(-((l2*sin(theta2)*x)+(l1+l2*cos(theta2)*y))/((l2*sin(theta2)*y)+ (l1+l2*cos(theta2)*x)))* 180/PI; 
cout<<theta1; 
} 

Je comprends que ACos a besoin d'une valeur d'argument entre -1 et 1, mais Je ne peux pas comprendre comment faire ceci, si par exemple le point effecteur final est à (15,15) avec des longueurs égales à 2 ...

Dois-je normaliser tout? Y compris les distances entre les articulations, et le vecteur directionnel de (0,0) -> (15,15)

Toute aide serait grandement appréciée!

Répondre

1

Rappelons que pour une right angled triangle:

cos(angle) = Adjacent/Hypotenuse 

qui signifie dans votre code pour theta2 vous:

Adjacent = x*x + y*y - l1*l1 - l2*l2 
Hypotenuse = 2*l1*l2 

Au mieux, cela est en arrière et est plus probable que mal en fonction de ce que vous essayons de faire. Si vous essayez de déterminer l'angle d'un triangle à angle droit avec l'hypoténuse de (0,0) à (x + l1, y + L2) que vous utilisez:

Adjacent = x + l1 
Hypotenuse = sqrt((x+l1)*(x+l1) + (y+l2)*(y+l2)) 

ou pour un triangle (0, 0) à (x-l1, y-I2):

Adjacent = x - l1 
Hypotenuse = sqrt((x-l1)*(x-l1) + (y-l1)*(y-l1)) 

assurez-vous également que vous essayez de calculer l'angle dans un triangle rectangle et non arbitraire.

+0

J'essaye de trouver l'inverse avec l'arc cosinus si ... Peut-être que je manque votre point! – user1018539

+0

Oui: inverser ma première équation donne 'Angle = acos (Adj/Hyp)'. Si vous donnez des nombres incorrects pour Adj ou Hyp, vous pouvez vous retrouver avec quelque chose en dehors de la plage valide d'entrées pour 'acos()'. – uesp