@ -1,11 +1,12 @@
@@ -1,11 +1,12 @@
# include "AP_NavEKF3.h"
# include "AP_NavEKF3_core.h"
# include <AP_HAL/HAL.h>
# include <AP_Logger/AP_Logger.h>
# include <AP_DAL/AP_DAL.h>
void NavEKF3 : : Log_Write_XKF1 ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKF1 ( uint64_t time_us ) const
{
// Write first EKF packet
Vector3f euler ;
@ -15,19 +16,19 @@ void NavEKF3::Log_Write_XKF1(uint8_t _core, uint64_t time_us) const
@@ -15,19 +16,19 @@ void NavEKF3::Log_Write_XKF1(uint8_t _core, uint64_t time_us) const
Vector3f gyroBias ;
float posDownDeriv ;
Location originLLH ;
getEulerAngles ( _core , euler ) ;
getVelNED ( _core , velNED ) ;
getPosNE ( _core , posNE ) ;
getPosD ( _core , posD ) ;
getGyroBias ( _core , gyroBias ) ;
posDownDeriv = getPosDownDerivative ( _core ) ;
if ( ! getOriginLLH ( _core , originLLH ) ) {
getEulerAngles ( euler ) ;
getVelNED ( velNED ) ;
getPosNE ( posNE ) ;
getPosD ( posD ) ;
getGyroBias ( gyroBias ) ;
posDownDeriv = getPosDownDerivative ( ) ;
if ( ! getOriginLLH ( originLLH ) ) {
originLLH . alt = 0 ;
}
const struct log_EKF1 pkt {
LOG_PACKET_HEADER_INIT ( LOG_XKF1_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
core : DAL_CORE ( core_index ) ,
roll : ( int16_t ) ( 100 * degrees ( euler . x ) ) , // roll angle (centi-deg, displayed as deg due to format string)
pitch : ( int16_t ) ( 100 * degrees ( euler . y ) ) , // pitch angle (centi-deg, displayed as deg due to format string)
yaw : ( uint16_t ) wrap_360_cd ( 100 * degrees ( euler . z ) ) , // yaw angle (centi-deg, displayed as deg due to format string)
@ -46,21 +47,21 @@ void NavEKF3::Log_Write_XKF1(uint8_t _core, uint64_t time_us) const
@@ -46,21 +47,21 @@ void NavEKF3::Log_Write_XKF1(uint8_t _core, uint64_t time_us) const
AP : : logger ( ) . WriteBlock ( & pkt , sizeof ( pkt ) ) ;
}
void NavEKF3 : : Log_Write_XKF2 ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKF2 ( uint64_t time_us ) const
{
// Write second EKF packet
Vector3f accelBias ;
Vector3f wind ;
Vector3f magNED ;
Vector3f magXYZ ;
getAccelBias ( _core , accelBias ) ;
getWind ( _core , wind ) ;
getMagNED ( _core , magNED ) ;
getMagXYZ ( _core , magXYZ ) ;
getAccelBias ( accelBias ) ;
getWind ( wind ) ;
getMagNED ( magNED ) ;
getMagXYZ ( magXYZ ) ;
const struct log_XKF2 pkt2 {
LOG_PACKET_HEADER_INIT ( LOG_XKF2_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
core : DAL_CORE ( core_index ) ,
accBiasX : ( int16_t ) ( 100 * accelBias . x ) ,
accBiasY : ( int16_t ) ( 100 * accelBias . y ) ,
accBiasZ : ( int16_t ) ( 100 * accelBias . z ) ,
@ -76,26 +77,22 @@ void NavEKF3::Log_Write_XKF2(uint8_t _core, uint64_t time_us) const
@@ -76,26 +77,22 @@ void NavEKF3::Log_Write_XKF2(uint8_t _core, uint64_t time_us) const
AP : : logger ( ) . WriteBlock ( & pkt2 , sizeof ( pkt2 ) ) ;
}
void NavEKF3 : : Log_Write_XKFS ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKFS ( uint64_t time_us ) const
{
// Write sensor selection EKF packet
uint8_t magIndex = getActiveMag ( _core ) ;
uint8_t baroIndex = getActiveBaro ( _core ) ;
uint8_t GPSIndex = getActiveGPS ( _core ) ;
uint8_t airspeedIndex = getActiveAirspeed ( _core ) ;
const struct log_EKFS pkt {
LOG_PACKET_HEADER_INIT ( LOG_XKFS_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
mag_index : ( uint8_t ) ( magIndex ) ,
baro_index : ( uint8_t ) ( baroIndex ) ,
gps_index : ( uint8_t ) ( GPSIndex ) ,
airspeed_index : ( uint8_t ) ( airspeedIndex ) ,
core : DAL_CORE ( core_index ) ,
mag_index : magSelectIndex ,
baro_index : selected_baro ,
gps_index : selected_gps ,
airspeed_index : getActiveAirspeed ( )
} ;
AP : : logger ( ) . WriteBlock ( & pkt , sizeof ( pkt ) ) ;
}
void NavEKF3 : : Log_Write_XKF3 ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKF3 ( uint64_t time_us ) const
{
// Write third EKF packet
Vector3f velInnov ;
@ -103,11 +100,11 @@ void NavEKF3::Log_Write_XKF3(uint8_t _core, uint64_t time_us) const
@@ -103,11 +100,11 @@ void NavEKF3::Log_Write_XKF3(uint8_t _core, uint64_t time_us) const
Vector3f magInnov ;
float tasInnov = 0 ;
float yawInnov = 0 ;
getInnovations ( _core , velInnov , posInnov , magInnov , tasInnov , yawInnov ) ;
getInnovations ( velInnov , posInnov , magInnov , tasInnov , yawInnov ) ;
const struct log_NKF3 pkt3 {
LOG_PACKET_HEADER_INIT ( LOG_XKF3_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
core : DAL_CORE ( core_index ) ,
innovVN : ( int16_t ) ( 100 * velInnov . x ) ,
innovVE : ( int16_t ) ( 100 * velInnov . y ) ,
innovVD : ( int16_t ) ( 100 * velInnov . z ) ,
@ -119,13 +116,13 @@ void NavEKF3::Log_Write_XKF3(uint8_t _core, uint64_t time_us) const
@@ -119,13 +116,13 @@ void NavEKF3::Log_Write_XKF3(uint8_t _core, uint64_t time_us) const
innovMZ : ( int16_t ) ( magInnov . z ) ,
innovYaw : ( int16_t ) ( 100 * degrees ( yawInnov ) ) ,
innovVT : ( int16_t ) ( 100 * tasInnov ) ,
rerr : coreRelativeErrors [ _ core] ,
errorScore : coreErrorScores [ _ core]
rerr : frontend - > coreRelativeErrors [ core_index ] ,
errorScore : frontend - > coreErrorScores [ core_index ]
} ;
AP : : logger ( ) . WriteBlock ( & pkt3 , sizeof ( pkt3 ) ) ;
}
void NavEKF3 : : Log_Write_XKF4 ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKF4 ( uint64_t time_us ) const
{
// Write fourth EKF packet
float velVar = 0 ;
@ -133,90 +130,77 @@ void NavEKF3::Log_Write_XKF4(uint8_t _core, uint64_t time_us) const
@@ -133,90 +130,77 @@ void NavEKF3::Log_Write_XKF4(uint8_t _core, uint64_t time_us) const
float hgtVar = 0 ;
Vector3f magVar ;
float tasVar = 0 ;
uint16_t _faultStatus = 0 ;
Vector2f offset ;
uint16_t faultStatus = 0 ;
uint8_t timeoutStatus = 0 ;
nav_filter_status solutionStatus { } ;
nav_gps_status gpsStatus { } ;
getVariances ( _core , velVar , posVar , hgtVar , magVar , tasVar , offset ) ;
getVariances ( velVar , posVar , hgtVar , magVar , tasVar , offset ) ;
float tempVar = fmaxf ( fmaxf ( magVar . x , magVar . y ) , magVar . z ) ;
getFilterFaults ( _core , faultStatus ) ;
getFilterTimeouts ( _core , timeoutStatus ) ;
getFilterStatus ( _core , solutionStatus ) ;
getFilterGpsStatus ( _core , gpsStatus ) ;
getFilterFaults ( _faultStatus ) ;
getFilterTimeouts ( timeoutStatus ) ;
getFilterStatus ( solutionStatus ) ;
getFilterGpsStatus ( gpsStatus ) ;
float tiltError ;
getTiltError ( _core , tiltError ) ;
uint8_t primaryIndex = getPrimaryCoreIndex ( ) ;
getTiltError ( tiltError ) ;
const struct log_NKF4 pkt4 {
LOG_PACKET_HEADER_INIT ( LOG_XKF4_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
core : DAL_CORE ( core_index ) ,
sqrtvarV : ( int16_t ) ( 100 * velVar ) ,
sqrtvarP : ( int16_t ) ( 100 * posVar ) ,
sqrtvarH : ( int16_t ) ( 100 * hgtVar ) ,
sqrtvarM : ( int16_t ) ( 100 * tempVar ) ,
sqrtvarVT : ( int16_t ) ( 100 * tasVar ) ,
tiltErr : ( float ) tiltError ,
tiltErr : tiltError ,
offsetNorth : ( int8_t ) ( offset . x ) ,
offsetEast : ( int8_t ) ( offset . y ) ,
faults : ( uint16 _t ) ( faultStatus ) ,
timeouts : ( uint8_t ) ( timeoutStatus ) ,
solution : ( uint32_t ) ( solutionStatus . value ) ,
gps : ( uint16_t ) ( gpsStatus . value ) ,
primary : ( int8_t ) primaryIndex
faults : _faultStatus ,
timeouts : timeoutStatus ,
solution : solutionStatus . value ,
gps : gpsStatus . value ,
primary : frontend - > getPrimaryCoreIndex ( )
} ;
AP : : logger ( ) . WriteBlock ( & pkt4 , sizeof ( pkt4 ) ) ;
}
void NavEKF3 : : Log_Write_XKF5 ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_XKF5 ( uint64_t time_us ) const
{
if ( _ core ! = primary ) {
if ( core_index ! = frontend - > primary ) {
// log only primary instance for now
return ;
}
// Write fifth EKF packet
float normInnov = 0 ; // normalised innovation variance ratio for optical flow observations fused by the main nav filter
float gndOffset = 0 ; // estimated vertical position of the terrain relative to the nav filter zero datum
float flowInnovX = 0 , flowInnovY = 0 ; // optical flow LOS rate vector innovations from the main nav filter
float auxFlowInnov = 0 ; // optical flow LOS rate innovation from terrain offset estimator
float HAGL = 0 ; // height above ground level
float rngInnov = 0 ; // range finder innovations
float range = 0 ; // measured range
float gndOffsetErr = 0 ; // filter ground offset state error
Vector3f predictorErrors ; // output predictor angle, velocity and position tracking error
getFlowDebug ( _core , normInnov , gndOffset , flowInnovX , flowInnovY , auxFlowInnov , HAGL , rngInnov , range , gndOffsetErr ) ;
getOutputTrackingError ( _core , predictorErrors ) ;
const struct log_NKF5 pkt5 {
LOG_PACKET_HEADER_INIT ( LOG_XKF5_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
normInnov : ( uint8_t ) ( MIN ( 100 * normInnov , 255 ) ) ,
FIX : ( int16_t ) ( 1000 * flowInnovX ) ,
FIY : ( int16_t ) ( 1000 * flowInnovY ) ,
AFI : ( int16_t ) ( 1000 * auxFlowInnov ) ,
HAGL : ( int16_t ) ( 100 * HAGL ) ,
offset : ( int16_t ) ( 100 * gndOffset ) ,
RI : ( int16_t ) ( 100 * rngInnov ) ,
meaRng : ( uint16_t ) ( 100 * range ) ,
errHAGL : ( uint16_t ) ( 100 * gndOffsetErr ) ,
angErr : ( float ) predictorErrors . x ,
velErr : ( float ) predictorErrors . y ,
posErr : ( float ) predictorErrors . z
core : DAL_CORE ( core_index ) ,
normInnov : ( uint8_t ) ( MIN ( 100 * MAX ( flowTestRatio [ 0 ] , flowTestRatio [ 1 ] ) , 255 ) ) , // normalised innovation variance ratio for optical flow observations fused by the main nav filter
FIX : ( int16_t ) ( 1000 * innovOptFlow [ 0 ] ) , // optical flow LOS rate vector innovations from the main nav filter
FIY : ( int16_t ) ( 1000 * innovOptFlow [ 1 ] ) , // optical flow LOS rate vector innovations from the main nav filter
AFI : ( int16_t ) ( 1000 * norm ( auxFlowObsInnov . x , auxFlowObsInnov . y ) ) , // optical flow LOS rate innovation from terrain offset estimator
HAGL : ( int16_t ) ( 100 * ( terrainState - stateStruct . position . z ) ) , // height above ground level
offset : ( int16_t ) ( 100 * terrainState ) , // filter ground offset state error
RI : ( int16_t ) ( 100 * innovRng ) , // range finder innovations
meaRng : ( uint16_t ) ( 100 * rangeDataDelayed . rng ) , // measured range
errHAGL : ( uint16_t ) ( 100 * sqrtf ( Popt ) ) , // note Popt is constrained to be non-negative in EstimateTerrainOffset()
angErr : ( float ) outputTrackError . x , // output predictor angle error
velErr : ( float ) outputTrackError . y , // output predictor velocity error
posErr : ( float ) outputTrackError . z // output predictor position tracking error
} ;
AP : : logger ( ) . WriteBlock ( & pkt5 , sizeof ( pkt5 ) ) ;
}
void NavEKF3 : : Log_Write_Quaternion ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_Quaternion ( uint64_t time_us ) const
{
// log quaternion
Quaternion quat ;
getQuaternion ( _core , quat ) ;
getQuaternion ( quat ) ;
const struct log_Quaternion pktq1 {
LOG_PACKET_HEADER_INIT ( LOG_XKQ_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
core : DAL_CORE ( core_index ) ,
q1 : quat . q1 ,
q2 : quat . q2 ,
q3 : quat . q3 ,
@ -225,64 +209,68 @@ void NavEKF3::Log_Write_Quaternion(uint8_t _core, uint64_t time_us) const
@@ -225,64 +209,68 @@ void NavEKF3::Log_Write_Quaternion(uint8_t _core, uint64_t time_us) const
AP : : logger ( ) . WriteBlock ( & pktq1 , sizeof ( pktq1 ) ) ;
}
void NavEKF3 : : Log_Write_Beacon ( uint8_t _core , uint64_t time_us ) const
// logs beacon information, one beacon per call
void NavEKF3_core : : Log_Write_Beacon ( uint64_t time_us )
{
if ( _ core ! = primary ) {
if ( core_index ! = frontend - > primary ) {
// log only primary instance for now
return ;
}
if ( ! statesInitialised | | N_beacons = = 0 ) {
return ;
}
// Ensure that beacons are not skipped due to calling this function at a rate lower than the updates
if ( rngBcnFuseDataReportIndex > = N_beacons ) {
rngBcnFuseDataReportIndex = 0 ;
}
const rngBcnFusionReport_t & report = rngBcnFusionReport [ rngBcnFuseDataReportIndex ] ;
// write range beacon fusion debug packet if the range value is non-zero
uint8_t ID ;
float rng ;
float innovVar ;
float innov ;
float testRatio ;
Vector3f beaconPosNED ;
float bcnPosOffsetHigh ;
float bcnPosOffsetLow ;
Vector3f posNED ;
if ( getRangeBeaconDebug ( _core , ID , rng , innov , innovVar , testRatio , beaconPosNED , bcnPosOffsetHigh , bcnPosOffsetLow , posNED ) ) {
if ( rng > 0.0f ) {
const struct log_RngBcnDebug pkt10 {
LOG_PACKET_HEADER_INIT ( LOG_XKF10_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _core ) ,
ID : ( uint8_t ) ID ,
rng : ( int16_t ) ( 100 * rng ) ,
innov : ( int16_t ) ( 100 * innov ) ,
sqrtInnovVar : ( uint16_t ) ( 100 * sqrtf ( innovVar ) ) ,
testRatio : ( uint16_t ) ( 100 * constrain_float ( testRatio , 0.0f , 650.0f ) ) ,
beaconPosN : ( int16_t ) ( 100 * beaconPosNED . x ) ,
beaconPosE : ( int16_t ) ( 100 * beaconPosNED . y ) ,
beaconPosD : ( int16_t ) ( 100 * beaconPosNED . z ) ,
offsetHigh : ( int16_t ) ( 100 * bcnPosOffsetHigh ) ,
offsetLow : ( int16_t ) ( 100 * bcnPosOffsetLow ) ,
posN : ( int16_t ) ( 100 * posNED . x ) ,
posE : ( int16_t ) ( 100 * posNED . y ) ,
posD : ( int16_t ) ( 100 * posNED . z )
} ;
AP : : logger ( ) . WriteBlock ( & pkt10 , sizeof ( pkt10 ) ) ;
}
if ( report . rng < = 0.0f ) {
rngBcnFuseDataReportIndex + + ;
return ;
}
const struct log_RngBcnDebug pkt10 {
LOG_PACKET_HEADER_INIT ( LOG_XKF10_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( core_index ) ,
ID : rngBcnFuseDataReportIndex ,
rng : ( int16_t ) ( 100 * report . rng ) ,
innov : ( int16_t ) ( 100 * report . innov ) ,
sqrtInnovVar : ( uint16_t ) ( 100 * sqrtf ( report . innovVar ) ) ,
testRatio : ( uint16_t ) ( 100 * constrain_float ( report . testRatio , 0.0f , 650.0f ) ) ,
beaconPosN : ( int16_t ) ( 100 * report . beaconPosNED . x ) ,
beaconPosE : ( int16_t ) ( 100 * report . beaconPosNED . y ) ,
beaconPosD : ( int16_t ) ( 100 * report . beaconPosNED . z ) ,
offsetHigh : ( int16_t ) ( 100 * bcnPosDownOffsetMax ) ,
offsetLow : ( int16_t ) ( 100 * bcnPosDownOffsetMin ) ,
posN : ( int16_t ) ( 100 * receiverPos . x ) ,
posE : ( int16_t ) ( 100 * receiverPos . y ) ,
posD : ( int16_t ) ( 100 * receiverPos . z )
} ;
AP : : logger ( ) . WriteBlock ( & pkt10 , sizeof ( pkt10 ) ) ;
rngBcnFuseDataReportIndex + + ;
}
void NavEKF3 : : Log_Write_BodyOdom ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_BodyOdom ( uint64_t time_us )
{
if ( _core ! = primary ) {
if ( core_index ! = frontend - > primary ) {
// log only primary instance for now
return ;
}
Vector3f velBodyInnov , velBodyInnovVar ;
static uint32_t lastUpdateTime_ms = 0 ;
uint32_t updateTime_ms = getBodyFrameOdomDebug ( _core , velBodyInnov , velBodyInnovVar ) ;
uint32_t updateTime_ms = getBodyFrameOdomDebug ( velBodyInnov , velBodyInnovVar ) ;
if ( updateTime_ms > lastUpdateTime_ms ) {
const struct log_ekfBodyOdomDebug pkt11 {
LOG_PACKET_HEADER_INIT ( LOG_XKFD_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _core ) ,
core : DAL_CORE ( core_index ) ,
velInnovX : velBodyInnov . x ,
velInnovY : velBodyInnov . y ,
velInnovZ : velBodyInnov . z ,
@ -295,9 +283,9 @@ void NavEKF3::Log_Write_BodyOdom(uint8_t _core, uint64_t time_us) const
@@ -295,9 +283,9 @@ void NavEKF3::Log_Write_BodyOdom(uint8_t _core, uint64_t time_us) const
}
}
void NavEKF3 : : Log_Write_State_Variances ( uint8_t _core , uint64_t time_us ) const
void NavEKF3_core : : Log_Write_State_Variances ( uint64_t time_us ) const
{
if ( _ core ! = primary ) {
if ( core_index ! = frontend - > primary ) {
// log only primary instance for now
return ;
}
@ -305,42 +293,40 @@ void NavEKF3::Log_Write_State_Variances(uint8_t _core, uint64_t time_us) const
@@ -305,42 +293,40 @@ void NavEKF3::Log_Write_State_Variances(uint8_t _core, uint64_t time_us) const
static uint32_t lastEkfStateVarLogTime_ms = 0 ;
if ( AP : : dal ( ) . millis ( ) - lastEkfStateVarLogTime_ms > 490 ) {
lastEkfStateVarLogTime_ms = AP : : dal ( ) . millis ( ) ;
float stateVar [ 24 ] ;
getStateVariances ( _core , stateVar ) ;
const struct log_ekfStateVar pktv1 {
LOG_PACKET_HEADER_INIT ( LOG_XKV1_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
v00 : stateVar [ 0 ] ,
v01 : stateVar [ 1 ] ,
v02 : stateVar [ 2 ] ,
v03 : stateVar [ 3 ] ,
v04 : stateVar [ 4 ] ,
v05 : stateVar [ 5 ] ,
v06 : stateVar [ 6 ] ,
v07 : stateVar [ 7 ] ,
v08 : stateVar [ 8 ] ,
v09 : stateVar [ 9 ] ,
v10 : stateVar [ 10 ] ,
v11 : stateVar [ 11 ]
core : DAL_CORE ( core_index ) ,
v00 : P [ 0 ] [ 0 ] ,
v01 : P [ 1 ] [ 1 ] ,
v02 : P [ 2 ] [ 2 ] ,
v03 : P [ 3 ] [ 3 ] ,
v04 : P [ 4 ] [ 4 ] ,
v05 : P [ 5 ] [ 5 ] ,
v06 : P [ 6 ] [ 6 ] ,
v07 : P [ 7 ] [ 7 ] ,
v08 : P [ 8 ] [ 8 ] ,
v09 : P [ 9 ] [ 9 ] ,
v10 : P [ 10 ] [ 10 ] ,
v11 : P [ 11 ] [ 11 ]
} ;
AP : : logger ( ) . WriteBlock ( & pktv1 , sizeof ( pktv1 ) ) ;
const struct log_ekfStateVar pktv2 {
LOG_PACKET_HEADER_INIT ( LOG_XKV2_MSG ) ,
time_us : time_us ,
core : DAL_CORE ( _ core) ,
v00 : stateVar [ 12 ] ,
v01 : stateVar [ 13 ] ,
v02 : stateVar [ 14 ] ,
v03 : stateVar [ 15 ] ,
v04 : stateVar [ 16 ] ,
v05 : stateVar [ 17 ] ,
v06 : stateVar [ 18 ] ,
v07 : stateVar [ 19 ] ,
v08 : stateVar [ 20 ] ,
v09 : stateVar [ 21 ] ,
v10 : stateVar [ 22 ] ,
v11 : stateVar [ 23 ]
core : DAL_CORE ( core_index ) ,
v00 : P [ 12 ] [ 12 ] ,
v01 : P [ 13 ] [ 13 ] ,
v02 : P [ 14 ] [ 14 ] ,
v03 : P [ 15 ] [ 15 ] ,
v04 : P [ 16 ] [ 16 ] ,
v05 : P [ 17 ] [ 17 ] ,
v06 : P [ 18 ] [ 18 ] ,
v07 : P [ 19 ] [ 19 ] ,
v08 : P [ 20 ] [ 20 ] ,
v09 : P [ 21 ] [ 21 ] ,
v10 : P [ 22 ] [ 22 ] ,
v11 : P [ 23 ] [ 23 ]
} ;
AP : : logger ( ) . WriteBlock ( & pktv2 , sizeof ( pktv2 ) ) ;
}
@ -360,35 +346,40 @@ void NavEKF3::Log_Write()
@@ -360,35 +346,40 @@ void NavEKF3::Log_Write()
uint64_t time_us = AP : : dal ( ) . micros64 ( ) ;
// note that several of these functions exit-early if they're not
// attempting to log the primary core.
for ( uint8_t i = 0 ; i < activeCores ( ) ; i + + ) {
Log_Write_XKF1 ( i , time_us ) ;
Log_Write_XKF2 ( i , time_us ) ;
Log_Write_XKF3 ( i , time_us ) ;
Log_Write_XKF4 ( i , time_us ) ;
Log_Write_XKF5 ( i , time_us ) ;
core [ i ] . Log_Write ( time_us ) ;
}
AP : : dal ( ) . start_frame ( AP_DAL : : FrameType : : LogWriteEKF3 ) ;
}
Log_Write_XKFS ( i , time_us ) ;
Log_Write_Quaternion ( i , time_us ) ;
Log_Write_GSF ( i , time_us ) ;
void NavEKF3_core : : Log_Write ( uint64_t time_us )
{
// note that several of these functions exit-early if they're not
// attempting to log the primary core.
Log_Write_XKF1 ( time_us ) ;
Log_Write_XKF2 ( time_us ) ;
Log_Write_XKF3 ( time_us ) ;
Log_Write_XKF4 ( time_us ) ;
Log_Write_XKF5 ( time_us ) ;
// write range beacon fusion debug packet if the range value is non-zero
Log_Write_Beacon ( i , time_us ) ;
Log_Write_XKFS ( time_us ) ;
Log_Write_Quaternion ( time_us ) ;
Log_Write_GSF ( time_us ) ;
// write debug data for body frame odometry fusion
Log_Write_BodyOdom ( i , time_us ) ;
// write range beacon fusion debug packet if the range value is non-zero
Log_Write_Beacon ( time_us ) ;
// log state variances every 0.49s
Log_Write_State_Variances ( i , time_us ) ;
// write debug data for body frame odometry fusion
Log_Write_BodyOdom ( time_us ) ;
Log_Write_Timing ( i , time_us ) ;
}
// log state variances every 0.49s
Log_Write_State_Variances ( time_us ) ;
AP : : dal ( ) . start_frame ( AP_DAL : : FrameType : : LogWriteEKF3 ) ;
Log_Write_Timing ( time_us ) ;
}
void NavEKF3 : : Log_Write_Timing ( uint8_t _core , uint 64_t time_us ) const
void NavEKF3_core : : Log_Write_Timing ( uint64_t time_us )
{
// log EKF timing statistics every 5s
static uint32_t lastTimingLogTime_ms = 0 ;
@ -397,13 +388,10 @@ void NavEKF3::Log_Write_Timing(uint8_t _core, uint64_t time_us) const
@@ -397,13 +388,10 @@ void NavEKF3::Log_Write_Timing(uint8_t _core, uint64_t time_us) const
}
lastTimingLogTime_ms = AP : : dal ( ) . millis ( ) ;
struct ekf_timing timing ;
getTimingStatistics ( _core , timing ) ;
const struct log_XKT xkt {
LOG_PACKET_HEADER_INIT ( LOG_XKT_MSG ) ,
time_us : time_us ,
core : _ core,
core : core_index ,
timing_count : timing . count ,
dtIMUavg_min : timing . dtIMUavg_min ,
dtIMUavg_max : timing . dtIMUavg_max ,
@ -414,11 +402,17 @@ void NavEKF3::Log_Write_Timing(uint8_t _core, uint64_t time_us) const
@@ -414,11 +402,17 @@ void NavEKF3::Log_Write_Timing(uint8_t _core, uint64_t time_us) const
delVelDT_min : timing . delVelDT_min ,
delVelDT_max : timing . delVelDT_max ,
} ;
memset ( & timing , 0 , sizeof ( timing ) ) ;
AP : : logger ( ) . WriteBlock ( & xkt , sizeof ( xkt ) ) ;
}
void NavEKF3 : : Log_Write_GSF ( uint8_t _core , uint 64_t time_us ) const
void NavEKF3_core : : Log_Write_GSF ( uint64_t time_us )
{
if ( yawEstimator = = nullptr ) {
return ;
}
float yaw_composite ;
float yaw_composite_variance ;
float yaw [ N_MODELS_EKFGSF ] ;
@ -426,7 +420,9 @@ void NavEKF3::Log_Write_GSF(uint8_t _core, uint64_t time_us) const
@@ -426,7 +420,9 @@ void NavEKF3::Log_Write_GSF(uint8_t _core, uint64_t time_us) const
float ive [ N_MODELS_EKFGSF ] ;
float wgt [ N_MODELS_EKFGSF ] ;
if ( getDataEKFGSF ( _core , yaw_composite , yaw_composite_variance , yaw , ivn , ive , wgt ) ) {
if ( ! yawEstimator - > getLogData ( yaw_composite , yaw_composite_variance , yaw , ivn , ive , wgt ) ) {
return ;
}
// @LoggerMessage: XKY0
// @Description: EKF3 Yaw Estimator States
@ -497,5 +493,4 @@ void NavEKF3::Log_Write_GSF(uint8_t _core, uint64_t time_us) const
@@ -497,5 +493,4 @@ void NavEKF3::Log_Write_GSF(uint8_t _core, uint64_t time_us) const
ive [ 2 ] ,
ive [ 3 ] ,
ive [ 4 ] ) ;
}
}