Monado OpenXR Runtime
Loading...
Searching...
No Matches
math.hpp
Go to the documentation of this file.
1// Copyright 2026, Beyley Cardellio
2// SPDX-License-Identifier: BSL-1.0
3/*!
4 * @file
5 * @brief Generic math helpers for constellation optimizer code.
6 * @author Beyley Cardellio <ep1cm1n10n123@gmail.com>
7 * @ingroup tracking
8 */
9
10#pragma once
11
13#include "math/m_quatexpmap.hpp"
15
16#include <Eigen/Core>
17#include <Eigen/Geometry>
18
19#include <ceres/jet.h>
20#include <ceres/product_manifold.h>
21#include <ceres/autodiff_manifold.h>
22
23#include "pose_optimize.hpp"
24
25
26namespace xrt::tracking::constellation::optimizer {
27
28using namespace xrt::auxiliary::math;
29
30// Covariance lives in the manifold's tangent space, which is one dimension smaller than the ambient
31// parameter block: the quaternion contributes 3 tangent dimensions, not 4.
32typedef Eigen::Matrix<double, kPoseCovarianceSize, kPoseCovarianceSize> PoseStateCovarianceMatrix;
33
34//! Returns an Isometry3f from an @ref xrt_pose.
35inline Eigen::Isometry3f
37{
38 return {Eigen::Translation3f{map_vec3(p.position)} * map_quat(p.orientation)};
39}
40
41/*!
42 * Right-multiplying quaternion manifold, matches our local convention.
43 */
45{
46 template <typename T>
47 bool
48 Plus(const T *x, const T *delta, T *x_plus_delta) const
49 {
50 const Eigen::Map<const Eigen::Quaternion<T>> q(x);
51 const Eigen::Map<const Eigen::Vector3<T>> w(delta);
52 Eigen::Map<Eigen::Quaternion<T>> result(x_plus_delta);
53
54 result = q * quat_exp_so3(w);
55 return true;
56 }
57
58 template <typename T>
59 bool
60 Minus(const T *y, const T *x, T *y_minus_x) const
61 {
62 const Eigen::Map<const Eigen::Quaternion<T>> q_y(y);
63 const Eigen::Map<const Eigen::Quaternion<T>> q_x(x);
64 Eigen::Map<Eigen::Vector3<T>> result(y_minus_x);
65
66 result = quat_ln_so3(Eigen::Quaternion<T>(q_x.conjugate() * q_y));
67 return true;
68 }
69};
70
71// Pose manifold, (tX, tY, tZ), (qX, qY, qZ, qW)
72typedef ceres::ProductManifold<ceres::EuclideanManifold<3>, ceres::AutoDiffManifold<QuaternionManifoldFunctor, 4, 3>>
73 PoseManifold;
74
75// Pose plus linear velocity, (tX, tY, tZ), (qX, qY, qZ, qW), (vX, vY, vZ). 10 ambient, 9 tangent.
76typedef ceres::ProductManifold<ceres::EuclideanManifold<3>,
77 ceres::AutoDiffManifold<QuaternionManifoldFunctor, 4, 3>,
78 ceres::EuclideanManifold<3>>
79 PoseWithVelocityManifold;
80
81}; // namespace xrt::tracking::constellation::optimizer
Interoperability helpers connecting internal math types and Eigen.
Base implementations for math library.
Helpers for quatexpmap math for bigceres usage.
Eigen::Isometry3f isometryFromPose(const xrt_pose &p)
Returns an Isometry3f from an xrt_pose.
Definition math.hpp:36
C++-only functionality in the Math helper library.
Definition m_documentation.hpp:15
Eigen::Quaternion< typename Derived::Scalar > quat_exp_so3(Eigen::MatrixBase< Derived > const &vec)
Fully-templated free function for quaternion exponentiation, SO(3) version as described by Grassia.
Definition m_quatexpmap.hpp:119
static Eigen::Map< const Eigen::Quaternionf > map_quat(const struct xrt_quat &q)
Wrap an internal quaternion struct in an Eigen type, const overload.
Definition m_eigen_interop.hpp:40
Eigen::Matrix< Scalar, 3, 1 > quat_ln_so3(Eigen::Quaternion< Scalar > const &quat)
Fully-templated free function for quaternion log map, SO(3) version.
Definition m_quatexpmap.hpp:148
static Eigen::Map< const Eigen::Vector3f > map_vec3(const struct xrt_vec3 &v)
Wrap an internal 3D vector struct in an Eigen type, const overload.
Definition m_eigen_interop.hpp:90
RANSAC PnP pose refinement.
Right-multiplying quaternion manifold, matches our local convention.
Definition math.hpp:45
A pose composed of a position and orientation.
Definition xrt_defines.h:513