20 #include "Eigen/Dense" 25 namespace perception {
33 Eigen::Matrix<T, 2, 2> a;
34 a << A[0], A[1], A[2], A[3];
35 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T, 2, 2>> es(a);
36 if (es.info() != Eigen::Success) {
40 Eigen::Matrix<T, 2, 1> D = es.eigenvalues();
41 Eigen::Matrix<T, 2, 2> V = es.eigenvectors();
42 if (fabs(D(0, 0)) < fabs(D(1, 0))) {
43 std::swap(D(0, 0), D(1, 0));
44 std::swap(V(0, 0), V(0, 1));
45 std::swap(V(1, 0), V(1, 1));
60 Eigen::Matrix<T, 3, 3> a;
61 a << A[0], A[1], A[2], A[3], A[4], A[5], A[6], A[7], A[8];
62 Eigen::SelfAdjointEigenSolver<Eigen::Matrix<T, 3, 3>> es(a);
63 if (es.info() != Eigen::Success) {
66 Eigen::Matrix<T, 3, 1> D = es.eigenvalues();
67 Eigen::Matrix<T, 3, 3> V = es.eigenvectors();
68 if (fabs(D(1, 0)) < fabs(D(2, 0))) {
69 std::swap(D(1, 0), D(2, 0));
70 for (
int i = 0; i < 3; ++i) {
71 std::swap(V(i, 1), V(i, 2));
74 if (fabs(D(0, 0)) < fabs(D(1, 0))) {
75 std::swap(D(0, 0), D(1, 0));
76 for (
int i = 0; i < 3; ++i) {
77 std::swap(V(i, 0), V(i, 1));
80 if (fabs(D(1, 0)) < fabs(D(2, 0))) {
81 std::swap(D(1, 0), D(2, 0));
82 for (
int i = 0; i < 3; ++i) {
83 std::swap(V(i, 1), V(i, 2));
102 template <
typename T>
110 template <
typename T>
112 x[0] = K[0] * X[0] + K[1] * X[1] + K[2] * X[2];
113 x[1] = K[4] * X[1] + K[5] * X[2];
120 template <
typename T>
136 template <
typename T>
138 T fx_rec =
IRec(K[0]);
139 T fy_rec =
IRec(K[4]);
140 T fxfy_rec =
IRec(K[0] * K[4]);
141 X[0] = fx_rec * x[0] - (K[1] * fxfy_rec) * x[1] +
142 (K[1] * K[5] * fxfy_rec - K[2] * fx_rec) * x[2];
143 X[1] = fy_rec * x[1] - (K[5] * fy_rec) * x[2];
149 template <
typename T>
152 ISub3(X, cop, Xmcop);
154 if (v_norm == static_cast<T>(0.0)) {
158 return IDot3(Xmcop, prv) >
static_cast<T
>(0.0);
163 template <
typename T>
165 X[0] = (x[0] - K[2]) * depth *
IRec(K[0]);
166 X[1] = (x[1] - K[5]) * depth *
IRec(K[4]);
172 template <
typename T>
174 const T *t, T depth, T *X) {
176 T u = (x[0] - K[2]) *
IRec(K[0]);
177 T v = (x[1] - K[5]) *
IRec(K[4]);
179 T ru = R[0] * u + R[3] * v + R[6];
180 T rv = R[1] * u + R[4] * v + R[7];
181 T rw = R[2] * u + R[5] * v + R[8];
183 T tu = R[0] * t[0] + R[3] * t[1] + R[6] * t[2];
184 T tv = R[1] * t[0] + R[4] * t[1] + R[7] * t[2];
185 T tw = R[2] * t[0] + R[5] * t[1] + R[8] * t[2];
186 T w =
IDiv(depth + tw, rw);
196 template <
typename T>
200 T umcx =
IDiv(x[0] - K[2], K[0]);
201 T vmcy =
IDiv(x[1] - K[5], K[4]);
202 T sf = pi[0] * umcx + pi[1] * vmcy + pi[2];
203 if (sf == static_cast<T>(0.0)) {
210 return Z >
static_cast<T
>(0.0);
void IZero3(T a[3])
Definition: i_blas.h:334
void IBackprojectThroughKRt(const T *x, const T *K, const T *R, const T *t, T depth, T *X)
Definition: i_util.h:173
T IL2Norm3(const T x[3])
Definition: i_blas.h:2812
void IProjectThroughKRt(const T *K, const T *R, const T *t, const T *X, T *x)
Definition: i_util.h:121
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void IAdd3(const T x[3], const T y[3], T z[3])
Definition: i_blas.h:808
float IRec(float a)
Definition: i_basic.h:69
const size_t A
Definition: util.h:160
void IProjectThroughExtrinsic(const T *R, const T *t, const T *X, T *x)
Definition: i_util.h:103
void IUnprojectThroughIntrinsic(const T *K, const T *x, T *X)
Definition: i_util.h:137
void IProjectThroughIntrinsic(const T *K, const T *X, T *x)
Definition: i_util.h:111
void IEigSymmetric3x3Closed(const T *A, T *EV, T *Q)
Definition: i_util.h:56
void ISub3(const T x[3], const T y[3], T z[3])
Definition: i_blas.h:1405
float IDiv(float a, float b)
Definition: i_basic.h:35
void IMultAx3x3(const T A[9], const T x[3], T Ax[3])
Definition: i_blas.h:4358
bool IPointInFrontOfCamera(const T *X, const T *cop, const T *prv)
Definition: i_util.h:150
T IDot3(const T x[3], const T y[3])
Definition: i_blas.h:2260
bool IBackprojectPlaneIntersectionCanonical(const T *x, const T *K, const T *pi, T *X)
Definition: i_util.h:197
void IScale3(T x[3], T sf)
Definition: i_blas.h:1868
void IBackprojectCanonical(const T *x, const T *K, T depth, T *X)
Definition: i_util.h:164
void IEigSymmetric2x2Closed(const T *A, T *EV, T *Q)
Definition: i_util.h:29