2010-05-04 5 views
0

J'ai une carte des arbres individuels d'une forêt stockée en tant que x, y points dans une matrice. Je l'appelle fixedPositions. C'est cartésien et (0,0) est l'origine.Matlab traduction matricielle et rotation plusieurs fois

Pour une vitesse et un cap, par exemple 0,5 m/s et 60 degrés (équivalent à 2 heures sur une montre), comment faire pivoter les points x, y, de sorte que la nouvelle origine soit centrée sur (.5cos (60), 5sin (60)) et 60 degrés est maintenant en haut de l'écran?

Ensuite, si je devais vous donner un autre cap et une autre vitesse, c'est-à-dire 0 degré et 2m/s, il devrait le calculer à partir du dernier point, et non l'origine originale de FixedPositions. J'ai perdu ma journée à essayer de comprendre cela. Je souhaite avoir pris l'algèbre matricielle mais je suis à perte.

J'ai essayé de faire cos (30) et même ceux qui ne calculent pas correctement, qui après une heure je me rendais compte en radians.

Répondre

0

Je procédez comme suit: Dans votre objet, vous avez déjà une propriété heading. Maintenant, vous ajoutez une autre propriété, currentPosition (un peut-être les renommer en heading_robot et currentPos_robot). heading ainsi que currentPosition devrait toujours par rapport au système de coordonnées d'origine

vous ajoutez ensuite une nouvelle méthode, qui prend updatePosition(newHeading, distance) comme entrée. Cette méthode mettra à jour à la fois heading et currentPosition, en ajoutant d'abord l'angle newHeading à l'angle de heading, après quoi vous mettez à jour currentPosition en ajoutant [distance*cos(heading),distance*sin(heading)] (vérifier les signes de sin/cos ici!) À l'ancienne valeur de currentPosition.

Enfin, pour obtenir le point de vue du paysage (à savoir apparentPositions), vous exécutez bsxfun(@minus,fixedPositions,currentPosition) pour déplacer l'origine à l'endroit où le robot est en ce moment, et vous multipliez avec la matrice de rotation 2D en utilisant l'angle stocké dans heading.

+0

currentPosition serait une matrice? currentPosition = [x; y] pour le créer? –

+0

Aussi, parce que j'utilise des en-têtes, pas des angles traditionnels, 0 est droit devant, 90 degrés est à droite, et les angles sont mesurés dans le sens des aiguilles d'une montre. Pour ce faire, j'échange x et y. Donc, la nouvelle position coordonnée serait [distance * sind (cap), distance * cosd (cap)]? –

+0

@pinnacler: oui et (je pense) oui. Pour le titre, je devrais honnêtement essayer deux ou deux exemples pour être sûr que changer le cap changera l'orientation dans la bonne direction. – Jonas

0

Il vous suffit de traduire d'abord les coordonnées (-0.5cos(60),-0.5sin(60)) pour prendre l'origine à votre point cible.

Puis tournez en multipliant les coordonnées par un rotation matrix.

Bien sûr, la plupart des langages de programmation utilisent radians sous forme d'unités d'angle, de sorte qu'au lieu de 60, vous devez entrer 60 * PI/180

+0

Donc, je traduis au point que je veux être l'origine, puis tourner? Aussi, parce que je veux aller dans le sens des aiguilles d'une montre, avec 0 degrés tout droit, puis-je simplement changer x et y? (.5sin (60), 5cos (60))? –

+0

La paire (-0.5cos (60), - 0.5sin (60)) indique la traduction, pas la rotation. La rotation va changer dans le sens des aiguilles d'une montre vers la gauche si vous changez le signe de l'angle (et donc le signe des coefficients Sin() dans la matrice). – leonbloy

Questions connexes