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 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