Question

I ai un robot qui utilise une souris optique comme une piste de position. Fondamentalement, le robot se déplace, il est en mesure de suivre les changements dans les directions X et Y à l'aide de la souris. La souris suit également la direction que vous vous déplacez - ie X négatif ou positif X. Ces valeurs sont additionnées dans des registres X et Y séparés.

Maintenant, le robot tourne en place et se déplace vers l'avant seulement. Ainsi, le mouvement du robot est idéalement dans les lignes droites (bien que le suivi de la souris peut écarts de pick-up si vous vous écartez de) à des angles particuliers. Un ensemble particulier de mouvements du robot serait comme:
R: Faire pivoter de 45 degrés, déplacer 3 pouces
B: Rotation de 90 degrés, déplacer 10 pouces
C: Rotation -110 degrés, déplacer 5 pouces
D: Rotation 10 degrés, déplacer 1 pouce
Mais chaque fois que le X de la souris et la souris registres Y donnent les distances réelles que vous avez déplacés dans chaque direction.
Maintenant, si je veux répéter le jeu de mouvement allant de A à D seulement, comment puis-je faire cela en utilisant les informations que je l'ai déjà recueillies. Je sais que je peux résumer essentiellement tous les angles et les distances que j'ALIMENTERA déjà, mais cela prouverait inexactes s'il y avait de grandes erreurs dans chaque ordre de mouvement. Comment puis-je utiliser les informations brutes de ma souris? Un ami a fourni une idée que je pouvais en continu sinus et cosinus les valeurs de la souris et calculer le vecteur final, mais je ne suis pas sûr de savoir comment cela fonctionnerait.

Le problème est que la souris ne donne que des lectures relatives si rotation ou en marche arrière, vous êtes potentiellement effacer des informations. Alors oui, ce que je me demande comment vous pouvez mettre en œuvre l'algorithme afin qu'il puisse suivre en permanence les changements pour vous donner un chemin le plus court si vous déplaciez en zigzags pour y arriver à l'origine.

Était-ce utile?

La solution

Je pense que l'algorithme de base que vous devez faire est la suivante:

currentX = currentY = 0;
heading = 0; // radians
while (true)
{
    deltas = SampleMouseDeltas();
    heading += deltas.Heading;
    currentX += Math.Cos(heading) * deltas.Distance;
    currentY += Math.Sin(heading) * deltas.Distance;
}

Vous avez raison dans votre idée que ce ne sera pas précis. On l'appelle « l'estime » pour une raison.

Si vous pouvez obtenir votre deltas.Heading basé sur le « X » de coordonnées (la formule sera (deltax en pouces) / (distance du capteur de la souris en pouces du centre de rotation). En outre, le deltas.Distance viendrait de le capteur « Y », après que vous convertissez de pixels en pouces.

Ensuite, pour effectuer les étapes, vous pouvez faire quelque chose comme:

robot.RotateLeft();
heading = 0;
while (heading < 45 degrees)
    heading += SampleMouseDeltas.Heading;
robot.StopRotateLeft();

... etc ...

Autres conseils

Pas une réponse à votre question, mais peut-être un récit édifiant ... Je l'ai fait exactement ce genre de robot d'un projet scolaire d'un an en arrière. Ce fut un échec total, bien que j'ai appris un peu tout en le faisant. Quant à l'utilisation de la souris pour le suivi jusqu'où vous avez conduit: Il n'a pas bien fonctionné pour nous du tout, ou l'un des autres groupes. Probablement parce que l'appareil photo de la souris était de mise au point en raison du fait que nous avions besoin d'avoir la souris quelques mm au-dessus du sol. L'année suivante, aucun groupe faisant le même projet a utilisé cette methid. Ils ont plutôt mis sur les marques weels et ont utilisé un capteur IR simple pour calculer le nombre de tours des roues faites.

Je sais que je suis un peu necroing ce fil, mais si vous voulez le suivi d'angle plus précis, deux souris optiques serait idéal. En gros, si vous avez annulé le mouvement dans la même direction, vous retrouverez avec le mouvement que la souris a fait par rapport à eachother. De là, il serait juste quelques calculs simples pour déterminer avec précision dans quelle mesure le « bot a tourné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top