You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
239 lines
4.9 KiB
239 lines
4.9 KiB
#include "ekf_wrapper.h" |
|
|
|
EkfWrapper::EkfWrapper(std::shared_ptr<Ekf> ekf): |
|
_ekf{ekf} |
|
{ |
|
_ekf_params = _ekf->getParamHandle(); |
|
} |
|
|
|
EkfWrapper::~EkfWrapper() |
|
{ |
|
} |
|
|
|
void EkfWrapper::setBaroHeight() |
|
{ |
|
_ekf_params->vdist_sensor_type = VDIST_SENSOR_BARO; |
|
} |
|
|
|
bool EkfWrapper::isIntendingBaroHeightFusion() const |
|
{ |
|
return _ekf->control_status_flags().baro_hgt; |
|
} |
|
|
|
void EkfWrapper::setGpsHeight() |
|
{ |
|
_ekf_params->vdist_sensor_type = VDIST_SENSOR_GPS; |
|
} |
|
|
|
bool EkfWrapper::isIntendingGpsHeightFusion() const |
|
{ |
|
return _ekf->control_status_flags().gps_hgt; |
|
} |
|
|
|
void EkfWrapper::setRangeHeight() |
|
{ |
|
_ekf_params->vdist_sensor_type = VDIST_SENSOR_RANGE; |
|
} |
|
|
|
bool EkfWrapper::isIntendingRangeHeightFusion() const |
|
{ |
|
return _ekf->control_status_flags().rng_hgt; |
|
} |
|
|
|
void EkfWrapper::setVisionHeight() |
|
{ |
|
_ekf_params->vdist_sensor_type = VDIST_SENSOR_EV; |
|
} |
|
|
|
bool EkfWrapper::isIntendingVisionHeightFusion() const |
|
{ |
|
return _ekf->control_status_flags().ev_hgt; |
|
} |
|
|
|
void EkfWrapper::enableGpsFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_GPS; |
|
} |
|
|
|
void EkfWrapper::disableGpsFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_GPS; |
|
} |
|
|
|
bool EkfWrapper::isIntendingGpsFusion() const |
|
{ |
|
return _ekf->control_status_flags().gps; |
|
} |
|
|
|
void EkfWrapper::enableGpsHeadingFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_GPSYAW; |
|
} |
|
|
|
void EkfWrapper::disableGpsHeadingFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_GPSYAW; |
|
} |
|
|
|
bool EkfWrapper::isIntendingGpsHeadingFusion() const |
|
{ |
|
return _ekf->control_status_flags().gps_yaw; |
|
} |
|
|
|
void EkfWrapper::enableFlowFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_OF; |
|
} |
|
|
|
void EkfWrapper::disableFlowFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_OF; |
|
} |
|
|
|
bool EkfWrapper::isIntendingFlowFusion() const |
|
{ |
|
return _ekf->control_status_flags().opt_flow; |
|
} |
|
|
|
void EkfWrapper::setFlowOffset(const Vector3f &offset) |
|
{ |
|
_ekf_params->flow_pos_body = offset; |
|
} |
|
|
|
void EkfWrapper::enableExternalVisionPositionFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_EVPOS; |
|
} |
|
|
|
void EkfWrapper::disableExternalVisionPositionFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_EVPOS; |
|
} |
|
|
|
bool EkfWrapper::isIntendingExternalVisionPositionFusion() const |
|
{ |
|
return _ekf->control_status_flags().ev_pos; |
|
} |
|
|
|
void EkfWrapper::enableExternalVisionVelocityFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_EVVEL; |
|
} |
|
|
|
void EkfWrapper::disableExternalVisionVelocityFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_EVVEL; |
|
} |
|
|
|
bool EkfWrapper::isIntendingExternalVisionVelocityFusion() const |
|
{ |
|
return _ekf->control_status_flags().ev_vel; |
|
} |
|
|
|
void EkfWrapper::enableExternalVisionHeadingFusion() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_USE_EVYAW; |
|
} |
|
|
|
void EkfWrapper::disableExternalVisionHeadingFusion() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_USE_EVYAW; |
|
} |
|
|
|
bool EkfWrapper::isIntendingExternalVisionHeadingFusion() const |
|
{ |
|
return _ekf->control_status_flags().ev_yaw; |
|
} |
|
|
|
void EkfWrapper::enableExternalVisionAlignment() |
|
{ |
|
_ekf_params->fusion_mode |= MASK_ROTATE_EV; |
|
} |
|
|
|
void EkfWrapper::disableExternalVisionAlignment() |
|
{ |
|
_ekf_params->fusion_mode &= ~MASK_ROTATE_EV; |
|
} |
|
|
|
bool EkfWrapper::isIntendingMagHeadingFusion() const |
|
{ |
|
return _ekf->control_status_flags().mag_hdg; |
|
} |
|
|
|
bool EkfWrapper::isIntendingMag3DFusion() const |
|
{ |
|
return _ekf->control_status_flags().mag_3D; |
|
} |
|
|
|
void EkfWrapper::setMagFuseTypeNone() |
|
{ |
|
_ekf_params->mag_fusion_type = MAG_FUSE_TYPE_NONE; |
|
} |
|
|
|
bool EkfWrapper::isWindVelocityEstimated() const |
|
{ |
|
return _ekf->control_status_flags().wind; |
|
} |
|
|
|
void EkfWrapper::enableTerrainRngFusion() |
|
{ |
|
_ekf_params->terrain_fusion_mode |= TerrainFusionMask::TerrainFuseRangeFinder; |
|
} |
|
|
|
void EkfWrapper::disableTerrainRngFusion() |
|
{ |
|
_ekf_params->terrain_fusion_mode &= ~TerrainFusionMask::TerrainFuseRangeFinder; |
|
} |
|
|
|
bool EkfWrapper::isIntendingTerrainRngFusion() const |
|
{ |
|
terrain_fusion_status_u terrain_status; |
|
terrain_status.value = _ekf->getTerrainEstimateSensorBitfield(); |
|
return terrain_status.flags.range_finder; |
|
} |
|
|
|
void EkfWrapper::enableTerrainFlowFusion() |
|
{ |
|
_ekf_params->terrain_fusion_mode |= TerrainFusionMask::TerrainFuseOpticalFlow; |
|
} |
|
|
|
void EkfWrapper::disableTerrainFlowFusion() |
|
{ |
|
_ekf_params->terrain_fusion_mode &= ~TerrainFusionMask::TerrainFuseOpticalFlow; |
|
} |
|
|
|
bool EkfWrapper::isIntendingTerrainFlowFusion() const |
|
{ |
|
terrain_fusion_status_u terrain_status; |
|
terrain_status.value = _ekf->getTerrainEstimateSensorBitfield(); |
|
return terrain_status.flags.flow; |
|
} |
|
|
|
Eulerf EkfWrapper::getEulerAngles() const |
|
{ |
|
return Eulerf(_ekf->getQuaternion()); |
|
} |
|
|
|
float EkfWrapper::getYawAngle() const |
|
{ |
|
const Eulerf euler(_ekf->getQuaternion()); |
|
return euler(2); |
|
} |
|
|
|
matrix::Vector<float, 4> EkfWrapper::getQuaternionVariance() const |
|
{ |
|
return matrix::Vector<float, 4>(_ekf->orientation_covariances().diag()); |
|
} |
|
|
|
int EkfWrapper::getQuaternionResetCounter() const |
|
{ |
|
float tmp[4]; |
|
uint8_t counter; |
|
_ekf->get_quat_reset(tmp, &counter); |
|
return static_cast<int>(counter); |
|
} |
|
|
|
matrix::Vector3f EkfWrapper::getDeltaVelBiasVariance() const |
|
{ |
|
return _ekf->covariances_diagonal().slice<3, 1>(13,0); |
|
}
|
|
|