PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Himmelsrichtug ausrechnen aus X+Y Wert



toter_fisch
31.07.2012, 12:13
Hi, ich habe mir ein Kompassmodul von Pollin gekauft, das Hdmm01. Nun werte ich es mit diesem Code über Bascom aus:
http://www.mtahlers.de/download/mmc2120mg.bas

Jetzt kommen da Werte wie zb "2048 1990" also X=2048 und Y=1990.
Gibt es eine Formel (und wie heißt sie) um diese Werte in Grad umzurechnen?

Gruß toter_fisch

toter_fisch
31.07.2012, 13:06
Kann es sein dass man einfach nur x-y rechnen muss? Damit bekomme ich die Zahlen die daneben auf einem Nadelkompass stehen?!

toter_fisch
31.07.2012, 13:16
x-y stimmt jetzt irgendwie nur wenn der Kompass zwischen 80 und 120° steht? Dannach sind die Werte die durch x-y enstehen entweder viel zu groß oder viel zu niedrig?!

danimath
31.07.2012, 13:37
arc tan (y/x). auch hier (http://de.wikipedia.org/wiki/Arcustangens).

Aber was genau sind x und y?

viele Grüße
Andreas

toter_fisch
31.07.2012, 13:48
x und y? keine ahnung, aber wie schreibt man diese Formel jetzt in Bascom?

toter_fisch
31.07.2012, 14:07
wenn ich jetzt in den Taschenrechner eingebe (mit den schon oben gennanten Werten):

tan(1990/2048 ) = 1.464470239


Wieviele Grad sind das jetzt?

danimath
31.07.2012, 14:25
Das sieht nach "rad" aus, nicht nach Grad, Das musst Du noch umrechnen (https://de.wikipedia.org/wiki/Radiant_(Einheit)). Wie das in Bascom aussieht weiß ich nicht (ich habe mich immer geweigert Basic zu lernen ;)) - da musst Du in die Doku schauen, da sollte es ein Kapitel über trigonometrische Funktionen geben. Evtl. heißt die Funktion "atan". Aber wenn die beiden Werte nicht x und y in einem Koordinatensystem sind, dann ist das eh nicht zu gebrauchen - das solltest Du erstmal verifizieren.

viele Grüße
Andreas

oberallgeier
31.07.2012, 14:29
... tan(1990/2048 ) = 1.464470239 ... Wieviele Grad sind das jetzt?83,9080 Grad

PS: Gültigkeitsbereich beachten !

danimath
31.07.2012, 14:58
tan(1990/2048 ) = 1.464470239


nicht tan, sondern atan (oder tan^-1 oder so - ich kenne Deinen Taschenrechner nicht), also die Umkehrfunktion vom Tanges!!! Bei mir kommen etwa 44,1771° raus.

PICture
31.07.2012, 15:06
Hallo!

Bei mir kommt ungerundet 44,17708601° raus, müsste also stimmen. :cheesy:

danimath
31.07.2012, 15:15
Hallo!

Bei mir kommt ungerundet 44,17708601° raus, müsste also stimmen. :cheesy:

Klugscheissermodus ein:
Selbst das ist gerundet
Klugscheissermodus aus :cheesy::cheesy::cheesy:

toter_fisch
31.07.2012, 15:43
ok, jetzt habe ich hier in Bascom:

Zahl = Atn2(y , X)

Jetzt bekomme ich einen Fehler: Integer or Long expected for ABS()
Dabei wurde "Zahl" weiter oben als Integer deklariert?
Y und X wurden als Word deklariert. Was ist jetzt hier falsch?

oberallgeier
31.07.2012, 15:43
Ach du liebe Zeit . . . ich will jetzt nicht schreiben, wieviel absonderliche Modi eingeschaltet waren, als ich das gerechnet hatte. Das ist der Nachteil von mehrzeiligen Rechnerdisplays . . . Bitte um Entschuldigung

toter_fisch
31.07.2012, 15:45
habe jetzt alles als Single.. Funktioniert :D

toter_fisch
31.07.2012, 16:37
oh war wohl etwas voreilig. Jetzt findet Bascom im Code zwar keine Fehler mehr, das Ergebniss ist jedoch immer noch falsch.
Wie gesagt ich rechne es so aus:

Zahl = Atn2(y , X)

Aber auch wenn ich mit dem Taschenrechner (mein Ti 84 kennt irgendwie kein Atan) rechne kommt da das Ergebniss von vorhin raus. Kann mir jemand erläutern wie der Bascom-Code auszusehen hat, oder wie man in Visual Basic oder auf dem Taschenrechner diese Werte eingeben muss damit ich wenigstens mal ein richtiges Ergebniss rausbekomme :(

toter_fisch
31.07.2012, 16:43
also mit dem Taschnrechner bekomme ichs jetzt auch hin. Nur Bascom macht Probleme :( Welchen Befehl brauche ich hier?

Bammel
31.07.2012, 17:09
schön wäre wenn du mal dienen code zeigen würdest und dazu das was er ausrechnet...

hast du den auch mit rad2deg in grad umgerechnet?

wert = atn2(y,x)
wert = rad2deg(wert)

toter_fisch
31.07.2012, 17:52
Hier mal mein Code (eigentlich nur der von http://www.mtahlers.de/index.php/elektronik/sensoren/mmc2120mg#)


' beispielprogramm zum auslesen des MMC2120MG
' malte ahlers 2011
' weitere infos auf malteahlers.de
'
'
'
' compiler steuerung
$regfile = "m16def.dat"
$crystal = 16000000
$framesize = 64
$swstack = 64
$hwstack = 64
$baud = 19200
$lib "i2c_twi.lbx"
'


' - i2c
Config Twi = 400000
Config Scl = Portc.0
Config Sda = Portc.1
'
' konstanten
Const Cmp_w = &H60
Const Cmp_r = &H61
'
' variablen
Dim I As Byte
Dim Dat(5) As Byte
Dim X As Single
Dim Y As Single
Dim Zahl As Single
Dim K As Single


Config Portc.4 = Output
Portc.4 = 1


Config Portb.0 = Output
Beeper Alias Portb.0
Sound Beeper , 400 , 450
'
' hauptprog
I2cinit
'
Do
'
' * set/ reset coil *
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
'
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> set coil
I2cwbyte &B00000010
'
I2cstop
'
Waitms 1
'
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> reset coil
I2cwbyte &B00000100
'
I2cstop
'
Waitms 5
'
' * messung *
I2cstart
'
' sensor adressieren (schreiben)
I2cwbyte Cmp_w
'
' register adressieren
I2cwbyte &H00
'
' register manipulieren -> messung
I2cwbyte &H01
'
I2cstop
'
Waitms 5
'
I2cstart


I2cwbyte Cmp_w


' leseindex setzen
I2cwbyte &H00
'
I2cstart
'
' sensor adressieren (lesen)
I2cwbyte Cmp_r
'
For I = 1 To 4
' bytes 1-4 holen mit ack
I2crbyte Dat(i) , Ack
Next
'
' byte 5 holen mit nack
I2crbyte Dat(5) , Nack
'
I2cstop
'
' oberes nibble im high bytes löschen
Dat(2) = Dat(2) And &B0000_1111
Dat(4) = Dat(4) And &B0000_1111
'
' x-wert aus high- und lowbyte berechnen
X = Dat(2) * 256
X = X + Dat(3)
'
' y-wert aus high- und lowbyte berechnen
Y = Dat(4) * 256
Y = Y + Dat(5)




Zahl = Atn2(y , X)
Zahl = Rad2deg(zahl)
Print Zahl
Waitms 200


Loop
End




Es wird jetzt auch ein Wert ausgegeben, aber egal wie rum ich den Sensor drehe, es kommt immer eine Zahl um die 45,000000000 heraus.

Kann es sein das der Sensor kaputt ist oder vom Steckbrett gestört wird?

malthy
31.07.2012, 18:22
Hallo,

also grundsätzlich ist die Berechnung so wie von Bammel empfohlen richtig, das kann also nicht das Problem sein. Die Eingangswerte in den atn2 müssen Singles sein, ich glaube das hast du ja acuh schon bemerkt. Die Bascom Fehlermeldung wenn man da einen anderen Typ nimmt ist natürlich extrem dämlich und verwirrend... Lass dir doch am besten auch mal die Eingangswerte mit ausgeben (also X und Y). Wenn du konstant 45° bekommst, müssten X und Y gleich groß sein. Dann bekommt man schonmal eine Idee wo es eventuell hakt.

Gruß
Malte

WL
31.07.2012, 19:44
Hi, ich habe mir ein Kompassmodul von Pollin gekauft, das Hdmm01.

Wenn mich nicht alles täuscht ist das kein Kompass- sondern ein Beschleunigungssensor für 2 Achsen.

Damit wirst Du niemals einen Winkel (wie bei einem Magnetkompass) von 0-360° bekommen. :(

Der Winkel den Du damit berechnest bezieht sich auf den Erdmittelpunkt (in unbeschleunigtem Zustand / Ruhelage) !

malthy
31.07.2012, 20:08
Wenn mich nicht alles täuscht [...]

Du täuscht dich... ;-) siehe hier (http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html)

WL
31.07.2012, 20:30
Du täuscht dich... ;-) siehe hier (http://www.pollin.de/shop/dt/NTM4OTgxOTk-/Bausaetze_Module/Module/Kompassmodul_HDMM01.html)

Wieder dazugelernt...............
Danke ! :)

deHarry
12.08.2012, 17:59
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

malthy
12.08.2012, 18:17
Hallo!

Also ich kann bei BASCOMs atn2 keine Probleme erkennen.


X = 1
Y = 1
W = Atn2(y , X)
Ww = Rad2deg(w)
Print W
Print Ww

liefert bei mir
w = 0.78540468 (= pi/4)
ww = 45.000373839


X = -1
Y = 1
W = Atn2(y , X)
Ww = Rad2deg(w)
Print W
Print Ww

gibt

w = 2.356188056 (= pi * 3/4)
ww = 134.999618528

und


X = 1
Y = -1
W = Atn2(y , X)
Ww = Rad2deg(w)
Print W
Print Ww

gibt

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

malthy
12.08.2012, 18:18
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... :-)

deHarry
12.08.2012, 20:44
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.

malthy
12.08.2012, 21:35
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... ;-)):


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

ich bekomme dann als Ausgabe


0.065983471
3.780575748

3.075609442
176.219436644

-0.065983471
-3.780575748

-3.075609442
-176.219436644

Wenn ich das Ganze genauso mit Matlab mache, bekomme ich


0.0660
3.7806

3.0756
176.2194

-0.0660
-3.7806

-3.0756
-176.2194

M. a. W. das Gleiche! (Habe mein Matlab so eingestellt, dass die Konsolenausgabe auf vier Stellen nach dem Komma gerundet ist.)

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(°)

deHarry
13.08.2012, 18:36
Für x = 0.0195 und y = 0.2951 (deine Werte) sagt BASCOM bei mir übrigens 86.219429015(°)
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?

deHarry
13.08.2012, 20:09
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:

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


Und jetzt des Rätsels Lösung:
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:

Data "Korrekturmasse"
Data "133{223}: 0,333 {003}" ' "133°: 0,333"

...was zur Laufzeit dann so aussieht:
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!!! :shock:) 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 :-k 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.