mirror of
https://github.com/paparazzi/paparazzi.git
synced 2026-05-27 08:55:51 +08:00
[module] geo_mag: cleanup and add setting to recalc on demand
This commit is contained in:
+16
-12
@@ -4,30 +4,34 @@
|
|||||||
<doc>
|
<doc>
|
||||||
<description>
|
<description>
|
||||||
GeoMagnetic field vector.
|
GeoMagnetic field vector.
|
||||||
Calculation of the normalized geomagnetic field vector (saved to ahrs_impl.mag_h) at startup as soon as a valid location is aquired.
|
Calculation of the normalized geomagnetic field vector at startup as soon as a valid location is aquired.
|
||||||
Method uses is based on the the ngdc noaa DODWMM model and data (http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml).
|
The result is published via the GEO_MAG ABI message.
|
||||||
To obtain the a magnetic heading to be used by the autopilot, the program must know the magnetic declination at all the points en route, at the indicated flight altitude.
|
The AHRS algorithms need to know the magnetic field vector at the current position in order to accurately calculate the heading.
|
||||||
It's very important to keep declination into account because a flight in some geographical areas without considering declination, could lead to unacceptable autopilot navigation errors.
|
|
||||||
The magnetic declination, that is the difference between true heading and magnetic heading, varies in time and space according to undefined rules, whose long-term progress can be considered substantially random.
|
Method uses is based on the the ngdc noaa DODWMM model and data (http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml).
|
||||||
To determine the magnetic declination for a point through mathematical calculations is thus indispensable to resort to a model, which represents the progress of the earth magnetic field all over the surface of the globe. The WMM is based on earth magnetic field
|
The WMM is based on earth magnetic field measuring at an high number of sites on the whole globe and on its mathematical representation through a series of characteristic values listed in a file (WMM.COF) which has a five-year validity.
|
||||||
measuring at an high number of sites on the whole globe and on its mathematical representation through a series of characteristic values listed in a file (WMM.COF) which has a five-year validity. The autopilot used data derived from this file to make the complex
|
The autopilot used data derived from this file to make the complex calculation of declination.
|
||||||
calculation of declination. Every 5 years (2015, 2020) an updated geomagnetic model is released and datatables in the code must be updated accordingly for more accurate flight.
|
Every 5 years (2015, 2020) an updated geomagnetic model is released and datatables in the code must be updated accordingly for more accurate flight.
|
||||||
</description>
|
</description>
|
||||||
</doc>
|
</doc>
|
||||||
|
<settings>
|
||||||
|
<dl_settings>
|
||||||
|
<dl_settings name="geo_mag">
|
||||||
|
<dl_setting min="0" max="1" step="1" values="OFF|CALC" var="geo_mag.calc_once" module="geo_mag/geo_mag" shortname="calcNow"/>
|
||||||
|
</dl_settings>
|
||||||
|
</dl_settings>
|
||||||
|
</settings>
|
||||||
<header>
|
<header>
|
||||||
<file name="geo_mag.h"/>
|
<file name="geo_mag.h"/>
|
||||||
</header>
|
</header>
|
||||||
<init fun="geo_mag_init()"/>
|
<init fun="geo_mag_init()"/>
|
||||||
<periodic fun="geo_mag_periodic()" freq="1"/>
|
<periodic fun="geo_mag_periodic()" freq="1"/>
|
||||||
<event fun="geo_mag_event()"/>
|
<event fun="geo_mag_event()"/>
|
||||||
<makefile target="ap|nps|sim">
|
<makefile target="ap|nps">
|
||||||
<file name="geo_mag.c"/>
|
<file name="geo_mag.c"/>
|
||||||
<file name="pprz_geodetic_wmm2015.c" dir="math"/>
|
<file name="pprz_geodetic_wmm2015.c" dir="math"/>
|
||||||
</makefile>
|
</makefile>
|
||||||
<makefile target="nps">
|
<makefile target="nps">
|
||||||
<define name="NPS_CALC_GEO_MAG"/>
|
<define name="NPS_CALC_GEO_MAG"/>
|
||||||
</makefile>
|
</makefile>
|
||||||
<makefile target="sim">
|
|
||||||
<define name="SIM_CALC_GEO_MAG"/>
|
|
||||||
</makefile>
|
|
||||||
</module>
|
</module>
|
||||||
|
|||||||
@@ -40,12 +40,11 @@
|
|||||||
#define GEO_MAG_SENDER_ID 1
|
#define GEO_MAG_SENDER_ID 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
bool_t geo_mag_calc_flag;
|
|
||||||
struct GeoMag geo_mag;
|
struct GeoMag geo_mag;
|
||||||
|
|
||||||
void geo_mag_init(void)
|
void geo_mag_init(void)
|
||||||
{
|
{
|
||||||
geo_mag_calc_flag = FALSE;
|
geo_mag.calc_once = FALSE;
|
||||||
geo_mag.ready = FALSE;
|
geo_mag.ready = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,14 +52,13 @@ void geo_mag_periodic(void)
|
|||||||
{
|
{
|
||||||
//FIXME: kill_throttle has no place in a geomag module
|
//FIXME: kill_throttle has no place in a geomag module
|
||||||
if (!geo_mag.ready && gps.fix == GPS_FIX_3D && kill_throttle) {
|
if (!geo_mag.ready && gps.fix == GPS_FIX_3D && kill_throttle) {
|
||||||
geo_mag_calc_flag = TRUE;
|
geo_mag.calc_once = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void geo_mag_event(void)
|
void geo_mag_event(void)
|
||||||
{
|
{
|
||||||
|
if (geo_mag.calc_once) {
|
||||||
if (geo_mag_calc_flag) {
|
|
||||||
double gha[MAXCOEFF]; // Geomag global variables
|
double gha[MAXCOEFF]; // Geomag global variables
|
||||||
int32_t nmax;
|
int32_t nmax;
|
||||||
|
|
||||||
@@ -90,5 +88,5 @@ void geo_mag_event(void)
|
|||||||
|
|
||||||
geo_mag.ready = TRUE;
|
geo_mag.ready = TRUE;
|
||||||
}
|
}
|
||||||
geo_mag_calc_flag = FALSE;
|
geo_mag.calc_once = FALSE;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
struct GeoMag {
|
struct GeoMag {
|
||||||
struct DoubleVect3 vect;
|
struct DoubleVect3 vect;
|
||||||
|
bool_t calc_once;
|
||||||
bool_t ready;
|
bool_t ready;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user