Domanda

Ho un robot che utilizza un mouse ottico come una traccia di posizione. Fondamentalmente, il robot si muove è in grado di individuare le variazioni nelle direzioni X e Y utilizzando il mouse. Il mouse traccia anche quale direzione si sta muovendo - IE X negativo o positivo X. Questi valori vengono sommati in X separato e registri Y.

Ora, il robot ruota al suo posto e si muove solo in avanti. Così il movimento del robot è ideale in linea retta (anche se il monitoraggio del mouse può deviazioni di prelievo Se si vira fuori) ad angoli particolari. Un particolare insieme di movimenti del robot sarebbe come:
A: Ruota 45 gradi, spostare 3 pollici
B: Ruota di 90 gradi, spostare 10 pollici
C: Ruota -110 gradi, spostare 5 pollici
D: Ruota di 10 gradi, spostare 1 pollice
Ma ogni volta che il mouse X e Y del mouse registri dare le vere distanze spostati in ogni direzione.
Ora, se voglio ripetere il set movimento di andare da A a D solo, come posso fare questo usando le informazioni che ho già raccolto. So che posso fondamentalmente sommare tutti gli angoli e distanze do da mangiare in esso già, ma questo risulterebbe essere imprecise se ci fossero grandi errori in ogni ordini di movimento. Come posso utilizzare le informazioni grezze da mouse? Un amico ha fornito un'idea che ho potuto continuamente seno e coseno i valori del mouse e calcolare il vettore finale, ma io non sono davvero sicuro di come questo avrebbe funzionato.

Il problema è che il mouse dà solo letture relative così rotanti o in movimento a ritroso, si sono potenzialmente la cancellazione delle informazioni. Quindi sì, quello che mi chiedo è come si può implementare l'algoritmo in modo che possa monitorare continuamente le modifiche per darvi un percorso più breve se si è spostato a zig-zag per arrivarci in origine.

È stato utile?

Soluzione

Credo che l'algoritmo di base che dovete fare è questo:

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;
}

Hai ragione nella vostra idea che questo non sarà precisa. Si chiama "dead reckoning" per un motivo.

dove è possibile ottenere il vostro deltas.Heading basata sulla "X" di coordinate (la formula sarà (DeltaX in pollici) / (del mouse sensore di distanza in pollici dal centro di rotazione). Inoltre, la deltas.Distance sarebbe venuto da il sensore di "Y", dopo aver convertito da pixel a pollici.

Poi, per eseguire i passaggi, si potrebbe fare qualcosa di simile:

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

... etc ...

Altri suggerimenti

Non è una risposta alla tua domanda, ma forse un avvertimento ... Ho fatto esattamente questo tipo di robot, come un progetto scolastico un anno indietro. E 'stato un fallimento totale, anche se ho imparato un po' allo stesso tempo. Per quanto riguarda usando il mouse per il monitoraggio fino a che punto hai guidato: Non ha funzionato bene per noi a tutti, o uno qualsiasi degli altri gruppi. Probabilmente perché la macchina fotografica nel topo era fuori fuoco a causa del fatto che abbiamo bisogno di avere il mouse pochi mm sopra il pavimento. L'anno successivo nessun gruppo facendo lo stesso progetto ha utilizzato questo methid. Hanno invece messo marcature sui weels e utilizzato un semplice ir-sensore per calcolare il numero di giri delle ruote fatte.

So che sto un po 'necroing questa discussione, ma se si voleva più accurato monitoraggio angolo, due mouse ottici sarebbe l'ideale. In pratica se si annullato il movimento nella stessa direzione, si sarebbe lasciato con la mozione che i topi ha fatto relativa alla vicenda. Da lì, sarebbe solo qualche semplice matematica per determinare con precisione fino a che punto il 'bot si è trasformata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top