NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
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