- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 9 von 9

Thema: RP6 verrechnet sich?/Variablenübergabeproblem

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    19

    RP6 verrechnet sich?/Variablenübergabeproblem

    Anzeige

    Praxistest und DIY Projekte
    Code:
    #include "RP6RobotBaseLib.h"
    #include <math.h>
    
    int16_t x_start = 0;
    int16_t y_start = 0;
      
    int main (void) 
      {
      initRobotBase();
      	
      int16_t x_ziel = 500;
      int16_t y_ziel = 500;
      
      int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
      int16_t c = (y_ziel - y_start) / sin(alpha2);
      
      char* c2 = "";
      dtostrf(alpha2, 10, 0, c2);
    
      writeString(c2);
      writeString_P("\n"); 
      
      while (true)
        {
    	}
      return 0;
      }
    Hallo,
    wenn ich x_start u. y_start außerhalb von main definiere, kommt bei alpha2 44 raus. Wenn ich x_start u. y_start innerhalb definiere, kommt 45 raus. Richtig ist 45. Wieso ist das so? x_start u. y_start sind ja in der main funktion trotzdem noch 0, auch wenn sie außerhalb definiert werden.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Hast du das Programm mal im AVR-Studio-Simulator laufen lassen, was da rauskommt? Bzw. versuch mal, die beiden Variablen sowohl innen als auch aussen mit "volatile" zu deklarieren, ob dann beide Male das gleiche rauskommt.
    #ifndef MfG
    #define MfG

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    25.03.2006
    Ort
    Darmstadt
    Alter
    33
    Beiträge
    522
    dtostrf erwartet einen Zeiger auf einen Block aus mehreren Zeichen, wo der ASCII-String gespeichert werden soll. In Deinem Fall ist da aber kein Platz für den String, weil dieser genau 0 Zeichen aufnehmen kann (""). Deshalb wird Speicher von anderen Variablen beim Aufruf von dtostrf überschrieben und es kommt zu dem. o.g. Verhalten.

    Wenn die beiden Variablen x_start und y_start außerhalb der main deklariert sind, ergibt das Ganze ein anderes Speicherlayout als wenn sie in der main deklariert sind, weshalb es bei der einen Variante zufälligerweise richtig funktioniert.

    -> Lege ein Array mit genügend Elementen an, damit der mit dtostrf erzeugte String auch Platz darin hat.

    Code:
    #include "RP6RobotBaseLib.h"
    #include <math.h>
    
    int16_t x_start = 0;
    int16_t y_start = 0;
     
    int main (void)
      {
      initRobotBase();
         
      int16_t x_ziel = 500;
      int16_t y_ziel = 500;
     
      int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
      int16_t c = (y_ziel - y_start) / sin(alpha2);
     
      char c2 = [12]; // <---- Platz für max. 11 Zeichen
      dtostrf(alpha2, 10, 0, c2);
    
      writeString(c2);
      writeString_P("\n");
     
      while (true)
        {
       }
      return 0;
      }

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    19
    Code:
    #include "RP6RobotBaseLib.h"
    #include <math.h>
    
    int16_t alpha = 0;
    
    void punkt (int16_t x_start, int16_t y_start)
      {
      int16_t x_ziel = 500;
      int16_t y_ziel = 500;
      
      int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
      
      if (alpha < alpha2)
        {
    	rotate(50, RIGHT, alpha2 - alpha, true);
    	}
      else if (alpha > alpha2)
        {
    	rotate(50, LEFT, alpha - alpha2, true); 
    	}
      
      alpha = alpha2;
      
      int16_t c = (y_ziel - y_start) / sin(alpha2);  
      
      changeDirection(FWD);
      int16_t s_left = getLeftDistance();
      moveAtSpeed(80,80);
      while (getLeftDistance() - s_left < DIST_MM(c))
        {
    	task_RP6System();
    	}
      moveAtSpeed(0,0);
      }
      
    int main (void)
      {
      initRobotBase();
      powerON();
    
      punkt(0,0);
      
      while (true)
        {
        task_RP6System();
        }
      return 0;
      }
    So geht mein Script. Bisjetzt hat kein Lösungsweg funktioniert. Von main soll ein Punkt übergeben werden, zu dem dann gefahren wird. Wenn ich x_start u. y_start in punkt definiere funktioniert alles. aber sobald ich es außerhalb mache, geht es wieder nicht. Der Roboter fährt dann einfach "unendlich" geradeaus.

    Der Fehler muss in
    Code:
    int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
    liegen.

    Wenn ich in
    Code:
    int16_t c = (y_ziel - y_start) / sin(alpha2);
    alpha2 durch 45 ersetzte fährt er nämlich die richtige Strecke, und nicht "unendlich".

    Hoffe ihr könnt mir helfen.

  5. #5
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    41
    Beiträge
    2.009
    Wie gross ist denn bei dir geschätzt die Differenz (x_ziel - x_start) und wie genau sieht M_PI aus? Ich vermute, dass er da einfach die Nachkommastellen fallenlässt.
    #ifndef MfG
    #define MfG

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    19
    y_ziel - y_start sollte hier 500 sein und M_PI ist einfach Pi.
    Aber ich habe keine Ahnung, wie das weiterhelfen soll. Denn wenn ich x_start u. y_start innerhalb der funktion definiere, funktioniert es ja. Bloß wenn ich x_start... außerhalb definiere gehts net.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    19
    Ich habs jetzt gelöst.

  8. #8
    Erfahrener Benutzer Roboter Genie Avatar von HeXPloreR
    Registriert seit
    08.07.2008
    Ort
    Bad Bramstedt
    Alter
    45
    Beiträge
    1.369
    Sehr gut gemacht.

    ...sagts Du uns kurz woran es nun gelegen hat, damit andere diesen Fehler möglicherweise schneller finden oder vermeiden können.

    Vielen Dank vorab.


    mfg

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    28.05.2010
    Beiträge
    19
    Code:
    double parameter = (y_ziel - y_start)/(x_ziel - x_start); 
    double alpha2 = atan(parameter) * 180/M_PI;

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad