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.
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.
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.
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;
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.