Erfahrungen zu RTH und PosH von MultiWii mit I2C-Nav Modul und GPS

wolkenloser

Erfahrener Benutzer
#61
Also, ich sehe zumindest daß Du keine Satelliten angezeigt bekommst.
Bei mir bekomme ich auch auf dem Dachboden teilweise 9 Sats angezeigt.

Deine Gui kenn ich jetzt nicht, aber wenn ich SAT FIX habe, zeigt mir die GUI auch die Kooridinaten.
Wenn Das bei dir nicht klappt ist es kein Wunder das sich nix tut....
 
#62
Hallo wolke

Ich habe nur gleich am Anfang die Scrennshots gemacht und ich bin im Keller und bekomme noch 7 Sateliten. Hast du vielleicht noch andere Tipps. Die mir helfen können.
 
Zuletzt bearbeitet:
#63
Hi zusammen.
Ich möchte diesen Thread mal wieder zum Leben erwecken.

Ich habe ein
Crius SE v1 (mit multiwii 2.3)
i2c-Nav-Modul (mit I2C_GPS_NAV_v2.2Beta1-r62)
CRIUS CN-06 GPS Receiver

Fliege das Board seit ein paar Monaten erfolgreich, nur das GPS lag bis vor kurzem in der Schublade und soll nun endlich ran!

Nachdem ich mich damit jetzt ein paar Tage beschäftige, frage ich mich ob diese Kombination mit den I2C-Nav-Modul was taugt?!?! Oder soll ich mir besser ein "Multiwii Pro" oder AIO besorgen, da bei diesen FCs das I2C-Board wegfällt?

Gruß, Thomas
 

Olly

Hubsan-Hoover
#65
Hi,

also der 32U4 hat wenig Speicher, da dürftest Du Probleme bekommen den Code für die ganzen GPS Geschichten drin unter zu bringen.
 
#66
Hi.
Kann mir denn einer sagen, was das mit den "Overflow bei 654m" bei dem I2C-Nav-Modul auf sich hat? Hier im Forum wurde es auch schonmal erwähnt und habe es auch selbst irgendwo in den release-notes oder im Code gelesen (finde die Stelle leider nicht wieder).

Wie äußert sich das denn? Darf ich mit angeschlossenem GPS nicht weiter als 654m rausfliegen?

Das ist der Hauptgedanke der mich zu der Überlegung brachte mir ein Board zuzulegen, bei dem ich das GPS direkt seriell mit dem FC verbinden kann.

Gruß, Thomas
 

Q-Man

Erfahrener Benutzer
#67
Hallo Thomas,

Das liegt am verwendeten Variablen Typ in der I2C_GPS_NAV.ino:
uint16_t distance_to_home; // distance to home in cm

Da ich mal davon ausgehe, das du im Programmieren wenig Erfahrung hast, hole ich wein wenig weiter aus.
Die Variable hat den Namem distance_to_home bekommen.
Es handelt ist hier um eine ganzahlige Integer Variable INT, das heist keine Kommastellen, z.b. -801, 0, 1, 66, 4000
Das U steht für unsigned, also kein Vorzeichen. Die kleinste Zahl ist damit 0.
Die 16 sagt, das es die Variable 16bit groß ist. Damit lassen sich 2^16=65536 Zahlen darstellen.
Es können also alle Zahlen von 0 bis 65535 in dieser Variable gespeichert werden. Achtung, die Null ist auch eine der 65536 Möglichkeiten, daher ist die größte Zahl 65536-1=65535. (Ohne das U wäre es −32.768 bis 32.767)
Die maximale Entfernung wäre damit 65535cm=655,35m

Jetzt zum Overflow:
Stell dir vor dein Copter ist genau 655,35m entfernt.
Die Variable distance_to_home ist also 65535. So was passiert wenn du 1cm weiter fliegst?
Dann ist distance_to_home wieder null. Um das besser zu verstehen zeige ich dir das mal Binär (also nur 0 und 1 sind möglich). Es sind 16 Bits (=2 Byte) in der Tabelle abgebildet. Die ersten 5 Zeilen (0 bis 4) zeigen dir wie das mit dem Heraufzählen geht, damit du verstehst was bei 65535+1 passiert. Da für die rote EINS kein Speicherplatz da ist, kennt die Variable sie nicht, es ist also alles wieder auf Null (sie ist hier nur zum Verständniss angegeben).

[TABLE="width: 250, align: left"]

[TR]
[TD]Dezimal[/TD]
[TD]Binär[/TD]
[/TR]

[TR]
[TD]0[/TD]
[TD]0000.0000 0000.0000[/TD]
[/TR]

[TR]
[TD]1[/TD]
[TD]0000.0000 0000.0001[/TD]
[/TR]

[TR]
[TD]2[/TD]
[TD]0000.0000 0000.0010[/TD]
[/TR]

