NASA Astrobee Robot Software  Astrobee Version:
Flight software for the Astrobee robots operating inside the International Space Station.
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
utilities.h
Go to the documentation of this file.
1 /* Copyright (c) 2017, United States Government, as represented by the
2  * Administrator of the National Aeronautics and Space Administration.
3  *
4  * All rights reserved.
5  *
6  * The Astrobee platform is licensed under the Apache License, Version 2.0
7  * (the "License"); you may not use this file except in compliance with the
8  * License. You may obtain a copy of the License at
9  *
10  * http://www.apache.org/licenses/LICENSE-2.0
11  *
12  * Unless required by applicable law or agreed to in writing, software
13  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
14  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
15  * License for the specific language governing permissions and limitations
16  * under the License.
17  */
18 #ifndef OPTIMIZATION_COMMON_UTILITIES_H_
19 #define OPTIMIZATION_COMMON_UTILITIES_H_
20 
21 #include <Eigen/Core>
22 
23 #include <ceres/ceres.h>
24 #include <ceres/rotation.h>
25 
26 #include <vector>
27 
28 namespace optimization_common {
29 // Assumes compact angle axis (3d vector where norm gives the angle) parameterization for rotations
30 // First 3 values of isometry_data are the compact angle axis, next 3 are the translation
31 template <typename T>
32 Eigen::Matrix<T, 6, 1> VectorFromIsometry3(const Eigen::Transform<T, 3, Eigen::Isometry>& isometry_3);
33 
34 Eigen::Matrix<double, 6, 1> VectorFromIsometry3d(const Eigen::Isometry3d& isometry_3d);
35 // Assumes compact angle axis (3d vector where norm gives the angle) parameterization for rotations
36 // First 3 values of isometry_data are the compact angle axis, next 3 are the translation, last is scale
37 Eigen::Matrix<double, 7, 1> VectorFromAffine3d(const Eigen::Affine3d& affine_3d);
38 // Assumes compact angle axis (3d vector where norm gives the angle) parameterization for rotations
39 // First 3 values of isometry_data are the compact angle axis, next 3 are the translation
40 template <typename T>
41 Eigen::Transform<T, 3, Eigen::Isometry> Isometry3(const T* isometry_data);
42 Eigen::Matrix3d Intrinsics(const Eigen::Vector2d& focal_lengths, const Eigen::Vector2d& principal_points);
43 // Assumes compact angle axis (3d vector where norm gives the angle) parameterization for rotations
44 // First 3 values of isometry_data are the compact angle axis, next 3 are the translation, last is scale
45 template <typename T>
46 Eigen::Transform<T, 3, Eigen::Affine> Affine3(const T* affine_data);
47 
48 Eigen::Isometry3d Isometry3d(const Eigen::Matrix<double, 6, 1>& isometry_vector);
49 
50 Eigen::Affine3d Affine3d(const Eigen::Matrix<double, 7, 1>& affine_vector);
51 
52 // Assumes storage as focal lengths followed by principal points
53 template <typename T>
54 Eigen::Matrix<T, 3, 3> Intrinsics(const T* intrinsics_data);
55 
56 template <typename T>
57 Eigen::Matrix<T, 3, 3> Intrinsics(const T* focal_lengths, const T* principal_points);
58 
59 void AddParameterBlock(const int num_parameters, double* const parameters, ceres::Problem& problem,
60  const bool set_constant = false);
61 
62 void AddConstantParameterBlock(const int num_parameters, double* const parameters, ceres::Problem& problem);
63 
64 void AddConstantParameterBlock(const int num_parameters, double const* const parameters, ceres::Problem& problem);
65 
66 double ResidualNorm(const std::vector<double>& residual, const int index, const int residual_size);
67 
68 // Assumes each residual is the same size
69 void CheckResiduals(const int residual_size, ceres::Problem& problem, const double outlier_threshold = 0.99);
70 
71 template <typename T>
72 Eigen::Matrix<T, 6, 1> VectorFromIsometry3(const Eigen::Transform<T, 3, Eigen::Isometry>& isometry_3) {
73  // Isometry3d linear().data() returns the data pointer to the full Isometry3d matrix rather than just the rotation
74  const Eigen::Matrix<T, 3, 3> rotation = isometry_3.linear();
75  Eigen::Matrix<T, 6, 1> isometry_3_vector;
76  ceres::RotationMatrixToAngleAxis(rotation.data(), &(isometry_3_vector.data()[0]));
77  isometry_3_vector[3] = isometry_3.translation().x();
78  isometry_3_vector[4] = isometry_3.translation().y();
79  isometry_3_vector[5] = isometry_3.translation().z();
80  return isometry_3_vector;
81 }
82 
83 template <typename T>
84 Eigen::Transform<T, 3, Eigen::Isometry> Isometry3(const T* isometry_data) {
85  Eigen::Matrix<T, 3, 3> rotation;
86  ceres::AngleAxisToRotationMatrix(isometry_data, rotation.data());
87  Eigen::Map<const Eigen::Matrix<T, 3, 1>> translation(&isometry_data[3]);
88  Eigen::Transform<T, 3, Eigen::Isometry> isometry_3(Eigen::Transform<T, 3, Eigen::Isometry>::Identity());
89  isometry_3.linear() = rotation;
90  isometry_3.translation() = translation;
91  return isometry_3;
92 }
93 
94 template <typename T>
95 Eigen::Transform<T, 3, Eigen::Affine> Affine3(const T* affine_data) {
96  const Eigen::Transform<T, 3, Eigen::Isometry> isometry_3 = Isometry3(affine_data);
97  const T scale = affine_data[6];
98  Eigen::Transform<T, 3, Eigen::Affine> affine_3;
99  affine_3.linear() = scale * isometry_3.linear();
100  affine_3.translation() = isometry_3.translation();
101  return affine_3;
102 }
103 
104 template <typename T>
105 Eigen::Matrix<T, 3, 3> Intrinsics(const T* intrinsics_data) {
106  Eigen::Matrix<T, 3, 3> intrinsics(Eigen::Matrix<T, 3, 3>::Identity());
107  intrinsics(0, 0) = intrinsics_data[0];
108  intrinsics(1, 1) = intrinsics_data[1];
109  intrinsics(0, 2) = intrinsics_data[2];
110  intrinsics(1, 2) = intrinsics_data[3];
111  return intrinsics;
112 }
113 
114 template <typename T>
115 Eigen::Matrix<T, 3, 3> Intrinsics(const T* focal_lengths, const T* principal_points) {
116  Eigen::Matrix<T, 3, 3> intrinsics(Eigen::Matrix<T, 3, 3>::Identity());
117  intrinsics(0, 0) = focal_lengths[0];
118  intrinsics(1, 1) = focal_lengths[1];
119  intrinsics(0, 2) = principal_points[0];
120  intrinsics(1, 2) = principal_points[1];
121  return intrinsics;
122 }
123 } // namespace optimization_common
124 
125 #endif // OPTIMIZATION_COMMON_UTILITIES_H_
optimization_common::Isometry3d
Eigen::Isometry3d Isometry3d(const Eigen::Matrix< double, 6, 1 > &isometry_vector)
Definition: utilities.cc:39
optimization_common::AddConstantParameterBlock
void AddConstantParameterBlock(const int num_parameters, double *const parameters, ceres::Problem &problem)
Definition: utilities.cc:60
optimization_common::VectorFromAffine3d
Eigen::Matrix< double, 7, 1 > VectorFromAffine3d(const Eigen::Affine3d &affine_3d)
Definition: utilities.cc:26
optimization_common::ResidualNorm
double ResidualNorm(const std::vector< double > &residual, const int index, const int residual_size)
Definition: utilities.cc:69
optimization_common::CheckResiduals
void CheckResiduals(const int residual_size, ceres::Problem &problem, const double outlier_threshold=0.99)
Definition: utilities.cc:78
vision_common::Isometry3d
Eigen::Isometry3d Isometry3d(const cv::Mat &rodrigues_rotation_cv, const cv::Mat &translation_cv)
Definition: utilities.cc:58
optimization_common::Isometry3
Eigen::Transform< T, 3, Eigen::Isometry > Isometry3(const T *isometry_data)
Definition: utilities.h:84
optimization_common::Intrinsics
Eigen::Matrix3d Intrinsics(const Eigen::Vector2d &focal_lengths, const Eigen::Vector2d &principal_points)
Definition: utilities.cc:45
optimization_common::AddParameterBlock
void AddParameterBlock(const int num_parameters, double *const parameters, ceres::Problem &problem, const bool set_constant=false)
Definition: utilities.cc:54
optimization_common::VectorFromIsometry3d
Eigen::Matrix< double, 6, 1 > VectorFromIsometry3d(const Eigen::Isometry3d &isometry_3d)
Definition: utilities.cc:22
optimization_common
Definition: optimization_params.h:23
optimization_common::Affine3
Eigen::Transform< T, 3, Eigen::Affine > Affine3(const T *affine_data)
Definition: utilities.h:95
optimization_common::Affine3d
Eigen::Affine3d Affine3d(const Eigen::Matrix< double, 7, 1 > &affine_vector)
Definition: utilities.cc:43
optimization_common::VectorFromIsometry3
Eigen::Matrix< T, 6, 1 > VectorFromIsometry3(const Eigen::Transform< T, 3, Eigen::Isometry > &isometry_3)
Definition: utilities.h:72