@@ -181,7 +181,7 @@ void LA_MsgHandler_ATT::xprocess(const uint8_t *msg) {
181181}
182182
183183
184- // TODO: if a third Kalman filter exists, factor this EKF1 and NKF1
184+ // TODO: factor with NKF1 and XKF1
185185LA_MsgHandler_EKF1::LA_MsgHandler_EKF1 (std::string name,
186186 const struct log_Format &f,
187187 Analyze *analyze,
@@ -508,6 +508,78 @@ void LA_MsgHandler_NKF1::xprocess(const uint8_t *msg) {
508508
509509}
510510
511+ // FIXME: factor!
512+ LA_MsgHandler_XKF1::LA_MsgHandler_XKF1 (std::string name,
513+ const struct log_Format &f,
514+ Analyze *analyze,
515+ AnalyzerVehicle::Base *&vehicle) :
516+ LA_MsgHandler(name, f, analyze, vehicle) {
517+ _analyze->add_data_source (" ATTITUDE_ESTIMATE_XKF1" , " XKF1.Roll" );
518+ _analyze->add_data_source (" ATTITUDE_ESTIMATE_XKF1" , " XKF1.Pitch" );
519+ _analyze->add_data_source (" ATTITUDE_ESTIMATE_XKF1" , " XKF1.Yaw" );
520+
521+ _analyze->add_data_source (" POSITION_ESTIMATE_XKF1" , " XKF1.PN" );
522+ _analyze->add_data_source (" POSITION_ESTIMATE_XKF1" , " XKF1.PE" );
523+
524+ _analyze->add_data_source (" ALTITUDE_ESTIMATE_XKF1" , " XKF1.PD" );
525+
526+ _analyze->add_data_source (" VELOCITY_ESTIMATE_XKF1" , " XKF1.VN" );
527+ _analyze->add_data_source (" VELOCITY_ESTIMATE_XKF1" , " XKF1.VE" );
528+ _analyze->add_data_source (" VELOCITY_ESTIMATE_XKF1" , " XKF1.VD" );
529+
530+ }
531+
532+ void LA_MsgHandler_XKF1::xprocess (const uint8_t *msg) {
533+ int16_t Roll = require_field_int16_t (msg, " Roll" );
534+ int16_t Pitch = require_field_int16_t (msg, " Pitch" );
535+ float Yaw = require_field_float (msg, " Yaw" );
536+
537+ _vehicle->attitude_estimate (" XKF1" )->set_roll (T (), Roll/(double )100 .0f );
538+ _vehicle->attitude_estimate (" XKF1" )->set_pitch (T (), Pitch/(double )100 .0f );
539+ _vehicle->attitude_estimate (" XKF1" )->set_yaw (T (), Yaw-180 );
540+
541+ // these are all relative; need to work out an origin:
542+ if (_vehicle->origin_lat_T () != 0 ) {
543+ double posN = require_field_float (msg, " PN" );
544+ double posE = require_field_float (msg, " PE" );
545+ double origin_lat = _vehicle->origin_lat ();
546+ double origin_lon = _vehicle->origin_lon ();
547+
548+ double lat = 0 ;
549+ double lon = 0 ;
550+ gps_offset (origin_lat, origin_lon, posE, posN, lat, lon);
551+ // ::fprintf(stderr, "%f+%f / %f+%f = %f / %f\n",
552+ // origin_lat, posE, origin_lon, posN, lat, lon);
553+
554+ _vehicle->position_estimate (" XKF1" )->set_lat (T (), lat);
555+ _vehicle->position_estimate (" XKF1" )->set_lon (T (), lon);
556+ }
557+ if (_vehicle->origin_altitude_T () != 0 ) {
558+ double posD = require_field_float (msg, " PD" );
559+ double origin_alt = _vehicle->origin_altitude ();
560+ _vehicle->altitude_estimate (" XKF1" )->set_alt (T (), origin_alt - posD);
561+ }
562+
563+ {
564+ double vn = require_field_float (msg, " VN" );
565+ double ve = require_field_float (msg, " VE" );
566+ double vd = require_field_float (msg, " VD" );
567+
568+ _vehicle->velocity_estimate (" XKF1" )->velocity ().set_x (T (), vn);
569+ _vehicle->velocity_estimate (" XKF1" )->velocity ().set_y (T (), ve);
570+ _vehicle->velocity_estimate (" XKF1" )->velocity ().set_z (T (), vd);
571+
572+ if (int (_vehicle->require_param_with_defaults (" AHRS_EKF_TYPE" )) == 2 ) {
573+ // set XKF1 as canonical for velocity:
574+ // Sadly, NTUN isn't updated if we're not using the nav controller
575+ _vehicle->vel ().set_x (T (), vn);
576+ _vehicle->vel ().set_y (T (), ve);
577+ _vehicle->vel ().set_z (T (), vd);
578+ }
579+ }
580+
581+ }
582+
511583void LA_MsgHandler_PM::xprocess (const uint8_t *msg)
512584{
513585 uint16_t nlon;
0 commit comments