PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Umgebungsbild erstellen



Mc Delta
06.03.2010, 11:31
Hey,
Ich bin neu hier in dem Forum und habe seit kurzem auch einen RP6!
Ein paar einfache Programme habe ich auch schon geschrieben. Außerdem habe ich 3 zusätzliche LEDs angeschlossen.
Naja, jedenfalls wollte ich mithilfe des RP6 eine Art Bild der Umgebung erstellen lassen. Dabei ist mir klar, dass die Werte nicht sehr genau sein können. Mir gehts erstmal nur um das Prinzip. Man könnte ihn die benötigten Werte in Form von Nullen und Einsen in einem Array speichern lassen. Das Program dazu habe ich auch schon nur auch ein Problem undzwar hört RP6 nicht auf sich zu drehen. Die gespeicherten Werte kann ich aber ohne Weiteres abfragen.
Wäre nett wenn ihr euch den Code anschaut und Verbesserungsvorschläge schreibt.


#include "RP6RobotBaseLib.h"
void acsStateChanged(void)
{
uint8_t unserTollesArray[36];
uint8_t i;
uint8_t s;
for(i = 0; i < 36; i++)
{
s=2;
rotate(100, LEFT, 1,true);
if(obstacle_left && obstacle_right)
{
s=(s-1);
}
else
{
s=(s-2);
}
unserTollesArray[i]=s;
writeString("i=");
writeInteger(unserTollesArray[i], DEC);
writeString(" Durchgang:");
writeInteger(i, DEC);

writeChar('\n');
}
}


int main(void)
{
initRobotBase();
ACS_setStateChangedHandler(acsStateChanged);
powerON();
setACSPwrHigh();
while(true)
{
task_ACS();
}
return(0);
}

Dirk
06.03.2010, 15:13
undzwar hört RP6 nicht auf sich zu drehen.

1. Eine Drehung um 1° mit Speed 100 habe ich noch nicht probiert.
2. Nach dem Rotate würde ich erst mit "isMovementComplete()" testen, ob die Drehung fertig ist und erst, wenn die Funktion true zurückgibt, nach einem Hindernis gucken.

Gruß Dirk

EDIT: Sorry, aber du hast ja den blocking-Parameter true gesetzt. Also: Vergiß meinen Beitrag, das wars nicht.

Mc Delta
06.03.2010, 16:16
Trotzdem danke,
übrigens das mit der Grad-Zahl is es nicht. Ich habe schon alle möglichen Werte ausprobiert.

SlyD
08.03.2010, 19:47
Hallo,

> void acsStateChanged(void)

Du solltest sowas nicht in einem der Event Handler machen! Nur wenn Du genau weisst wie die funktionieren ;)
Das blockiert sonst ggf. alles andere.
Das steht übrigens auch in der Doku...


Pack das besser alles direkt in die Hauptschleife rein und frag dort den Status der Sensoren ab.


> task_ACS();


ruf statt dieser Funktion besser in der Hauptschleife einfach task_RP6System auf - das erledigt ALLES was wichtig für die Grundfunktionen ist.


> rotate(100, LEFT, 1,true);

so kleine Winkel funktionieren sowiso nicht zuverlässig da mit den Lib Funktionen immer beschleunigt und gebremst wird.

MfG,
SlyD

Mc Delta
09.03.2010, 15:28
Danke für den Hinweis!
Ich habe mich gerade drangemacht den code auszubessern aber jetzt tut sich garnichts. Er dreht sich nur einmal und das wars außerdem wird im Terminal die Meldung :Encoder (Or Motor) Malfunction affected channel: Left. angezeigt
Hier nun der verbesserte Code


#include "RP6RobotBaseLib.h"
void ugu(void)
{
initRobotBase();
uint8_t unserTollesArray[36];
uint8_t i;
uint8_t s;
for(i = 0; i < 36; i++)
{
s=2;
rotate(100, LEFT, 1,true);
if(obstacle_left && obstacle_right)
{
s=(s-1);
}
else
{
s=(s-2);
}
unserTollesArray[i]=s;
writeString("i=");
writeInteger(unserTollesArray[i], DEC);
writeString(" Durchgang:");
writeInteger(i, DEC);
writeChar('\n');
}
}


int main(void)
{
initRobotBase();
ugu();
powerON();
setACSPwrHigh();
while(true)
{
task_RP6System();
}
return(0);
}
//Verbesserungsvorschläge werden weiterhin dankendangenommen

SlyD
09.03.2010, 15:36
Hallo,

Du rufst Deine Funktion auf bevor Du überhaupt die Main Schleife ausführst!
Du hast da immer noch einen Drehwinkel von 1 drin - das funktioniert nicht mit diesem Antriebssystem bzw. mit der RP6Lib.
Und es muss immer task_RP6System in regelmäßigen Abständen aufgerufen werden!

MfG,
SlyD

PS: Schau Dir nochmal die Beispielprogramme in Ruhe an!

PPS:
Das Selftest Programm hast Du komplett durchlaufen lassen?
Bzw. die Drehgeber kontrolliert?

Mc Delta
09.03.2010, 18:12
Super danke, \:D/
Jetzt funktioniert alles perfekt.
Hier nun der vollendete und funktionierrende Code.


#include "RP6RobotBaseLib.h"
void ugu(void)
{
initRobotBase();
powerON();
setACSPwrHigh();
uint8_t unserTollesArray[36];
uint8_t i;
uint8_t s;
for(i = 0; i < 35; i++)
{
s=2;
rotate(20, LEFT, 10,true);
if((obstacle_left && obstacle_right) ||obstacle_left || obstacle_right)
{
s=(s-1);
}
else
{
s=(s-2);
}
unserTollesArray[i]=s;
writeString("i=");
writeInteger(unserTollesArray[i], DEC);
writeString(" Durchgang:");
writeInteger(i, DEC);
writeChar('\n');
}
}


int main(void)
{
initRobotBase();
ugu();
while(true)
{
task_RP6System();
}
return(0);
}