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
tensor.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 
19 #ifndef SPARSE_MAPPING_TENSOR_H_
20 #define SPARSE_MAPPING_TENSOR_H_
21 
22 #include <camera/camera_model.h>
24 #include <Eigen/Geometry>
25 #include <ceres/ceres.h>
26 
27 #include <array>
28 #include <functional>
29 #include <map>
30 #include <set>
31 #include <string>
32 #include <utility>
33 #include <vector>
34 #include <limits>
35 #include <memory>
36 
37 EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(std::array<std::pair<std::pair<int, int>, Eigen::Affine3d>, 3>)
38 
39 namespace std {
40  class mutex;
41 }
42 
43 namespace cv {
44  class Mat;
45  class DMatch;
46 }
47 
48 namespace sparse_mapping {
49 
50  typedef std::map<std::pair<int, int>, Eigen::Affine3d, std::less<std::pair<int, int> >,
51  Eigen::aligned_allocator<std::pair<std::pair<int , int > const, Eigen::Affine3d> > >
53  typedef std::array<std::pair<std::pair<int, int>, Eigen::Affine3d>, 3> CIDAffineTuple;
54  typedef std::vector<CIDAffineTuple, Eigen::aligned_allocator<CIDAffineTuple> > CIDAffineTupleVec;
55 
56  class SparseMap;
57 
58  // functions for building a map
59 
63  void MatchFeatures(const std::string & essential_file, const std::string & matches_file,
65 
69  void BuildTracks(bool rm_invalid_xyz,
70  const std::string & matches_file,
72 
76  void IncrementalBA(std::string const& essential_file,
78 
83 
88  void BundleAdjust(bool fix_all_cameras, sparse_mapping::SparseMap * map,
89  std::set<int> const& fixed_cameras = std::set<int>());
90 
92  ceres::LossFunction * loss,
93  const ceres::Solver::Options & options,
94  ceres::Solver::Summary * summary,
95  int first = 0, int last = std::numeric_limits<int>::max(),
96  bool fix_all_cameras = false,
97  std::set<int> const& fixed_cameras = std::set<int>());
98 
102  void AppendMapFile(std::string const& mapOut, std::string const& mapIn,
103  int num_image_overlaps_at_endpoints,
104  double outlier_factor,
105  bool bundle_adjust, bool fix_first_map);
106 
112  int num_image_overlaps_at_endpoints,
113  double outlier_factor,
114  std::string const& output_map,
115  sparse_mapping::SparseMap * C_out);
116 
121  void ExtractSubmap(std::vector<std::string> * keep_ptr,
122  sparse_mapping::SparseMap * map_ptr);
123 
128  double RegistrationOrVerification(std::vector<std::string> const& data_files,
129  bool verification,
131 
132  // I/O Functions for writing and reading affine solutions.
133  void WriteAffineCSV(CIDPairAffineMap const& relative_affines,
134  std::string const& output_filename);
135  void WriteAffineCSV(CIDAffineTupleVec const& relative_affines,
136  std::string const& output_filename);
137  void ReadAffineCSV(std::string const& input_filename,
138  CIDPairAffineMap* relative_affines);
139  void ReadAffineCSV(std::string const& input_filename,
140  CIDAffineTupleVec* relative_affines);
141 
142  // Other auxiliary functions
143 
144  void PrintTrackStats(std::vector<std::map<int, int> >const& pid_to_cid_fid,
145  std::string const& step);
146 
147  // Filter the matches by a geometric constraint. Compute the essential matrix.
148  void FindEssentialAndInliers(Eigen::Matrix2Xd const& keypoints1, Eigen::Matrix2Xd const& keypoints2,
149  std::vector<cv::DMatch> const& matches, camera::CameraParameters const& camera_params,
150  std::vector<cv::DMatch>* inlier_matches, std::vector<size_t>* vec_inliers,
151  Eigen::Matrix3d* essential_matrix, const int ransac_iterations = 4096);
152 
153  void BuildMapFindEssentialAndInliers(const Eigen::Matrix2Xd & keypoints1,
154  const Eigen::Matrix2Xd & keypoints2,
155  const std::vector<cv::DMatch> & matches,
156  camera::CameraParameters const& camera_params,
157  bool compute_inliers_only,
158  size_t cam_a_idx, size_t cam_b_idx,
159  std::mutex * match_mutex,
160  CIDPairAffineMap * relative_b_t_a,
161  std::vector<cv::DMatch> * inlier_matches,
162  bool compute_rays_angle,
163  double * rays_angle);
164 
165  // Helper utility to speed up our query times into the map. The
166  // SparseMap object appears to have this ability now. Possibly don't
167  // need this function anymore.
168  void GenerateCIDToPIDFIDMap(std::vector<std::map<int, int> > const& pid_to_cid_fid,
169  size_t num_of_cameras,
170  std::vector<std::map<int, int> > * cid_to_pid_fid);
171 
172  // List all the possible tuples (cameras paired in threes) that are
173  // available from the found camera pairwise affines.
174  void GenerateTupleListing(CIDPairAffineMap const& relative_affines,
175  std::set<std::tuple<int, int, int> > * tuple_listing);
176 
177  // Triangulates all points given camera positions. This is better
178  // than what is in sparse map as it uses multiple view information.
179  void Triangulate(bool rm_invalid_xyz, double focal_length,
180  std::vector<Eigen::Affine3d> const& cid_to_cam_t_global,
181  std::vector<Eigen::Matrix2Xd> const& cid_to_keypoint_map,
182  std::vector<std::map<int, int> > * pid_to_cid_fid,
183  std::vector<Eigen::Vector3d> * pid_to_xyz,
184  std::vector<std::map<int, int> > * cid_fid_to_pid);
185 
186 } // namespace sparse_mapping
187 
188 #endif // SPARSE_MAPPING_TENSOR_H_
sparse_mapping::BundleAdjustment
void BundleAdjustment(sparse_mapping::SparseMap *s, ceres::LossFunction *loss, const ceres::Solver::Options &options, ceres::Solver::Summary *summary, int first=0, int last=std::numeric_limits< int >::max(), bool fix_all_cameras=false, std::set< int > const &fixed_cameras=std::set< int >())
Definition: tensor.cc:639
sparse_mapping::WriteAffineCSV
void WriteAffineCSV(CIDPairAffineMap const &relative_affines, std::string const &output_filename)
Definition: tensor.cc:1890
sparse_mapping::BuildTracks
void BuildTracks(bool rm_invalid_xyz, const std::string &matches_file, sparse_mapping::SparseMap *s)
Definition: tensor.cc:318
sparse_mapping
Definition: localization_parameters.h:22
sparse_mapping::BuildMapFindEssentialAndInliers
void BuildMapFindEssentialAndInliers(const Eigen::Matrix2Xd &keypoints1, const Eigen::Matrix2Xd &keypoints2, const std::vector< cv::DMatch > &matches, camera::CameraParameters const &camera_params, bool compute_inliers_only, size_t cam_a_idx, size_t cam_b_idx, std::mutex *match_mutex, CIDPairAffineMap *relative_b_t_a, std::vector< cv::DMatch > *inlier_matches, bool compute_rays_angle, double *rays_angle)
Definition: tensor.cc:1979
sparse_mapping::BundleAdjust
void BundleAdjust(std::vector< std::map< int, int > > const &pid_to_cid_fid, std::vector< Eigen::Matrix2Xd > const &cid_to_keypoint_map, double focal_length, std::vector< Eigen::Affine3d > *cid_to_cam_t_global, std::vector< Eigen::Vector3d > *pid_to_xyz, std::vector< std::map< int, int > > const &user_pid_to_cid_fid, std::vector< Eigen::Matrix2Xd > const &user_cid_to_keypoint_map, std::vector< Eigen::Vector3d > *user_pid_to_xyz, ceres::LossFunction *loss, ceres::Solver::Options const &options, ceres::Solver::Summary *summary, int first=0, int last=std::numeric_limits< int >::max(), bool fix_cameras=false, std::set< int > const &fixed_cameras=std::set< int >())
Definition: reprojection.cc:96
camera::CameraParameters
Definition: camera_params.h:58
sparse_mapping::ExtractSubmap
void ExtractSubmap(std::vector< std::string > *keep_ptr, sparse_mapping::SparseMap *map_ptr)
Definition: tensor.cc:1448
sparse_mapping::IncrementalBA
void IncrementalBA(std::string const &essential_file, sparse_mapping::SparseMap *s)
Definition: tensor.cc:378
sparse_mapping::AppendMapFile
void AppendMapFile(std::string const &mapOut, std::string const &mapIn, int num_image_overlaps_at_endpoints, double outlier_factor, bool bundle_adjust, bool fix_first_map)
Definition: tensor.cc:665
sparse_mapping::CIDAffineTupleVec
std::vector< CIDAffineTuple, Eigen::aligned_allocator< CIDAffineTuple > > CIDAffineTupleVec
Definition: tensor.h:54
sparse_mapping::RegistrationOrVerification
double RegistrationOrVerification(std::vector< std::string > const &data_files, bool verification, sparse_mapping::SparseMap *s)
Definition: tensor.cc:1559
sparse_mapping::MatchFeatures
void MatchFeatures(const std::string &essential_file, const std::string &matches_file, sparse_mapping::SparseMap *s)
Definition: tensor.cc:209
sparse_mapping::PrintTrackStats
void PrintTrackStats(std::vector< std::map< int, int > >const &pid_to_cid_fid, std::string const &step)
Definition: tensor.cc:1804
sparse_mapping::CloseLoop
void CloseLoop(sparse_mapping::SparseMap *s)
Definition: tensor.cc:505
camera_model.h
sparse_mapping::CIDPairAffineMap
std::map< std::pair< int, int >, Eigen::Affine3d, std::less< std::pair< int, int > >, Eigen::aligned_allocator< std::pair< std::pair< int, int > const, Eigen::Affine3d > > > CIDPairAffineMap
Definition: tensor.h:52
sparse_mapping::ReadAffineCSV
void ReadAffineCSV(std::string const &input_filename, CIDPairAffineMap *relative_affines)
Definition: tensor.cc:1909
eigen_vectors.h
sparse_mapping::GenerateCIDToPIDFIDMap
void GenerateCIDToPIDFIDMap(std::vector< std::map< int, int > > const &pid_to_cid_fid, size_t num_of_cameras, std::vector< std::map< int, int > > *cid_to_pid_fid)
sparse_mapping::FindEssentialAndInliers
void FindEssentialAndInliers(Eigen::Matrix2Xd const &keypoints1, Eigen::Matrix2Xd const &keypoints2, std::vector< cv::DMatch > const &matches, camera::CameraParameters const &camera_params, std::vector< cv::DMatch > *inlier_matches, std::vector< size_t > *vec_inliers, Eigen::Matrix3d *essential_matrix, const int ransac_iterations=4096)
Definition: tensor.cc:1937
std
Definition: tensor.h:39
sparse_mapping::Triangulate
void Triangulate(bool rm_invalid_xyz, double focal_length, std::vector< Eigen::Affine3d > const &cid_to_cam_t_global, std::vector< Eigen::Matrix2Xd > const &cid_to_keypoint_map, std::vector< std::map< int, int > > *pid_to_cid_fid, std::vector< Eigen::Vector3d > *pid_to_xyz, std::vector< std::map< int, int > > *cid_fid_to_pid)
Definition: tensor.cc:2184
sparse_mapping::CIDAffineTuple
std::array< std::pair< std::pair< int, int >, Eigen::Affine3d >, 3 > CIDAffineTuple
Definition: tensor.h:53
optimization_common::Affine3d
Eigen::Affine3d Affine3d(const Eigen::Matrix< double, 7, 1 > &affine_vector)
Definition: utilities.cc:43
sparse_mapping::GenerateTupleListing
void GenerateTupleListing(CIDPairAffineMap const &relative_affines, std::set< std::tuple< int, int, int > > *tuple_listing)
cv
Definition: camera_params.h:31
sparse_mapping::MergeMaps
void MergeMaps(sparse_mapping::SparseMap *A_in, sparse_mapping::SparseMap *B_in, int num_image_overlaps_at_endpoints, double outlier_factor, std::string const &output_map, sparse_mapping::SparseMap *C_out)
Definition: tensor.cc:1169
sparse_mapping::SparseMap
Definition: sparse_map.h:63