2016-03-13 3 views
2

Je ne peux pas télécharger de photos alors je vais essayer d'expliquer mon problème le mieux. Je veux simuler la détection d'un objet en mouvement par un robot de type monocycle. Le robot est modélisé avec la position (x, y) et la direction thêta comme les trois états. L'obstacle est représenté par un cercle de rayon r1. Je veux trouver les angles alpha_1 et alpha_2 du cadre de coordonnées local du robot au cercle, comme indiqué ici:Angle à une ligne tangente de cercle

Alors ce que je fais est d'essayer de trouver l'angle du robot à la ligne joignant le robot et le centre du cercle (cet angle est appelé aux_t dans mon code), puis trouve l'angle entre la tangente et la même ligne (appelée phi_c). Enfin je trouverais les angles que je veux en ajoutant et soustrayant phi_c de aux_t. Le schéma Je pense est montré:

Le problème est que je reçois des ennuis avec mon code lorsque je tente de trouver les angles alpha: Il commence à calculer correctement les angles (bien que des valeurs négatives, je ne sais pas si cela cause mon problème) mais lorsque la voiture et le vélo se rapprochent, phi_c devient plus grand que aux_t et l'un des alphas change subitement de signe. Par exemple, je reçois ceci:

aux_t ////// phi_c ////// alpha_1 ////// alpha_2
-0,81 ///// /+0.52//////-1.33////////.29

-0.74 ////// + 0.61 ////// - 1.35 ////// - 0.12

-0,69 + 0,67 ////// ////// - 1,37 ////// - 0,02

-0,64 ////// + 0. 74 ////// - 1.38 ////// + 0.1

Donc, fondamentalement, l'alpha_2 se trompe ici. Je sais que je fais quelque chose de mal mais je ne sais pas quoi, je ne sais pas comment limiter les angles de 0 à pi. Y a-t-il un meilleur moyen de trouver les angles alpha? Voici la partie de mon code:

+0

peut-être parce que 'atan2' renvoie la valeur de' aux_t' entre -pi et pi, donc il change de signe dès qu'il traverse cette demi-ligne –

Répondre

3

En ce qui concerne vos calculs va, le seul changement que je ferais serait de Soustraire(pi/2 - theta) de l'angle de la cible plutôt que de l'ajouter. Cela vous donnera des angles dans l'orientation plus typique (dans le sens contraire des aiguilles d'une montre étant positif).

Je ne suis pas complètement sûr pourquoi vous pensez que alpha_2 est erroné dans les données que vous avez postées dans votre réponse. Qu'est-ce qui se passe, c'est que votre robot se rapproche de la cible et la ligne tangente alpha_2 se déplace réellement de l'autre côté ou la ligne pointant dans la direction de votre robot. J'ai créé une situation similaire ici où les étiquettes sur les lignes tangentes sont l'angle par rapport au robot (ligne jaune) et tous les angles sont forcés d'être entre 0 et 2 * pi.

enter image description here

Pour vous répondent à la question de forcer un angle à l'intérieur d'une plage particulière. Pour ce faire, vous devez utiliser le module (mod dans MATLAB). Dans ces exemples, j'ai utilisé mod(theta, 2*pi) parce que techniquement, si votre robot est face loin de la cible, les angles peuvent être supérieurs à pi.

Comme un test j'ai effectué une simulation simple qui déplace le robot autour et montre les angles des tangentes par rapport à la direction du robot (encore une fois, entre 0 et 2 pi)

enter image description here

Si vous voulez vraiment que vos angles soient entre 0 et pi, vous pouvez plutôt utiliser mod(theta, pi) à la place.

alpha_1 = mod(alpha_1, pi); 
alpha_2 = mod(alpha_2, pi); 
+0

Mes doutes provenaient du fait que je n'étais pas (et je ne suis toujours pas) en train d'obtenir ce que je veux du comportement du robot final, alors quand j'ai commencé à dépanner les programmes, les chiffres que j'ai mentionnés me semblaient anormaux et pensé qu'ils pourraient affecter négativement la loi de contrôle. Si cela avait beaucoup de sens, il ne m'est pas arrivé que la seconde tangente se dirige vers l'autre côté par rapport à la direction du robot. J'utiliserais le mod de 2 * pi pour mes angles alpha et vérifierais où je peux me tromper. Cordialement – Wobbler28

0

Le point est en P, le cercle en O et le rayon r. Vous voulez la tangente au cercle qui passe par P, cal il T

Nous savons donc la distance OP, on connaît la distance OT, qui est r, et nous savons que la prise de force d'angle est un angle droit. Nous utilisons donc Pythagore pour obtenir la distance TP. Alors cos thêta (l'angle OPT est TP/OP Nous pourrions enregistrer une étape et calculer sin thêta, mais cos theta est plus facile à traiter car il nous donne le produit scalaire de les vecteurs de direction PT et PO. vous n'aurez pas besoin de pour appeler acos()