[TR]
[TD]3[/TD]
[TD]0000.0000 0000.0011[/TD]
[/TR]
[TR]
[TD]4[/TD]
[TD]0000.0000 0000.0100[/TD]
[/TR]
[TR]
[TD]65534[/TD]
[TD]1111.1111 1111.1110[/TD]
[/TR]
[TR]
[TD]65535[/TD]
[TD]1111.1111 1111.1111[/TD]
[/TR]
[TR]
[TD]65536[/TD]
[TD]1 0000.0000 0000.0000[/TD]
[/TR]
[TR]
[TD]65537[/TD]
[TD]1 0000.0000 0000.0001[/TD]
[/TR]
[/TABLE]

Man hat diese Entfernung angenommen, da man sich dachte, das du dein Modell nie soweit fliegen lassen wirst, da du es nicht mehr sehen kannst... Das war wohl "zu Kurz" gedacht.

So, ich hoffe das ich niemanden mit dem Ausflug in die Basics gelangweilt habe.
 

Olly

Hubsan-Hoover
#70
Der ATmega328 hat 32k Flash, 1k EEPROM, 2k SRAM
Der ATmega32U4 hat 32k Flash, 1k EEPROM, 2.5k SRAM
OK, hab mich falsch ausgedrückt: Wenn man alle benötigten Funktionen in der MultiWii aktiviert und dann den Sketch kompiliert, ist er meist zu groß für den 328 oder 32U4. Da muss man schon diverse Klimmzüge im Code machen, damit das dann passt. Z.B. anderen (kleineren Bootloader usw.)
Über die Forums-Suche solltest Du dazu was finden.

Gruß

Olly
 
#71
Hey Q-Man,
danke für deine umfangreiche Antwort.

Ok, Variablendeklaration als "UInt16". Es ist alles gut, solange man mit seinem Copter im Radius kleiner 654m bleibt.

Ohne dass ich mir jetzt den Programm-Code ansehe (und versuche diesen zu verstehen)...

Mich interessiert wie sich diese Grenze in der Praxis äußert und dazu mal drei vorgefertigte Szenarien:

VORAB. Der Copter ist bestückt mit einem Atmega328-Board und I2C-GPS!! Innerhalb des Radius von 654m funktioniert RTH und PH wunderbar. Ich fliege in diesem Radius herum (natürlich mit FPV) und fliege und fliege und fliege.... ohne zu wissen, wie mir geschieht überfliege ich den Radius von 654m. Was passiert jetzt?

Szenario 1:
Der pfiffige Programmieren hat erkannt, dass seine Variable nur eine Entfernung von 654m zuläßt. Ein Übertrag in die nächste Bit-Stelle wird verhindert. Jedoch mit den Nachteil, dass eine absolute Entfernung (Startkoordinate --> aktuelle Position) nicht mehr bestimmt wird.
Der Kopter könnte also diesen Schwellwert überfliegen. PH würde weiter funktionierten, RHT leider nicht mehr.

Szenario 2:
Wie oben, nur dass bei Aktivieren einer "GPS-Funktionalität" der Copter unkontrollierbar wird und macht was er will.

Szenario 3:
Der nicht ganz so ausgeschlafenen Programmierer, definierte sein "UInt16" auf Grund vorhandener Hardware. Leider vergaß dieser sich Gedanken über den Wertebereich hinaus zu machen.
Der erfindungsreiche Hobby-FPVler überfliegt dank Mega-Helix die Grenze von 654m. Im Microproz führt dies nun zu undefinierten Zuständen. Der Multicopter reagiert nicht auf Steuersignale, bekommt ein Eigenleben und verschwindet um sich mit gleichgesinnten Multicoptern auf den Angriff auf die Weltbevölkerung vorzubereiten. ;)


Was ist die naheliegendste Antwort? Hat das mal jemand ausprobiert?

Gruß, Thomas
 

Q-Man

Erfahrener Benutzer
#72
Hi Olly,

ich habe im Compiler aridiuno leider keine anderen unterstützten Controller gefunden...
Das man nicht alles aktivieren kann habe ich schon gesehen...

Es ging mir aber eigentlich darum eine schnellere CPU zu finden.

Grüße Jörg
 

Q-Man

Erfahrener Benutzer
#73
und wenn man nun einfach ein uint32 daraus macht? ^^
Man müsste den ganzen Code ändern, denn überall wo man auf diesen Wert zugreift oder mit ihm Rechnet muss man die Variablen ändern.

Neben dem doppelten Speicherplatz der benötigt wird, dauern die Berechnungen auch viel länger...

So einfach ist es leider nicht ;-)
 

Q-Man

Erfahrener Benutzer
#74
Hallo Thomas,

Dieser Overran der Variable hat keinen Einfluss auf das Flugverhalten. Und solange RTH und PH nicht aktiv sind, passiert nix.
Die Entfernung ist nur für RTH wichtig. Daher würde ich mal folgendes Vermuten.
Szenario 1: Auch ohne pfiffigen Programmierer würde nix passieren. PH geht, RTH würde einen anderen Heimatpunkt anfliegen
Szenario 2: Macht er das nicht auch ohne GPS ? :)
Szenario 3: Der Schwarm erwacht...

Grüße Jörg
 
FPV1

Banggood

Oben Unten