More details and code example
parent
796364d4fb
commit
eb705c6a70
|
@ -6,6 +6,8 @@
|
|||
"source": [
|
||||
"# AHRSFactor\n",
|
||||
"\n",
|
||||
"<a href=\"https://colab.research.google.com/github/borglab/gtsam/blob/develop/gtsam/navigation/doc/AHRSFactor.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>\n",
|
||||
"\n",
|
||||
"## Overview\n",
|
||||
"\n",
|
||||
"The `AHRSFactor` class implements a factor to implement an *Attitude and Heading Reference System* (AHRS) within GTSAM. It is a binary factor, taking preintegrated measurements from a gyroscope between two discrete time steps, typically denoted as $t_i$ and $t_j$. These preintegrated measurements encapsulate the rotational motion observed by an inertial measurement unit (IMU) between these two timestamps.\n",
|
||||
|
@ -13,6 +15,27 @@
|
|||
"The `AHRSFactor` thus constrains two attitude states (represented as elements of $SO(3)$) based solely on gyroscope measurements. Accelerometer or magnetometer aiding, needed to build a complete AHRS system, must be handled separately."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {
|
||||
"tags": [
|
||||
"remove-cell"
|
||||
]
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Note: you may need to restart the kernel to use updated packages.\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%pip install --quiet gtsam plotly"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
@ -72,19 +95,119 @@
|
|||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Typical Use Case\n",
|
||||
"## Usage\n",
|
||||
"\n",
|
||||
"`AHRSFactor` is typically applied within factor-graph-based orientation estimators where orientation states are discretized in time. Its primary role is to incorporate gyroscope information in a computationally efficient and numerically stable way, especially useful in IMU-centric navigation scenarios like:\n",
|
||||
"First, create a PreintegratedAhrsMeasurements (PAM) object by supplying the necessary IMU parameters. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 2,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"import numpy as np\n",
|
||||
"from gtsam import PreintegrationParams, PreintegratedAhrsMeasurements\n",
|
||||
"\n",
|
||||
"- Robotics and autonomous vehicles\n",
|
||||
"- UAV navigation systems\n",
|
||||
"- Motion capture and tracking systems"
|
||||
"params = PreintegrationParams.MakeSharedU(9.81)\n",
|
||||
"params.setGyroscopeCovariance(np.deg2rad(1)*np.eye(3))\n",
|
||||
"params.setAccelerometerCovariance(0.01*np.eye(3))\n",
|
||||
"\n",
|
||||
"biasHat = np.zeros(3) # Assuming no bias for simplicity\n",
|
||||
"pam = PreintegratedAhrsMeasurements(params, biasHat) "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"\n",
|
||||
"Next, integrate each gyroscope measurement along with its corresponding time interval to accumulate the preintegrated rotation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 3,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from gtsam import Point3\n",
|
||||
"np.random.seed(42) # For reproducibility\n",
|
||||
"for _ in range(15): # Add 15 random measurements, biased to move around z-axis\n",
|
||||
" omega = Point3(0,0,-0.5) + 0.1*np.random.randn(3) # Random angular velocity vector\n",
|
||||
" pam.integrateMeasurement(omega, deltaT=0.1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Finally, construct the AHRSFactor using the accumulated PAM and the keys representing the rotation states at the two time instants."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 4,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"from gtsam import AHRSFactor\n",
|
||||
"bias_key = 0 # Key for the bias\n",
|
||||
"i, j = 1, 2 # Indices of the two attitude unknowns\n",
|
||||
"ahrs_factor = AHRSFactor(i, j, bias_key, pam)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 5,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"AHRSFactor(1,2,0, preintegrated measurements: deltaTij [1.5]\n",
|
||||
" deltaRij.ypr = ( -0.82321 -0.0142842 0.0228577)\n",
|
||||
"biasHat [0 0 0]\n",
|
||||
" PreintMeasCov [ 0.0261799 1.73472e-18 1.35525e-20\n",
|
||||
"1.73472e-18 0.0261799 9.23266e-20\n",
|
||||
"1.35525e-20 1.17738e-19 0.0261799 ]\n",
|
||||
" noise model: diagonal sigmas [0.161802159; 0.161802159; 0.161802159];\n",
|
||||
"\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"print(ahrs_factor)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Source\n",
|
||||
"- [AHRSFactor.h](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/AHRSFactor.h)\n",
|
||||
"- [AHRSFactor.cpp](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/AHRSFactor.cpp)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"kernelspec": {
|
||||
"display_name": "py312",
|
||||
"language": "python",
|
||||
"name": "python3"
|
||||
},
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
"codemirror_mode": {
|
||||
"name": "ipython",
|
||||
"version": 3
|
||||
},
|
||||
"file_extension": ".py",
|
||||
"mimetype": "text/x-python",
|
||||
"name": "python",
|
||||
"nbconvert_exporter": "python",
|
||||
"pygments_lexer": "ipython3",
|
||||
"version": "3.12.6"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
|
|
|
@ -21,7 +21,11 @@
|
|||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 1,
|
||||
"metadata": {},
|
||||
"metadata": {
|
||||
"tags": [
|
||||
"remove-cell"
|
||||
]
|
||||
},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
|
@ -118,6 +122,23 @@
|
|||
"print(params)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"You can (and should) configure using your gyroscope's noise covariance matrix and the optional Coriolis acceleration compensation vector:\n",
|
||||
"\n",
|
||||
"### Setters\n",
|
||||
"- `setGyroscopeCovariance`: Sets the 3×3 continuous-time noise covariance matrix for gyroscope measurements.\n",
|
||||
"- `setOmegaCoriolis`: Sets an optional Coriolis acceleration compensation vector.\n",
|
||||
"- `setBodyPSensor`: Sets an optional pose transformation between the body frame and the sensor frame.\n",
|
||||
"\n",
|
||||
"### Getters\n",
|
||||
"- `getGyroscopeCovariance`: Returns the gyroscope covariance matrix.\n",
|
||||
"- `getOmegaCoriolis`: Returns the optional Coriolis acceleration vector.\n",
|
||||
"- `getBodyPSensor`: Returns the optional body-to-sensor pose transformation."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
|
@ -9017,6 +9038,15 @@
|
|||
"fig.update_layout(scene_camera=dict(eye=dict(x=1.1, y=-1.1, z=0.2)), margin=dict(l=0, r=0, t=0, b=0))\n",
|
||||
"fig.show()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Source\n",
|
||||
"- [PreintegratedRotation.h](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegratedRotation.h)\n",
|
||||
"- [PreintegratedRotation.cpp](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegratedRotation.cpp)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
{
|
||||
"cells": [
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# PreintegrationParams\n",
|
||||
"\n",
|
||||
"The `PreintegrationParams` class extends `PreintegratedRotationParams` to provide a complete configuration for IMU preintegration, including accelerometer measurements:\n",
|
||||
"\n",
|
||||
"| Parameter | Description |\n",
|
||||
"|-----------|-------------|\n",
|
||||
"| `accelerometerCovariance` | 3×3 continuous-time noise covariance matrix for accelerometer measurements (units: m²/s⁴/Hz) |\n",
|
||||
"| `integrationCovariance` | 3×3 covariance matrix representing additional uncertainty during integration |\n",
|
||||
"| `use2ndOrderCoriolis` | Boolean flag to enable more accurate Coriolis effect compensation |\n",
|
||||
"| `n_gravity` | Gravity vector in the navigation frame (units: m/s²) |\n",
|
||||
"\n",
|
||||
"## Convenience API\n",
|
||||
"\n",
|
||||
"The class provides convenient factory methods for the two most common navigation frame conventions:\n",
|
||||
"- `MakeSharedD()`: Creates parameters for a Z-down frame (like NED - North-East-Down)\n",
|
||||
"- `MakeSharedU()`: Creates parameters for a Z-up frame (like ENU - East-North-Up)\n",
|
||||
"\n",
|
||||
"Both methods also take a [local gravity constant](https://www.sensorsone.com/local-gravity-calculator/), which decreases as one gets closer to the equator. The default is $9.81m/s^2$."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Detailed API\n",
|
||||
"\n",
|
||||
"- The constructor requires the navigation frame gravity vector as an argument.\n",
|
||||
"\n",
|
||||
"### Setters\n",
|
||||
"- `setGyroscopeCovariance`: Sets the 3×3 continuous-time noise covariance matrix for gyroscope measurements.\n",
|
||||
"- `setOmegaCoriolis`: Sets an optional Coriolis acceleration compensation vector.\n",
|
||||
"- `setBodyPSensor`: Sets an optional pose transformation between the body frame and the sensor frame.\n",
|
||||
"- `setAccelerometerCovariance`: Sets the accelerometer covariance matrix.\n",
|
||||
"- `setIntegrationCovariance`: Sets the integration covariance matrix.\n",
|
||||
"- `setUse2ndOrderCoriolis`: Sets the flag controlling the use of second order Coriolis compensation.\n",
|
||||
"\n",
|
||||
"### Getters\n",
|
||||
"- `getGyroscopeCovariance`: Returns the gyroscope covariance matrix.\n",
|
||||
"- `getOmegaCoriolis`: Returns the optional Coriolis acceleration vector.\n",
|
||||
"- `getBodyPSensor`: Returns the optional body-to-sensor pose transformation.\n",
|
||||
"- `getAccelerometerCovariance`: Returns the current accelerometer covariance matrix.\n",
|
||||
"- `getIntegrationCovariance`: Returns the current integration covariance matrix.\n",
|
||||
"- `getGravity`: Returns the navigation frame gravity vector.\n",
|
||||
"- `isUsing2ndOrderCoriolis`: Returns the status of the second order Coriolis flag."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## Source\n",
|
||||
"- [PreintegrationParams.h](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegrationParams.h)\n",
|
||||
"- [PreintegrationParams.cpp](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegrationParams.cpp)"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
"language_info": {
|
||||
"name": "python"
|
||||
}
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 2
|
||||
}
|
|
@ -314,10 +314,7 @@ class PreintegratedAhrsMeasurements {
|
|||
|
||||
virtual class AHRSFactor : gtsam::NonlinearFactor {
|
||||
AHRSFactor(size_t rot_i, size_t rot_j,size_t bias,
|
||||
const gtsam::PreintegratedAhrsMeasurements& preintegratedMeasurements, gtsam::Vector omegaCoriolis);
|
||||
AHRSFactor(size_t rot_i, size_t rot_j, size_t bias,
|
||||
const gtsam::PreintegratedAhrsMeasurements& preintegratedMeasurements, gtsam::Vector omegaCoriolis,
|
||||
const gtsam::Pose3& body_P_sensor);
|
||||
const gtsam::PreintegratedAhrsMeasurements& preintegratedMeasurements);
|
||||
|
||||
// Standard Interface
|
||||
gtsam::PreintegratedAhrsMeasurements preintegratedMeasurements() const;
|
||||
|
@ -329,6 +326,13 @@ virtual class AHRSFactor : gtsam::NonlinearFactor {
|
|||
|
||||
// enable serialization functionality
|
||||
void serialize() const;
|
||||
|
||||
// deprecated:
|
||||
AHRSFactor(size_t rot_i, size_t rot_j,size_t bias,
|
||||
const gtsam::PreintegratedAhrsMeasurements& preintegratedMeasurements, gtsam::Vector omegaCoriolis);
|
||||
AHRSFactor(size_t rot_i, size_t rot_j, size_t bias,
|
||||
const gtsam::PreintegratedAhrsMeasurements& preintegratedMeasurements, gtsam::Vector omegaCoriolis,
|
||||
const gtsam::Pose3& body_P_sensor);
|
||||
};
|
||||
|
||||
#include <gtsam/navigation/AttitudeFactor.h>
|
||||
|
|
|
@ -9,13 +9,13 @@ The `navigation` module in GTSAM provides specialized tools for inertial navigat
|
|||
|
||||
## Attitude Estimation
|
||||
|
||||
- **[PreintegrationParams](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegrationParams.h)**: Parameters for IMU preintegration.
|
||||
- **[PreintegratedRotation](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegratedRotation.h)**: Handles gyroscope measurements to track rotation changes.
|
||||
- **[AHRSFactor](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/AHRSFactor.h)**: Attitude and Heading Reference System factor for orientation estimation.
|
||||
- **[AttitudeFactor](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/AttitudeFactor.h)**: Factors for attitude estimation from reference directions.
|
||||
|
||||
## IMU Preintegration
|
||||
|
||||
- **[PreintegrationParams](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegrationParams.h)**: Base parameters for IMU preintegration.
|
||||
- **[PreintegrationBase](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/PreintegrationBase.h)**: Base class for IMU preintegration classes.
|
||||
- **[ManifoldPreintegration](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/ManifoldPreintegration.h)**: Implements IMU preintegration using manifold-based methods as in the Forster et al paper.
|
||||
- **[TangentPreintegration](https://github.com/borglab/gtsam/blob/develop/gtsam/navigation/TangentPreintegration.h)**: Implements IMU preintegration using tangent space methods, developed at Skydio.
|
||||
|
|
Loading…
Reference in New Issue