Ich nehme an ein gps nmea parser ist vorhanden und liefert eine position mit 1 oder 2 hz. Es hat 2 abläufe, berechnungen nach einer neuen gps position (0.5 oder 1 sek), und berechnungen vor jedem pid loop (bei mir 3 bis 20 ms).
Bei neuer gps-position:
direction_to_home und distance_to_home berechnen
GPS_heading (aktueller kurs) berechnen falls kein mag
vor jedem pid:
act_heading aus GPS_heading und gyro daten zusammenbasteln (falls kein mag)
direction_err_to_home berechnen, wohin muss ich steuern.
Beim flieger:
direction_err_to_home auf seitenruder und quer aufmischen, nur P anteil. Dazu noch etwas abs(P) auf höhenruder geben damit der flieger nicht sinkt.
Beim quad:
PD = distance_to_home - distance_speed (new_dist - old dist gefiltert)
PD * cos(direction_err_to_home) auf pitch aufmischen,
PD * sin(direction_err_to_home) auf roll aufmischen
Der D anteil muss sehr gross sein. Der quad muss aktiv und heftig "auf die bremse treten" bevor er home erreicht. Idealerweise speed = 0 bei home position. Der fehlende I anteil bewirkt bis zu 10m versatz bei wind.
Files:
nav.ino sind die berechnungen.
rth.txt sind die funktionsaufrufe von main aus.
gps.ino ist der von multiwii kopierte nmea gps parser.
https://www.rcgroups.com/forums/show...6&d=1496803524
Für flieger ohne mag muss der gps-kurs zwischen messungen mit gyrodaten korrigiert werden, sonst fliegt der flieger dauer-schlangenlinie. Dazu hab ich was gebastelt (würg), aber ich denke die neue IMU von cleanflight/betaflight kann das besser. Die alte multiwii imu kanns nicht.
Das ganze atmega32u4 projekt für flieger (hardcoded waypoints, althold ist schrott):
https://www.rcgroups.com/forums/showatt.php?attachmentid=10101796&d=1496836236
Für copter brauchts immer ein mag. Die copter geschwindikeit beim einschalten von RTH wird nicht beachtet. Das bewirkt ein "krummes" anfliegen der home position und sollte korrigiert werden.
Das ganze atmega2560 copter projekt (basiert auf mwii 2.2):
https://www.rcgroups.com/forums/showatt.php?attachmentid=10101816&d=1496838168
btw
die formel GPS_heading = atan2(dLon,dLat); ist richtig, was apm und clones (mwii, baseflight) benutzen ist würg.
Bei neuer gps-position:
direction_to_home und distance_to_home berechnen
GPS_heading (aktueller kurs) berechnen falls kein mag
vor jedem pid:
act_heading aus GPS_heading und gyro daten zusammenbasteln (falls kein mag)
direction_err_to_home berechnen, wohin muss ich steuern.
Beim flieger:
direction_err_to_home auf seitenruder und quer aufmischen, nur P anteil. Dazu noch etwas abs(P) auf höhenruder geben damit der flieger nicht sinkt.
Beim quad:
PD = distance_to_home - distance_speed (new_dist - old dist gefiltert)
PD * cos(direction_err_to_home) auf pitch aufmischen,
PD * sin(direction_err_to_home) auf roll aufmischen
Der D anteil muss sehr gross sein. Der quad muss aktiv und heftig "auf die bremse treten" bevor er home erreicht. Idealerweise speed = 0 bei home position. Der fehlende I anteil bewirkt bis zu 10m versatz bei wind.
Files:
nav.ino sind die berechnungen.
rth.txt sind die funktionsaufrufe von main aus.
gps.ino ist der von multiwii kopierte nmea gps parser.
https://www.rcgroups.com/forums/show...6&d=1496803524
Für flieger ohne mag muss der gps-kurs zwischen messungen mit gyrodaten korrigiert werden, sonst fliegt der flieger dauer-schlangenlinie. Dazu hab ich was gebastelt (würg), aber ich denke die neue IMU von cleanflight/betaflight kann das besser. Die alte multiwii imu kanns nicht.
Das ganze atmega32u4 projekt für flieger (hardcoded waypoints, althold ist schrott):
https://www.rcgroups.com/forums/showatt.php?attachmentid=10101796&d=1496836236
Für copter brauchts immer ein mag. Die copter geschwindikeit beim einschalten von RTH wird nicht beachtet. Das bewirkt ein "krummes" anfliegen der home position und sollte korrigiert werden.
Das ganze atmega2560 copter projekt (basiert auf mwii 2.2):
https://www.rcgroups.com/forums/showatt.php?attachmentid=10101816&d=1496838168
btw
die formel GPS_heading = atan2(dLon,dLat); ist richtig, was apm und clones (mwii, baseflight) benutzen ist würg.
Zuletzt bearbeitet: