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 VISION_COMMON_UTILITIES_H_
19 #define VISION_COMMON_UTILITIES_H_
20 
24 
25 #include <Eigen/Geometry>
26 
27 #include <gtsam/base/Matrix.h>
28 
29 #include <opencv2/core/eigen.hpp>
30 #include <opencv2/opencv.hpp>
31 
32 #include <vector>
33 
34 namespace vision_common {
35 template <typename T>
36 Eigen::Matrix<T, 2, 1> RelativeCoordinates(const Eigen::Matrix<T, 2, 1>& absolute_point,
37  const Eigen::Matrix<T, 3, 3>& intrinsics);
38 template <typename T>
39 Eigen::Matrix<T, 2, 1> AbsoluteCoordinates(const Eigen::Matrix<T, 2, 1>& relative_point,
40  const Eigen::Matrix<T, 3, 3>& intrinsics);
41 
42 Eigen::Vector3d Backproject(const Eigen::Vector2d& measurement, const Eigen::Matrix3d& intrinsics, const double depth,
43  gtsam::OptionalJacobian<3, 1> d_backprojected_point_d_depth = boost::none);
44 
45 Eigen::Vector2d FocalLengths(const Eigen::Matrix3d& intrinsics);
46 
47 Eigen::Vector2d PrincipalPoints(const Eigen::Matrix3d& intrinsics);
48 
49 Eigen::Vector2d Project(const Eigen::Vector3d& cam_t_point, const Eigen::Matrix3d& intrinsics,
50  gtsam::OptionalJacobian<2, 3> d_projected_point_d_cam_t_point = boost::none);
51 
52 template <typename DISTORTER>
53 Eigen::Vector2d ProjectWithDistortion(const Eigen::Vector3d& cam_t_point, const Eigen::Matrix3d& intrinsics,
54  const Eigen::VectorXd& distortion_params);
55 
56 Eigen::Isometry3d Isometry3d(const cv::Mat& rodrigues_rotation_cv, const cv::Mat& translation_cv);
57 
58 double AverageDistanceFromMean(const std::vector<FeaturePoint>& points);
59 
61  const std::vector<localization_common::TimestampedValue<FeaturePoint>>& timestamped_points);
62 
63 // Detect standstill using average distance from mean for a history of points
64 // in feature tracks as determined by params.
65 template <typename FeatureTracksMapType>
66 bool Standstill(const FeatureTracksMapType& feature_tracks, const StandstillParams& params);
67 
68 // Implementation
69 template <typename T>
70 Eigen::Matrix<T, 2, 1> RelativeCoordinates(const Eigen::Matrix<T, 2, 1>& absolute_point,
71  const Eigen::Matrix<T, 3, 3>& intrinsics) {
72  const T& f_x = intrinsics(0, 0);
73  const T& f_y = intrinsics(1, 1);
74  const T& p_x = intrinsics(0, 2);
75  const T& p_y = intrinsics(1, 2);
76 
77  const T& x = absolute_point[0];
78  const T& y = absolute_point[1];
79  const T relative_x = (x - p_x) / f_x;
80  const T relative_y = (y - p_y) / f_y;
81  return Eigen::Matrix<T, 2, 1>(relative_x, relative_y);
82 }
83 
84 template <typename T>
85 Eigen::Matrix<T, 2, 1> AbsoluteCoordinates(const Eigen::Matrix<T, 2, 1>& relative_point,
86  const Eigen::Matrix<T, 3, 3>& intrinsics) {
87  const T& f_x = intrinsics(0, 0);
88  const T& f_y = intrinsics(1, 1);
89  const T& p_x = intrinsics(0, 2);
90  const T& p_y = intrinsics(1, 2);
91  return Eigen::Matrix<T, 2, 1>(relative_point[0] * f_x + p_x, relative_point[1] * f_y + p_y);
92 }
93 
94 template <typename DISTORTER>
95 Eigen::Vector2d ProjectWithDistortion(const Eigen::Vector3d& cam_t_point, const Eigen::Matrix3d& intrinsics,
96  const Eigen::VectorXd& distortion_params) {
97  const Eigen::Vector2d undistorted_image_point = Project(cam_t_point, intrinsics);
98  const DISTORTER distorter;
99  return distorter.Distort(distortion_params, intrinsics, undistorted_image_point);
100 }
101 
102 template <typename FeatureTracksMapType>
103 bool Standstill(const FeatureTracksMapType& feature_tracks, const StandstillParams& params) {
104  if (feature_tracks.empty()) return false;
105  const auto& latest = feature_tracks.cbegin()->second.Latest();
106  if (!latest) return false;
107  const localization_common::Time oldest_allowed_time = latest->timestamp - params.duration;
108  // Check for standstill via low disparity for all feature tracks
109  double total_average_distance_from_mean = 0;
110  int num_valid_feature_tracks = 0;
111  for (const auto& feature_track : feature_tracks) {
112  // Only use recent values
113  const double average_distance_from_mean =
114  AverageDistanceFromMean(feature_track.second.LatestValues(oldest_allowed_time));
115  // Only consider long enough feature tracks for standstill candidates
116  if (static_cast<int>(feature_track.second.size()) >= params.min_num_points_per_track) {
117  total_average_distance_from_mean += average_distance_from_mean;
118  ++num_valid_feature_tracks;
119  }
120  }
121 
122  double average_distance_from_mean = 0;
123  if (num_valid_feature_tracks > 0)
124  average_distance_from_mean = total_average_distance_from_mean / num_valid_feature_tracks;
125 
126  return (num_valid_feature_tracks >= 5 && average_distance_from_mean <= params.max_avg_distance_from_mean);
127 }
128 } // namespace vision_common
129 
130 #endif // VISION_COMMON_UTILITIES_H_
vision_common::Standstill
bool Standstill(const FeatureTracksMapType &feature_tracks, const StandstillParams &params)
Definition: utilities.h:103
vision_common::FocalLengths
Eigen::Vector2d FocalLengths(const Eigen::Matrix3d &intrinsics)
Definition: utilities.cc:36
vision_common::StandstillParams::max_avg_distance_from_mean
double max_avg_distance_from_mean
Definition: standstill_params.h:30
vision_common::Project
Eigen::Vector2d Project(const Eigen::Vector3d &cam_t_point, const Eigen::Matrix3d &intrinsics, gtsam::OptionalJacobian< 2, 3 > d_projected_point_d_cam_t_point=boost::none)
Definition: utilities.cc:44
vision_common
Definition: brisk_feature_detector_and_matcher.h:25
vision_common::PrincipalPoints
Eigen::Vector2d PrincipalPoints(const Eigen::Matrix3d &intrinsics)
Definition: utilities.cc:40
standstill_params.h
vision_common::Isometry3d
Eigen::Isometry3d Isometry3d(const cv::Mat &rodrigues_rotation_cv, const cv::Mat &translation_cv)
Definition: utilities.cc:58
feature_point.h
vision_common::StandstillParams::duration
double duration
Definition: standstill_params.h:28
timestamped_set.h
point_cloud_common::Vector3d
Eigen::Vector3d Vector3d(const PointType &point)
Definition: utilities.h:328
vision_common::RelativeCoordinates
Eigen::Matrix< T, 2, 1 > RelativeCoordinates(const Eigen::Matrix< T, 2, 1 > &absolute_point, const Eigen::Matrix< T, 3, 3 > &intrinsics)
Definition: utilities.h:70
vision_common::StandstillParams::min_num_points_per_track
int min_num_points_per_track
Definition: standstill_params.h:26
localization_common::TimestampedValue
Definition: timestamped_set.h:37
vision_common::ProjectWithDistortion
Eigen::Vector2d ProjectWithDistortion(const Eigen::Vector3d &cam_t_point, const Eigen::Matrix3d &intrinsics, const Eigen::VectorXd &distortion_params)
Definition: utilities.h:95
vision_common::Backproject
Eigen::Vector3d Backproject(const Eigen::Vector2d &measurement, const Eigen::Matrix3d &intrinsics, const double depth, gtsam::OptionalJacobian< 3, 1 > d_backprojected_point_d_depth=boost::none)
Definition: utilities.cc:25
vision_common::StandstillParams
Definition: standstill_params.h:24
localization_common::Time
double Time
Definition: time.h:23
vision_common::AverageDistanceFromMean
double AverageDistanceFromMean(const std::vector< FeaturePoint > &points)
Definition: utilities.cc:77
vision_common::AbsoluteCoordinates
Eigen::Matrix< T, 2, 1 > AbsoluteCoordinates(const Eigen::Matrix< T, 2, 1 > &relative_point, const Eigen::Matrix< T, 3, 3 > &intrinsics)
Definition: utilities.h:85