- Labornetzteil AliExpress         
Ergebnis 1 bis 7 von 7

Thema: Umgebungsbild erstellen

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205

    Umgebungsbild erstellen

    Anzeige

    Praxistest und DIY Projekte
    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.
    Code:
    #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);
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    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.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Trotzdem danke,
    übrigens das mit der Grad-Zahl is es nicht. Ich habe schon alle möglichen Werte ausprobiert.

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    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
    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
    Nichts existiert durch sich allein!
    Bild hier  

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    39
    Beiträge
    1.516
    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?

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    04.03.2010
    Beiträge
    205
    Super danke, \/
    Jetzt funktioniert alles perfekt.
    Hier nun der vollendete und funktionierrende Code.
    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);
    }
    Nichts existiert durch sich allein!
    Bild hier  

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests