SimpleWii Copter BETA

ronco

User
Hi,

ich experimentiere seit ner weile mit der WMP und dem Arduino. habe dabei eine möglichkeit gefunden die auslese und filter zeit deutlich kleiner zu halten (knap doppelt so schnell) und dennoch verwertbare daten zu bekommen :)

Da ich selbst meine copter nur mit WMP fliege, kam mir der gedanke eine schlankere und schnellere version von der MWC software zu machen.

bevor ich die erwartungen jetzt aber zu hoch schüre, muss ich deutlich sagen das ich noch relativer anfänger in arduino c bin! .. habe das hauptsächlich auf basis meiner websprachen erfahrung gemacht (ähnelt sich alles irgentwie).

als basis hab ich die MWC 1.0 (da blickt mann noch am ehesten durch) und die MWC 1.8p2 genommen.

zusammengefasst solls eine copter software werden die nur mit 4 kanälen und den Wii kreiselns auskommt.. so das es halt keine ACC oder sogar GPS gesteuerte drohne wird .. sondern eher ein schön zu fliegendes RC fluggerät :)


jetzt aber zu dem was es kann und können soll..


was es kann:

- Board: Arduino Pro Mini 16Mhz

- Eingänge: 4 (Throttle, Roll, Pitch, Yaw) ... zur zeit noch kein Sum signal möglich
- Ausgänge Servos: (0-8) .. von insgesammt 8 ausgängen also wenn man 6 servos haben will gehen nurnoch 2 motoren
- Ausgänge Motoren: (0-6) .. ja hier sollte der hexa auch ohne Sum signal gehen :) ... wenn man mehr als 4 motoren nimmt gehen keine servos mehr!
(habe keinen HEXA hier .. habe aber alle 6 ausgänge getestet .. sollte also kein problem sein)

- RX Pins: 2, 4, 5, 6
- Motor Pins: 9, 10, 11, 3, A0, A1
- Servo Pins: A0, A1, A2, 7, 3, 11, 10, 9
(durch diese pin belegung sollte mann das komplette programm auch mit den meissten MWC boards nutzen können)

- Kreisel: Wii Motion Plus
- Kreisel Pins: GND, 12, A4, A5 (wie beim MWC)

- angepasste GUI
- P.I.D. für Roll, Pitch und Yaw
- RC Expo
- RC Rate

- Tri (noch ungetestet)
- QuadV (getestet -> leuft :) )
- QuadP (noch ungetestet)
- QuadX (noch ungetestet)
- Y4 (noch ungetestet)
- Y6 (noch ungetestet)
- HEX6 (noch ungetestet)
- HEX6X (noch ungetestet)
(ausserdem hab ich versucht das mischen eigener auslegungen zu erleichtern)


was es noch können soll:

- Throttle Roll, Pitch und Yaw Rate
- Akku üerwachung .. die pins dafür sind schon vorgeshen (A3 und 8 wie beim MWC)
- vllt. sum signal



wenn euch das gefällt wäre mir sehr geholfen wenn ihr mutig testet :D

software giebts vorerst hier: http://www.speedshare.org/download.php?id=5477BA0B11 (ganz unten)
[edit] hab den link nochmal geändert in der zip war was falsch -.-[/edit]

von den tests mit meinem quad v kann ich schonmal sagen das mann sich an den besten wert von P erstmal langsam hochtasten sollte ;) da es hier sensiebler ist.

und seit wirklich vorsichtig! das BETA steht da nicht umsonnst.





gruß

Felix
 

haschenk

User †
Hallo Felix,

ich hab mal versucht, mir einen Eindruck von deiner Arbeit zu verschaffen (kann auch mit Arduino umgehen, bin aber kein Experte). Meine Frage:
Du verwendest in deinem Programm eine Menge Funktionen, die (anscheinend...) nicht definiert sind. Es gibt keine header-files und keine includes... Compilieren funktioniert aber.
Wie geht das denn ?

Außerdem steht in deinem Code noch Einiges drin, was über die Zielsetzung "schlank und auf 4 Kanäle beschränkt" hinausgeht. Sehe ich das falsch ?

Gruß,
Helmut
 

ronco

User
Hallo Helmut,

welche funktionen meinst du? oder alle?? bin wie gesagt auch kein arduino experte .. ich kann aus dem web programmieren nur "in code denken" ;)

hab mir die sachen ja aus den verschiedenen MWC versionen zusammen gesucht .. und ist natürlich schon was eigenes dabei.. im momment die pin belegung, die WMP daten "glättung" und noch kleinigkeiten. da ich die vorgefertigten funktionen des arduinos auch noch nicht alle auswendig kenne hab ich diese auf http://arduino.cc/ nachgeschaut ..

klingt jetzt vllt. blöd aber dachte mit dem arduino brauchts keine header files? (bei der multiwiicopter software sind auch keine dadei) und zum includen .. weiss nur das die arduino entwicklungs umgebung ale pde's die sich im selben ordner befinden quasi in eine datei packt .. die aufteilung dient nur zur übersicht.

zur schlankheit .. ja da giebts bestimmt noch einiges zu tun .. habe bisher nur die sachen die ich verstehe, und wo ich mir sicher war das sie weg können rausgekürtzt.

hättest du lust zu helfen?


ich feile im momment immer noch an der Kreisel daten verwertung .. hab aber jetzt schon 2 copter stabil am fliegen :)


gruß

Felix
 

ronco

User
.. es geht weiter

sind bestimmt immer noch sachen drin die mann kürtzen könnte .. denke aber das zumindest die grobe funktionsweise jetzt zuverlässig geht.

habe nochmal die Kreisel auswertung verbessert. das grosse neue daran ist eigentlich das ich hier die WMP nur einmal pro zyklus auslese, und so die CycleTime bei rund ~1700 beibt .. im vergleich zu ~3200 bei der WMC software.

p verhält sich jetzt wieder ähnlich wie bei der WMC..

-> http://www.speedshare.org/download.php?id=5D2106C711



gruß

Felix
 

haschenk

User †
Hallo Felix,

danke für die Antwort.
Ich habe nicht gewusst, daß der Arduino-Compiler auch in andern Files im (gleichen Ordner) nach Funktionen sucht, die er benötigt. Damit ist dieser Punkt klar, und weiß jetzt auch, warum eine sketch (beim ersten abspeichern) immer einen Ordner anlegt...

Im Wii-Originalfile wird (fast) alles bis ins Detail programmiert (z.B. keine "Wire"-Library verwendet), deshalb sind dort keine "includes" bzw. header-files notwendig. Eins gibt´s aber doch noch: #include EEPROM.h, in Zeile 167. Bei dir steht das im EEPROM-File.

Eine Frage dazu hab ich aber noch: Egal, welches File im o.e. Ordner ich (in der Arduino-IDE) öffnen wiil- es öffnet sich immer das "Hauptfile". Nur wenn ich einen externen Editor verwende (bei mir "Programmer´s Notepad"), komme ich an den Inhalt der "Nebenfiles" ran. Gibt´s dazu evtl. einen Trick in der IDE ?

Für dein Projekt würde ich dir raten, noch einen (2achs) Beschleunigungssensor mit aufzunehmen. Der ist zwar nicht zwingend nötig (s. KK-Copter) und es helfen auch aerodynamische Kräfte/Momente ein wenig mit. Aber zu einer richtigen IMU gehört er dazu, und nur so kann man p. "Sensorfusion" die Gyro-Drift eliminieren.
An so einer IMU beginne ich gerade, mich zu versuchen. Verwendet werden ITG3200 und ADXL345, für beide habe ich schon Demo-Progs (Zahlenwert-Ausgabe oder y(t)-Schreiber am Laufen. Mal seh´n...

...hättest du lust zu helfen?
JEIN... Ich bin schon seit einigen Jahren Rentner (aber von früher beruflich "vorbelastet" und verfüge über Einiges an Geräten/Maschinen), aber als Grufti arbeitet man in verschiedener Hinsicht anders als in jungen Jahren; da kann Zusammenarbeit problemhaft werden. Aber einen Austausch von Ergebnissen kann ich mir schon vorstellen. Ich klaube auch aus allen möglichen Quellen Wissen zusammen und versuche, die Dinge zu verstehen und nachzuvollziehen. Manchmal ist dabei aber auch der Weg schon das Ziel...

Gruß,
Helmut
 
Hi Felix,
da ich meinen WiiCopter jetzt auch mal wieder unter dem Bett hervorgeholt habe, lese ich natürlich wieder interessiert mit :)
Aber ehrlich gesagt habe ich noch nicht verstanden, was du mit deinem neuen Code erreichen willst. Was ändert sich später beim Fliegen? Merkt man die schnellere Auslesezeit?

Gruß Christian
 

ronco

User
Eine Frage dazu hab ich aber noch: Egal, welches File im o.e. Ordner ich (in der Arduino-IDE) öffnen wiil- es öffnet sich immer das "Hauptfile". Nur wenn ich einen externen Editor verwende (bei mir "Programmer´s Notepad"), komme ich an den Inhalt der "Nebenfiles" ran. Gibt´s dazu evtl. einen Trick in der IDE ?

also bei mir öffnet der automatisch alle pdes die in dem ordner sind (arduino 022) vllt. solltest du dir mal die neuste version holen? .. ah und wenn mann die files direckt aus nem zip ordner öffnet geht auch immer nur eine datei auf (weil der ja nur die eine datei enpackt)

zur IMU und den beschleunigungssensoren.. ich fliege seit ner weile meine copter nur mit gyros .. und finde das schon zimmlich stabiel/gut .. also wäre schon interessiert mal zu sehen wie mann per ACC den gyrodrift eliminiert (das ist ein teil den ich nochnicht komplett verstanden habe ;) )

@Christian
zum einen will ich diese "wiicopter abwandlung" flexiebler machen .. also keine vordefinierten kombinationen (in der GUI). möglichst alle ausgänge frei belegbar machen ...

bin mir mit den vorteilen dieser schnelleren auswertung auch nochnicht sicher .. aber es wird der komplette loop (programmablauf) heufiger durchgeführt was meiner meinung nach schonnmal nicht schadet.. undmir ist aufgefallen das die gyro stärke reduziert werden kann .. da es ja heufiger eingreift.

zum aktuellen stand .. schweben geht super :) aber beim rundenfliegen stimmt nochwas nicht .. meine copter fallen immerwieder zurück . also wenn ich sie stark in eine richtung neige ... da giebts nochwas arbeit.

ahja und da ich den multiwiicopter leuten natürlich nix vorbehalten will hab ich die auch informiert :)
http://www.multiwii.com/forum/viewtopic.php?f=8&t=876 (nicht nach meinem englisch gucken :P )

gruß

felix
 

haschenk

User †
Hallo Felix,

ich verwende die Arduino-Version 022 schon, seit es sie gibt.

Aber lassen wir das mal; zu deiner Frage:
...also wäre schon interessiert mal zu sehen wie mann per ACC den gyrodrift eliminiert (das ist ein teil den ich nochnicht komplett verstanden habe )
Man kann mit einem "geeigneten" Filter die Daten zweier Sensoren so vereinigen ("fusionieren"), daß man bessere/genauere Werte erhält, als mit den Sensoren allein. Bekannt geworden sind dazu vor allem sog. *Kalman-Filter* (nach ihrem Erfinder benannt) und sog. *Komplementär-Filter* ("complementary filter", nach ihrer Wirkungsweise benannt). Es gibt auch noch andere, weniger verwendete Typen, aber ich beschränke mich jetzt sogar auf das Komplementär-Filter, weil ich das Kalman-Filter nur ansatzweise verstehe, und es auch erhebliche Rechenzeiten im µC erfordert.

Das Komplementär-Filter ist dagegen einfach zu verstehen und braucht eigentlich nur eine einzige Formel (allerdings muß darin mit "floats" gerechnet werden). Es soll (so wird immer wieder gesagt) fast so gute Ergebnisse bringen wie ein Kalman-Filter.

Grundgedanke:
Ein ("Rate"-) Gyro liefert kurzzeitig sehr genaue Daten, langzeitig aber nicht, wegen der Drift. Ein Beschleunigungsmesser (ACC) liefert langzeitig im Mittel sehr genau die Lotrichtung (wie ein Pendel), kurzzeitig kann er aber sehr fehlerhafte Daten liefern, wegen horizontalen "Störbeschleunigungen".
Man versucht nun, die guten Eigenschaften der beiden Sensoren zu kombinieren, und die schlechten zu unterdrücken.

Der ACC liefert direkt den Lagewinkel. Der Gyro liefert auch den Lagewinkel, wenn man sein Signal über der Zeit aufsummiert ("integriert").
Das Signal des ACCs schickt man nun durch ein (in unserem Fall digitales) Tiefpass-Filter; dieses unterdrückt die falschen schnellen Signalanteile. Die integrierten Signale vom Gyro schickt man dagegen durch ein (auch digitales) Hochpass-Filter; dieses unterdrückt die falschen langsamen Anteile. Die Ausgangssignale der beiden Filter werden dann addiert und stellen ein verbessertes Lagesignal dar.
In der Theorie wird gezeigt, daß das Verfahren am besten funktioniert, wenn beide Filter dieselbe Zeitkonstante haben ("komplementär" sind), die Summe der "Filterkoeffizienten" = 1 ist, und die Filterkoeffizienten in einem bestimmten Verhältnis zueinander stehen (ergibt sich aus anderen Werten).

Wie das dann in der praktischen Realisierung aussieht, kannst du aus den beiden verlinkten Arbeiten entnehmen:
http://web.mit.edu/scolton/www/filter.pdf
http://www.chrismarion.net/index.ph...he-segway-theory&catid=44:robotics&Itemid=240

Das Komplementär-Filter hat große praktische Bedeutung und wird häufig angewendet, z.B. auch beim "Segway", bei "inversen Pendeln", "balancierenden Robotern" usw. Beim Surfen zu diesen Dingen wirst du immer wieder auf dieses Filter stoßen; unsere Copter sind nur eine der vielen Anwendungen.

Übrigens:
Die beschriebene "Sensorfusion" ist schon ca. 80 Jahre alt, nur hat man das damals nicht so genannt; sie war pneumatisch/mechanisch realisiert, und es gab noch keine extra Theorie dafür. Im Sperry/Askania-Kreiselhorizont (ein Flugzeuginstrument) befindet sich ein kardanisch gelagerter Kreisel, an dessen Gehäuse -vereinfacht gesagt- 4 kleine Pendel angebracht sind, die Luftströme steuern; und diese Luftströme "richten" den Kreisel (bringen seine Achse ins Lot). Damit war erstmalig Blindflug möglich; dieses Gerät wird in modernisierter Form noch heute verwendet.


Gruß,
Helmut
 

ronco

User
Danke Helmut :)

das macht sinn.


habe mir grade die MultiWii 1.9 mit dieser sensors.pde http://www.multiwii.com/forum/viewtopic.php?f=8&t=884&start=10 auf den copter getahn .. und das ist hammer! nur mit WMP bleibt der copter fast unendlich stehen.. und die cycletime ist runter auf 30xx ..glaube nicht das ich mit meiner methode da rann komme :(

werde mal gucken wie die das gemacht haben ;) .. mit der neuen sensors pde hat alex die i2c fehler quasi ausgerottet..


gruß

felix
 
Ansicht hell / dunkel umschalten
Oben Unten