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