PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 Hinderniss umfahren



RoboNull
14.04.2010, 17:41
Hallo,

2 Fragen.

1) Wie kann mein RP6 ein Hinderniss umfahren?
Erkennen und darauf reagieren ist nicht das Problem.
Er soll um 45 Grad nach links (oder rechts) fahren und dann wieder geradeaus. Das ist mein Problem.
moveAtSpeed(10,70); z.B.
Aber wie kann ich den um 45 Grad wenden lassen?
Oder eben nur für sagen wir 2 Sekunden?
Danach sollte er wieder gerade weiter fahren.



2) Wie kann mein RP6 auf IR Strahlen, welche von einem anderen Gerät abgesendet werden, reagieren?


Grüße

Fabian E.
14.04.2010, 18:52
Hast du dir mal die Anleitung durchgelesen und die Beispielprogramme angesehen? Das wird das alles beschrieben...

Martinius11
14.04.2010, 18:56
die funktion fürs drehen ist:

rotate(70, RIGHT, 45, true);

er dreht sich mti 70 um 45°

Fabian E.
14.04.2010, 20:19
Wobei vorallem beim Drehen die Werte absolut nicht genau sind. Je nach Schlupf auf dem Untegrund kann der RP6 den Winkel einfach nicht genau messen.

RoboNull
15.04.2010, 07:01
die funktion fürs drehen ist:
rotate(70, RIGHT, 45, true);
er dreht sich mti 70 um 45°

Vielen Dank für die konstruktive Antwort.
ist das Eventbedingt?
Wenn ich schreibe:



rotate(70,RIGHT,45,true);
moveAtSpeed(70,70);

Führt der Roboter dann seine Drehung zu Ende und fährt dann wieder gerade aus, oder würde er sofort gerade aus fahren?


Danke

Martinius11
15.04.2010, 09:28
nein erfährt dann normal weiter

RoboNull
15.04.2010, 11:28
nein erfährt dann normal weiter
Wie müsste ichs dann anpassen, dass er sich erst um 45 Grad dreht und dann weiterfährt (gerade aus) ?

TrainMen
15.04.2010, 12:25
Hi,
probiere es doch mal aus !
schieb den RP6 auf den Tisch so wie er fahren soll und such dann den entsprechenden Befehl im Handbuch.
Trainmen

RoboNull
16.04.2010, 18:58
int main (void)
{
initRobotBase();



setACSPwrHigh(); // Wir stellen die IR Sensoren auf eine hohe Reichweite
powerON(); // Sensoren einschalten

writeString_P("Starting \n");

while (true)
{
task_motionControl();
task_ADC();

moveAtSpeed(70, 70);
startStopwatch1();

if (getStopwatch1() > 3000)
{
rotate(70, LEFT, 90, true);
setStopwatch1(0);

}


}

return 0;

}

Sollte der Roboter nicht gerade aus fahren. Nach 3 SEkunden sich um 90 Grad nach Links drehen und dann wieder gerade aus fahren? (und das unenedlich lange)

Oder hab ich einen Denkfehler?
Vielen Dank schon mal


Grüße

roboter14
16.04.2010, 19:38
Sollte der Roboter nicht gerade aus fahren. Nach 3 SEkunden sich um 90 Grad nach Links drehen und dann wieder gerade aus fahren? (und das unenedlich lange)

Was macht er denn sonst?

RoboNull
16.04.2010, 20:15
Sollte der Roboter nicht gerade aus fahren. Nach 3 SEkunden sich um 90 Grad nach Links drehen und dann wieder gerade aus fahren? (und das unenedlich lange)

Was macht er denn sonst?
Der Roboter fährt geradeaus. Nach 3 Sekunden wendet er um 90Grad nach links, dreht sich dann aber immer im Kreis weiter. (also er fährt nur noch links).


Grüße

Martinius11
16.04.2010, 22:21
du musst halt nach rotate wieder moveAtSpeed machen

RoboNull
17.04.2010, 08:11
du musst halt nach rotate wieder moveAtSpeed machen
Warum bitte? Wenn das C sein soll, dann ist das korrekt!



task_motionControl();
task_ADC();

moveAtSpeed(70, 70);
startStopwatch1();

if (getStopwatch1() > 3000)
{
rotate(70, LEFT, 90, true);
setStopwatch1(0);

}

Wenn der Counter 3 Sekunden erlangt hat, dreht sich der Roboter nach Links (90 Grad). Dann wird der Counter auf 0 gesetzt. Die Programm ausführung springt wieder zur task_motionControl(), da wir uns in einer while (true) Schleife befinden. Dann wird das moveAtSpeed(70, 70) ausgeführt und nach 3 Sekunden fallen wir wieder in den IF Zweig.


Grüße

fabi202cool
17.04.2010, 08:31
Hi RoboNull,

probiers mal hiermit:


#include "RP6RobotBaseLib.h"

void hinderniss(void)
{
if (!obstacle_left && !obstacle_right && !bumper_left && !bumper_right) // Wenn nichts vorliegt ...
{
changeDirection(FWD);
moveAtSpeed(75,75);
}
if (obstacle_left && obstacle_right) // Wurde ein hinderniss erkannt ...
{
move(80, BWD, DIST_MM(200), BLOCKING); // ... 200mm mit der Geschwindichkeit 80 zurückfahren
rotate(80, RIGHT, 45, BLOCKING); // ... um 45 grad nach Rechts drehen mit der Geschwindichkeit 80

}
}

int main(void)
{
initRobotBase();
powerON();
setACSPwrMed(); // ACS auf Normale Entfernung

while(true)
{
hinderniss();
task_RP6System();
}
return 0;


}

gruß Fabi