STAR
Cal STAR — firmware, DAQ server, and engine design
Loading...
Searching...
No Matches
EKFNavigationEnhanced.hpp
Go to the documentation of this file.
1
#ifndef EKF_NAVIGATION_ENHANCED_HPP
2
#define EKF_NAVIGATION_ENHANCED_HPP
3
4
#include "
../calibration/IMUCalibration.hpp
"
5
#include "EKFNavigation.hpp"
6
7
namespace
fsw
{
8
namespace
nav
{
9
10
/**
11
* @brief Enhanced EKF Navigation with Magnetometer Support
12
*
13
* Extends EKFNavigation to properly integrate magnetometer measurements
14
* for heading estimation and attitude correction.
15
*/
16
class
EKFNavigationEnhanced
:
public
EKFNavigation {
17
public
:
18
/**
19
* @brief Enhanced configuration with magnetometer parameters
20
*/
21
struct
EnhancedConfig
:
public
EKFConfig {
22
// Magnetometer noise
23
double
magnetometer_noise
= 0.01;
// Magnetometer noise (T²)
24
double
magnetic_declination
= 0.0;
// Magnetic declination [rad]
25
26
// Magnetometer calibration
27
bool
use_magnetometer
=
true
;
// Enable magnetometer fusion
28
bool
use_magnetometer_for_heading
=
true
;
// Use mag for heading
29
double
magnetometer_weight
= 0.1;
// Weight relative to gyro
30
31
// Heading estimation
32
bool
enable_heading_estimation
=
true
;
33
double
heading_process_noise
= 0.01;
// Heading process noise [rad²/s]
34
};
35
36
EKFNavigationEnhanced
();
37
~EKFNavigationEnhanced
();
38
39
/**
40
* @brief Initialize with enhanced configuration
41
*/
42
bool
initialize
(
const
EnhancedConfig
&
config
,
const
NavigationState& initial_state);
43
44
/**
45
* @brief Process magnetometer measurement with calibration
46
* @param measurement Raw magnetometer reading
47
* @param calibrated Calibrated magnetometer reading
48
* @return true if processed successfully
49
*/
50
bool
processMagnetometerMeasurement
(
51
const
IMUMeasurement& measurement,
52
const
calibration::IMUCalibration::CalibratedReading
&
calibrated
);
53
54
/**
55
* @brief Get heading estimate (from magnetometer + gyro fusion)
56
*/
57
double
getHeading
()
const
;
58
59
/**
60
* @brief Get magnetic field estimate
61
*/
62
Eigen::Vector3d
getMagneticField
()
const
;
63
64
/**
65
* @brief Set IMU calibration system
66
*/
67
void
setIMUCalibration
(std::shared_ptr<calibration::IMUCalibrationSystem> calib_system);
68
69
private
:
70
// Enhanced measurement processing
71
void
updateWithMagnetometer
(
const
Eigen::Vector3d& mag_field);
72
Eigen::Vector3d
computeMagnetometerMeasurement
(
const
Eigen::VectorXd&
state
)
const
;
73
Eigen::MatrixXd
computeMagnetometerJacobian
(
const
Eigen::VectorXd&
state
)
const
;
74
75
// Heading estimation
76
double
computeHeadingFromQuaternion
(
const
Eigen::Quaterniond& q)
const
;
77
double
computeHeadingFromMagnetometer
(
const
Eigen::Vector3d& mag_field,
78
const
Eigen::Quaterniond& q)
const
;
79
80
EnhancedConfig
enhanced_config_
;
81
std::shared_ptr<calibration::IMUCalibrationSystem>
imu_calibration_
;
82
83
// Magnetic field state
84
Eigen::Vector3d
magnetic_field_
;
// Estimated magnetic field [T]
85
double
heading_
;
// Estimated heading [rad]
86
mutable
std::mutex
mag_mutex_
;
87
};
88
89
}
// namespace nav
90
}
// namespace fsw
91
92
#endif
// EKF_NAVIGATION_ENHANCED_HPP
IMUCalibration.hpp
calibrated
static bool calibrated
Definition
board_adc.c:17
fsw::nav::EKFNavigationEnhanced::initialize
bool initialize(const EnhancedConfig &config, const NavigationState &initial_state)
Initialize with enhanced configuration.
fsw::nav::EKFNavigationEnhanced::computeMagnetometerJacobian
Eigen::MatrixXd computeMagnetometerJacobian(const Eigen::VectorXd &state) const
fsw::nav::EKFNavigationEnhanced::mag_mutex_
std::mutex mag_mutex_
Definition
EKFNavigationEnhanced.hpp:86
fsw::nav::EKFNavigationEnhanced::getMagneticField
Eigen::Vector3d getMagneticField() const
Get magnetic field estimate.
fsw::nav::EKFNavigationEnhanced::enhanced_config_
EnhancedConfig enhanced_config_
Definition
EKFNavigationEnhanced.hpp:80
fsw::nav::EKFNavigationEnhanced::processMagnetometerMeasurement
bool processMagnetometerMeasurement(const IMUMeasurement &measurement, const calibration::IMUCalibration::CalibratedReading &calibrated)
Process magnetometer measurement with calibration.
fsw::nav::EKFNavigationEnhanced::computeHeadingFromMagnetometer
double computeHeadingFromMagnetometer(const Eigen::Vector3d &mag_field, const Eigen::Quaterniond &q) const
fsw::nav::EKFNavigationEnhanced::setIMUCalibration
void setIMUCalibration(std::shared_ptr< calibration::IMUCalibrationSystem > calib_system)
Set IMU calibration system.
fsw::nav::EKFNavigationEnhanced::heading_
double heading_
Definition
EKFNavigationEnhanced.hpp:85
fsw::nav::EKFNavigationEnhanced::updateWithMagnetometer
void updateWithMagnetometer(const Eigen::Vector3d &mag_field)
fsw::nav::EKFNavigationEnhanced::getHeading
double getHeading() const
Get heading estimate (from magnetometer + gyro fusion).
fsw::nav::EKFNavigationEnhanced::~EKFNavigationEnhanced
~EKFNavigationEnhanced()
fsw::nav::EKFNavigationEnhanced::imu_calibration_
std::shared_ptr< calibration::IMUCalibrationSystem > imu_calibration_
Definition
EKFNavigationEnhanced.hpp:81
fsw::nav::EKFNavigationEnhanced::magnetic_field_
Eigen::Vector3d magnetic_field_
Definition
EKFNavigationEnhanced.hpp:84
fsw::nav::EKFNavigationEnhanced::computeHeadingFromQuaternion
double computeHeadingFromQuaternion(const Eigen::Quaterniond &q) const
fsw::nav::EKFNavigationEnhanced::computeMagnetometerMeasurement
Eigen::Vector3d computeMagnetometerMeasurement(const Eigen::VectorXd &state) const
fsw::nav::EKFNavigationEnhanced::EKFNavigationEnhanced
EKFNavigationEnhanced()
state
static ActuatorControllerState state
Definition
main.cpp:57
fsw::config
Definition
BoardDiscovery.hpp:16
fsw::nav
Definition
EKFNavigationEnhanced.hpp:8
fsw
Motorized ball valve position: raw ADC counts -> % open.
Definition
AllanVariance.hpp:7
fsw::calibration::IMUCalibration::CalibratedReading
Calibrated reading.
Definition
IMUCalibration.hpp:70
fsw::nav::EKFNavigationEnhanced::EnhancedConfig
Enhanced configuration with magnetometer parameters.
Definition
EKFNavigationEnhanced.hpp:21
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::enable_heading_estimation
bool enable_heading_estimation
Definition
EKFNavigationEnhanced.hpp:32
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::magnetic_declination
double magnetic_declination
Definition
EKFNavigationEnhanced.hpp:24
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::use_magnetometer_for_heading
bool use_magnetometer_for_heading
Definition
EKFNavigationEnhanced.hpp:28
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::magnetometer_weight
double magnetometer_weight
Definition
EKFNavigationEnhanced.hpp:29
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::use_magnetometer
bool use_magnetometer
Definition
EKFNavigationEnhanced.hpp:27
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::magnetometer_noise
double magnetometer_noise
Definition
EKFNavigationEnhanced.hpp:23
fsw::nav::EKFNavigationEnhanced::EnhancedConfig::heading_process_noise
double heading_process_noise
Definition
EKFNavigationEnhanced.hpp:33
daq-server
diablo_server
lib
include
nav
EKFNavigationEnhanced.hpp
Generated by
1.15.0