Du täuscht dich... siehe hierWenn mich nicht alles täuscht [...]
Mal wieder zurück zur eigentlichen Fragestellung...
Mittlerweile haben wir ja rausbekommen, wie die Berechnung des Winkels aus den beiden X- und Y-Werten in Bascom erfolgen könnte:
Ergebnis = Atn2(yresult , Xresult)
berechnet aus den beiden Eingangswerten den Arcustangens in Bogengrad und soll dabei - laut BASCOM-Hilfe - auch korrekt mit den 4 möglichen Quadranten umgehen können, im Gegensatz zur Funktion "atn(Yresult / Xresult)", bei der man sich um den zutreffenden Quadranten selbst kümmern muss.
Um aus dem Atn2-Ergebnis in Bogengrad einen Winkel zwischen 0..360° zu machen, muss noch gewandelt werden. Auch dafür hat Bascom eine Funktion parat:
Winkel = rad2deg(Ergebnis)
Fertig, sollte man meinen... Wäre da nicht ein kleines Problem in BASCOM, mit dem ich schon seit Monaten rumkämpfe
Weiß jemand hier den Grund, warum sich Bascom gegenüber EXCEL verrechnet, oder noch besser, wie man übereinstimmende Ergebnisse bei den beiden Berechungen bekommt? Irgend etwas Entscheidendes muss ich übersehen haben...
Nachtrag:
Pikanter Weise hat Excel ebenfalls beide Funktionen.
ATN(Y/X) ist parameterkompatibel aufgebaut (gleiche Reihenfolge der Parameter), ATN2(X;Y) hingegen erwartet die beiden Parameter in umgekehrter Reihenfolge gegenüber BASCOM!! Da muss man (bei vergleichenden Untersuchungen) auch erst mal drauf kommen
Nachtrag2:
Mein Taschenrechner gibt Excel Recht
Geändert von deHarry (12.08.2012 um 19:17 Uhr)
Hallo!
Also ich kann bei BASCOMs atn2 keine Probleme erkennen.
liefert bei mirCode:X = 1 Y = 1 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww
w = 0.78540468 (= pi/4)
ww = 45.000373839
gibtCode:X = -1 Y = 1 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww
w = 2.356188056 (= pi * 3/4)
ww = 134.999618528
und
gibtCode:X = 1 Y = -1 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww
w = -0.78540468 (= - pi/4)
ww = -45.000373839
Wobei w und ww natürlich Singles sind.
Und das ist so eigentlich auch korrekt. Was Excel da macht weiß ich nicht, kann mir aber nicht vorstellen dass da was schiefgeht...
Gruß
Malte
Geändert von malthy (12.08.2012 um 19:50 Uhr)
Sorry, war etwas zu spät mit meinem Posting... Wenn's denn einfach nur an der Parameterreihenfolge gelegen hat. Dann ist die Welt ja wieder in Ordnung...
Hi Malte,
nein, nein, so einfach ist das leider nicht.
Das in meinem Beitrag oberhalb der beiden Nachträge geschriebene gilt immer noch, ich wollte nur vermeiden, dass ihr diese "Fallen" erst aufdecken müsst
So, deine Beispiele:
X=1, Y=1 ist klar. Beides positiv, also Quadrant Rechts oben, 45°. Keine Einwände.
X=-1, Y=1... also Quadrant links oben, würde ich meinen, 135°. Auch ok. Excel errechnet damit ebenfalls 135°.
X=1, Y=-1... Quadrant rechts unten, also -45°. Excel meint hier auch -45°.
Zusammen genommen interpretiere ich das so:
Solange man bei einfachen Zahlen bleibt (+/-1 z.B.) stimmt alles wie im Lehrbuch.
Jetzt nimm aber mal
X=0,0195 (ist positiv)
Y=0,2951 (ist auch positiv)
Die Erwartungshaltung ist ein Winkel im 1. Quadranten, also zwischen 0 und 90 Grad. Da X sehr klein und Y nur klein ist, eher Richtung 90 Grad.
Excel errechnet 86,22 Grad mit der ARCTAN2-Funktion, was unsere Erwartungshaltung gut befriedigt.
Mein Programm in Bascom errechnet daraus 186 Grad.
Was errechnest du in BASCOM?
Ich habe schon alles zigmal kontrolliert, Variablen vor und hinter den Singles für die X- und Y-Werte auf Bereichsüberschreitungen oder Ähliches überprüft, aber keine Fehler gefunden.
Hallo Harald!
Leider kann ich das Problem nach wie vor nicht reproduzieren. Ich habe mal dein Wertepaar verwendet, nämlich folgendermaßen (very quick and very dirty... ):
ich bekomme dann als AusgabeCode:Dim X As Single Dim Y As Single Dim W As Single Dim Ww As Single X = 0.2951 Y = 0.0195 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww Print X = -0.2951 Y = 0.0195 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww Print X = 0.2951 Y = -0.0195 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww Print X = -0.2951 Y = -0.0195 W = Atn2(y , X) Ww = Rad2deg(w) Print W Print Ww Print End
Wenn ich das Ganze genauso mit Matlab mache, bekomme ichCode:0.065983471 3.780575748 3.075609442 176.219436644 -0.065983471 -3.780575748 -3.075609442 -176.219436644
M. a. W. das Gleiche! (Habe mein Matlab so eingestellt, dass die Konsolenausgabe auf vier Stellen nach dem Komma gerundet ist.)Code:0.0660 3.7806 3.0756 176.2194 -0.0660 -3.7806 -3.0756 -176.2194
Wenn man sich das jetzt nochmal überlegt, macht das auch Sinn:
Das erste Wertepaar entspricht einem Punkt im ersten Quadranten (rechts oben, x>0; y>0), im Bereich von 0 bis pi/2 (0 - 90°). Weil der y-Wert klein (0.0195) ist, nah an der x-Achse. Das Ergebnis 3.780575748(°) passt also.
Gleichermaßen für den zweiten Quadranten (oben links, x<0; y>0), Bereich von pi/2 bis pi (90°-180°). Der Wert muss immernoch nahe an der x-Achse liegen (kleiner y-Wert), jetzt aber auf der anderen Seite, also nah an 180°. Ergebnis ist 176.219436644(°), passt also auch.
Für den dritten Quadranten (links unten, x<0; y<0), Bereich -pi bis -pi/2 (-180° bis -90°) liegt der Punkt immernoch nahe an der x-Achse, also nahe an -180°. Ergebnis ist -176.219436644(°), passt also auch (Achtung: der Wert wird in dem Bascom Code als letztes berechnet).
Bleibt noch der vierte Quadrant (rechts unten, x>0; y<0), der von -pi/2 bis 0 (-90° bis 0°) läuft. Der Punkt muss wieder nah an der x-Achse, also nahe an 0° aber eben im Negativen liegen. Ergebnis ist -3.780575748(°). Treffer.
Also so weit ich sehen kann, passt das bei mir immernoch alles. Und: ich mach schon öfters mal Mist, Matlab aber nie. Und Matlab und ich sind uns hier (ausnahmsweise) mal einig
Ich habe das Ganze übrigens nur mit dem Bascom Simulator getestet. Allerdings verwende ich den atn2 häufig, natürlich dann auf "echter" Hardware (inverse Kinematik bei meinem Hexapoden und Deltaroboter zB), ich habe noch nie Probleme damit gehabt...
Gruß
Malte
P.S.: Ah, sorry, jetzt habe ich deinen x-Wert als y verwendet und deinen y-Wert als x. Ändert aber an der Argumentation nichts... Für x = 0.0195 und y = 0.2951 (deine Werte) sagt Bascom bei mir übrigens 86.219429015(°)
Geändert von malthy (12.08.2012 um 23:19 Uhr) Grund: Ergänzung
Hi Malte,
Super Service, vielen Dank für´s schnelle Ausprobieren!!! (ich hoffe, das war wirklich schnell...)
So, da haben wir doch schon mal ein Schweinderl...
Auf meiner Hardware errechnet Bascom als Winkel 186°. Ich hoffe inständig, dass zwischen Simulation und Hardware kein Unterschied besteht.
Ich tue mich mit meinem Programm etwas schwer mit der Simulation, weil ich mich durch meterweise Menus kämpfen muss und die Navigation im Menu per Hardware-Taster erledige. Das ist Frust erzeugend, wenn man mehrere Werte im Hunderter-Bereich über den Debugger eingeben muss... Das sind die Ausgangswerte, aus denen das Programm die X- und Y-Werte berechnet, aus denen dann der Winkel abgeleitet werden soll.
Ich werde mal ein kleines Testprogramm erstellen müssen, jetzt, wo ich weiß, dass Bascom offenbar auch richtig rechnen kann...
Meine Idee, dass ich durch falsche Deklarationen Speicherbereiche überschreibe, die die Ausgangswerte für die Berechnung halten... Kann ich in Bascom irgendwie (z.B. in einem Listung der Speicherbelegung) überprüfen, ob sowas passiert? Kommen da idealer Weise Warnungen?
Hallo Malte,
ich habe eben den Fehler gefunden. Mein Gott, kann ein einzelner Mensch vernagelt sein...
Das ist ein Auszug aus meiner Berechnung in BASCOM:
Und jetzt des Rätsels Lösung:Code:Part2 = Atn2(yresult , Xresult) Korrekturwinkel = Rad2deg(part2) ' Umrechnung von Radian in Grad Winkelint = Korrekturwinkel ' Single -> Integer Winkel = Str(winkelint) C = Len(winkel) C = 4 - C ' ein bisschen Voodoo um den Doppelpunkt immer an der gleichen Stelle zu halten ' Werte ausgeben Locate 2 , C Lcd Korrekturwinkel ; "{223}: " ; Masse ; " - q:" ; Quadrant
Den auszugebenden Winkel will ich als Integer (nur Vorkommastellen) haben. Daher die Umwandlung in einen String, einen besseren Trick kenne ich nicht.
Den Offset "C" errechne ich, damit der Doppelpunkt hinter dem "°"-Zeichen ("{223}") immer in der gleichen Spalte steht.
Habe ich einen zweistelligen Vorkomma-Wert in der Single-Variablen Korrekturwinkel (86,22 z.B.), dann startet die Ausgabe folglich in Spalte 2.
Bei einem einstelligen Wert startet die Ausgabe in Spalte 3.
Jetzt die Stelle, wo es mir den Trick zerrissen hat...
Im Menu-Framework wird die zweite Zeile mit einem Dummywert beschrieben:
...was zur Laufzeit dann so aussieht:Code:Data "Korrekturmasse" Data "133{223}: 0,333 {003}" ' "133°: 0,333"
1. Zeile: "Korrekturmasse"
2. Zeile: "133°: 0,333"
Diese zweite Zeile steht dann im Display, wenn meine Routine bei dem Locate 2, C ankommt.
Das tut sie dann auch, sprich, der Schreibzeiger des Display wird auf Spalte 2 gestellt, und dort wird dann "86" ausgegeben, anschließend noch "°" und der Rest der Werte.
Im Display steht aber "186°:...", weil die "1" einfach stehen geblieben ist
Bei einstelligen Ergebnissen stand dann schon mal einhundertpaarunddreißig im Display (139 statt 9, Differenz 130!!! ) und mein Glaube an das Gute im Atmel ist so nach und nach zwischen die Parkettbohlen diffundiert.
Ich habe mich schon sehr früh über die Differenz von 100 gegenüber den Excel-Ergebnissen gewundert, bin aber immer vor der finalen Erkenntnis irgendwo falsch abgebogen. 100 im Zusamenhang mit Winkeln (nicht Neugrad) erschien mir suspekt, aber es ist ja alles errechnet, also erst mal richtig...
Danke Malte, dass du meine Denke wieder in die richtige Richtung gebogen hast!
Ich habe vor lauter Winkeln und Kreisen den Gesamtblick verloren und nur noch an der Mathematik gezweifelt.
Lesezeichen