g2o
Loading...
Searching...
No Matches
dquat2mat.cpp
Go to the documentation of this file.
1// g2o - General Graph Optimization
2// Copyright (C) 2011 R. Kuemmerle, G. Grisetti, H. Strasdat, W. Burgard
3// All rights reserved.
4//
5// Redistribution and use in source and binary forms, with or without
6// modification, are permitted provided that the following conditions are
7// met:
8//
9// * Redistributions of source code must retain the above copyright notice,
10// this list of conditions and the following disclaimer.
11// * Redistributions in binary form must reproduce the above copyright
12// notice, this list of conditions and the following disclaimer in the
13// documentation and/or other materials provided with the distribution.
14//
15// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
16// IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
17// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
18// PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19// HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
27#include "dquat2mat.h"
28
29#include <iostream>
30namespace g2o {
31namespace internal {
32using namespace std;
33
35
36int _q2m(double& S, double& qw, const double& r00, const double& r10,
37 const double& r20, const double& r01, const double& r11,
38 const double& r21, const double& r02, const double& r12,
39 const double& r22) {
40 double tr = r00 + r11 + r22;
41 if (tr > 0) {
42 S = sqrt(tr + 1.0) * 2; // S=4*qw
43 qw = 0.25 * S;
44 // qx = (r21 - r12) / S;
45 // qy = (r02 - r20) / S;
46 // qz = (r10 - r01) / S;
47 return 0;
48 } else if ((r00 > r11) & (r00 > r22)) {
49 S = sqrt(1.0 + r00 - r11 - r22) * 2; // S=4*qx
50 qw = (r21 - r12) / S;
51 // qx = 0.25 * S;
52 // qy = (r01 + r10) / S;
53 // qz = (r02 + r20) / S;
54 return 1;
55 } else if (r11 > r22) {
56 S = sqrt(1.0 + r11 - r00 - r22) * 2; // S=4*qy
57 qw = (r02 - r20) / S;
58 // qx = (r01 + r10) / S;
59 // qy = 0.25 * S;
60 return 2;
61 } else {
62 S = sqrt(1.0 + r22 - r00 - r11) * 2; // S=4*qz
63 qw = (r10 - r01) / S;
64 // qx = (r02 + r20) / S;
65 // qy = (r12 + r21) / S;
66 // qz = 0.25 * S;
67 return 3;
68 }
69}
70
71void compute_dq_dR(Eigen::Matrix<double, 3, 9, Eigen::ColMajor>& dq_dR,
72 const double& r11, const double& r21, const double& r31,
73 const double& r12, const double& r22, const double& r32,
74 const double& r13, const double& r23, const double& r33) {
75 double qw;
76 double S;
77 int whichCase = _q2m(S, qw, r11, r21, r31, r12, r22, r32, r13, r23, r33);
78 S *= .25;
79 switch (whichCase) {
80 case 0:
81 compute_dq_dR_w(dq_dR, S, r11, r21, r31, r12, r22, r32, r13, r23, r33);
82 break;
83 case 1:
84 compute_dq_dR_x(dq_dR, S, r11, r21, r31, r12, r22, r32, r13, r23, r33);
85 break;
86 case 2:
87 compute_dq_dR_y(dq_dR, S, r11, r21, r31, r12, r22, r32, r13, r23, r33);
88 break;
89 case 3:
90 compute_dq_dR_z(dq_dR, S, r11, r21, r31, r12, r22, r32, r13, r23, r33);
91 break;
92 }
93 if (qw <= 0) dq_dR *= -1;
94}
95} // namespace internal
96} // namespace g2o
void compute_dq_dR_z(Eigen::Matrix< double, 3, 9 > &dq_dR_z, const double &qz, const double &r00, const double &r10, const double &r20, const double &r01, const double &r11, const double &r21, const double &r02, const double &r12, const double &r22)
void compute_dq_dR_x(Eigen::Matrix< double, 3, 9 > &dq_dR_x, const double &qx, const double &r00, const double &r10, const double &r20, const double &r01, const double &r11, const double &r21, const double &r02, const double &r12, const double &r22)
void compute_dq_dR_y(Eigen::Matrix< double, 3, 9 > &dq_dR_y, const double &qy, const double &r00, const double &r10, const double &r20, const double &r01, const double &r11, const double &r21, const double &r02, const double &r12, const double &r22)
void compute_dq_dR_w(Eigen::Matrix< double, 3, 9 > &dq_dR_w, const double &qw, const double &r00, const double &r10, const double &r20, const double &r01, const double &r11, const double &r21, const double &r02, const double &r12, const double &r22)
void compute_dq_dR(Eigen::Matrix< double, 3, 9, Eigen::ColMajor > &dq_dR, const double &r11, const double &r21, const double &r31, const double &r12, const double &r22, const double &r32, const double &r13, const double &r23, const double &r33)
Definition dquat2mat.cpp:71
int _q2m(double &S, double &qw, const double &r00, const double &r10, const double &r20, const double &r01, const double &r11, const double &r21, const double &r02, const double &r12, const double &r22)
Definition dquat2mat.cpp:36
Definition jet.h:876