PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 verrechnet sich?/Variablenübergabeproblem



johannes_b
29.05.2010, 19:54
#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.

Jaecko
29.05.2010, 20:03
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.

p_mork
29.05.2010, 21:01
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.


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

johannes_b
30.05.2010, 20:14
#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

int16_t alpha2 = atan((y_ziel - y_start)/(x_ziel - x_start)) * 180/M_PI;
liegen.

Wenn ich in

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.

Jaecko
30.05.2010, 21:00
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.

johannes_b
30.05.2010, 22:42
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.

johannes_b
31.05.2010, 19:03
Ich habs jetzt gelöst.

HeXPloreR
31.05.2010, 19:17
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

johannes_b
01.06.2010, 13:33
double parameter = (y_ziel - y_start)/(x_ziel - x_start);
double alpha2 = atan(parameter) * 180/M_PI;