NASA Astrobee Robot Software  0.19.1
Flight software for the Astrobee robots operating inside the International Space Station.
test_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 
19 #ifndef LOCALIZATION_COMMON_TEST_UTILITIES_H_
20 #define LOCALIZATION_COMMON_TEST_UTILITIES_H_
21 
25 
26 #include <Eigen/Geometry>
27 #include <gtsam/geometry/Pose3.h>
28 
29 #include <gtest/gtest.h>
30 
31 #include <vector>
32 
33 namespace localization_common {
34 class Sampler {
35  public:
36  Sampler(const double min, const double max, const double count);
37  double Sample(const int increment) const;
38 
39  private:
40  const double scale_;
41  const double min_;
42 };
43 
44 // Selected from [-100, 100]
45 double RandomDouble();
46 
47 // Selected from [0, 100]
48 double RandomPositiveDouble();
49 
50 // Selected from [min, max]
51 double RandomDouble(const double min, const double max);
52 
53 double RandomGaussianDouble(const double mean, const double stddev);
54 
55 bool RandomBool();
56 
58 
59 // Returns white noise with set stddev
60 double Noise(const double stddev);
61 
62 // Each index ranges from [-100, 100]
63 template <int Dim>
64 Eigen::Matrix<double, Dim, 1> RandomVector();
65 
67 
69 
71 
72 Eigen::Vector2d RandomVector2d();
73 
74 Eigen::Vector2d RandomPoint2d();
75 
76 template <int D>
77 Eigen::Matrix<double, D, D> RandomCovariance();
78 
79 // Translation ranges from [-100, 100]
80 // Rotation spans all possible rotations
81 gtsam::Pose3 RandomPose();
82 
84 
86 
88 
90 
92 
93 // Focal lengths and principal points selected from [0.1, 1000]
94 Eigen::Matrix3d RandomIntrinsics();
95 
96 // Adds noise to identity Isometry3d
97 Eigen::Isometry3d RandomIdentityCenteredIsometry3d(const double translation_stddev, const double rotation_stddev);
98 
99 Eigen::Isometry3d AddNoiseToIsometry3d(const Eigen::Isometry3d& pose, const double translation_stddev,
100  const double rotation_stddev);
101 
102 gtsam::Pose3 AddNoiseToPose(const gtsam::Pose3& pose, const double translation_stddev, const double rotation_stddev);
103 
104 template <int N>
105 Eigen::Matrix<double, N, 1> AddNoiseToVector(const Eigen::Matrix<double, N, 1>& vector, const double noise_stddev);
106 
107 // Samples in cylindrical coordinates for pose translation to keep pose in view frustrum.
108 // Samples z using scaled rho value to prevent large z vals with small rho values
109 // that may move the pose out of the view frustrum.
110 Eigen::Isometry3d RandomFrontFacingPose(const double rho_min, const double rho_max, const double phi_min,
111  const double phi_max, const double z_rho_scale, const double yaw_min,
112  const double yaw_max, const double pitch_min, const double pitch_max,
113  const double roll_min, const double roll_max);
114 
116 
117 std::vector<Eigen::Vector3d> RandomFrontFacingPoints(const int num_points);
118 
120 
121 Eigen::Vector3d RandomFrontFacingPoint(const double rho_min, const double rho_max, const double phi_min,
122  const double phi_max, const double z_rho_scale);
123 
124 bool MatrixEquality(const Eigen::MatrixXd& lhs, const Eigen::MatrixXd& rhs, const double tolerance);
125 
126 // Implementation
127 template <int Dim>
128 Eigen::Matrix<double, Dim, 1> RandomVector() {
129  // Eigen::Matrix::Random() is constrained to [-1, 1]
130  return RandomDouble() * Eigen::Matrix<double, Dim, 1>::Random();
131 }
132 
133 template <int D>
134 Eigen::Matrix<double, D, D> RandomCovariance() {
135  const Eigen::Matrix<double, D, D> random_matrix = Eigen::Matrix<double, D, D>::Random();
136  // Random covariance is a random symmetric matrix
137  return random_matrix.transpose() * random_matrix;
138 }
139 
140 template <int N>
141 Eigen::Matrix<double, N, 1> AddNoiseToVector(const Eigen::Matrix<double, N, 1>& vector, const double noise_stddev) {
142  Eigen::Matrix<double, N, 1> noisy_vector = vector;
143  for (int i = 0; i < vector.rows(); ++i) {
144  noisy_vector(i, 0) += Noise(noise_stddev);
145  }
146  return noisy_vector;
147 }
148 } // namespace localization_common
149 
150 // Add GTEST like MACROS with no namespace so these mirror GTEST calls
151 // clang-format off
152 #define EXPECT_MATRIX_NEAR(lhs, rhs, tol) \
153  do { \
154  EXPECT_PRED3(localization_common::MatrixEquality, lhs.matrix(), rhs.matrix(), tol); \
155  } while (0)
156 
157 #endif // LOCALIZATION_COMMON_TEST_UTILITIES_H_
localization_common
Definition: averager.h:33
localization_common::RandomFrontFacingPoint
Eigen::Vector3d RandomFrontFacingPoint()
Definition: test_utilities.cc:173
localization_common::RandomPositiveDouble
double RandomPositiveDouble()
Definition: test_utilities.cc:32
localization_common::Sampler::Sampler
Sampler(const double min, const double max, const double count)
Definition: test_utilities.cc:25
localization_common::Noise
double Noise(const double stddev)
Definition: test_utilities.cc:49
localization_common::Sampler::Sample
double Sample(const int increment) const
Definition: test_utilities.cc:28
pose_with_covariance.h
localization_common::RandomAffine3d
Eigen::Affine3d RandomAffine3d()
Definition: test_utilities.cc:80
localization_common::RandomPoseCovariance
PoseCovariance RandomPoseCovariance()
Definition: test_utilities.cc:71
localization_common::CombinedNavState
Definition: combined_nav_state.h:48
localization_common::RandomDouble
double RandomDouble()
Definition: test_utilities.cc:30
localization_common::RandomVelocity
Eigen::Vector3d RandomVelocity()
Definition: test_utilities.cc:57
localization_common::RandomPose
gtsam::Pose3 RandomPose()
Definition: test_utilities.cc:63
localization_common::Sampler
Definition: test_utilities.h:34
localization_common::AddNoiseToPose
gtsam::Pose3 AddNoiseToPose(const gtsam::Pose3 &pose, const double translation_stddev, const double rotation_stddev)
Definition: test_utilities.cc:130
localization_common::RandomPoint2d
Eigen::Vector2d RandomPoint2d()
Definition: test_utilities.cc:61
localization_common::RandomIsometry3d
Eigen::Isometry3d RandomIsometry3d()
Definition: test_utilities.cc:75
localization_common::RandomIntrinsics
Eigen::Matrix3d RandomIntrinsics()
Definition: test_utilities.cc:94
localization_common::RandomVector
Eigen::Matrix< double, Dim, 1 > RandomVector()
Definition: test_utilities.h:128
localization_common::RandomVector2d
Eigen::Vector2d RandomVector2d()
Definition: test_utilities.cc:59
localization_common::RandomTime
Time RandomTime()
Definition: test_utilities.cc:51
localization_common::PoseCovariance
Eigen::Matrix< double, 6, 6 > PoseCovariance
Definition: pose_with_covariance.h:27
localization_common::Isometry3d
Eigen::Isometry3d Isometry3d(const Eigen::Vector3d &translation, const RotationType &rotation)
Definition: utilities.h:226
localization_common::MatrixEquality
bool MatrixEquality(const Eigen::MatrixXd &lhs, const Eigen::MatrixXd &rhs, const double tolerance)
Definition: test_utilities.cc:193
localization_common::RandomVector3d
Eigen::Vector3d RandomVector3d()
Definition: test_utilities.cc:53
localization_common::RandomIdentityCenteredIsometry3d
Eigen::Isometry3d RandomIdentityCenteredIsometry3d(const double translation_stddev, const double rotation_stddev)
Definition: test_utilities.cc:109
point_cloud_common::Vector3d
Eigen::Vector3d Vector3d(const PointType &point)
Definition: utilities.h:328
localization_common::RandomCovariance
Eigen::Matrix< double, D, D > RandomCovariance()
Definition: test_utilities.h:134
localization_common::RandomBool
bool RandomBool()
Definition: test_utilities.cc:47
time.h
localization_common::RandomFrontFacingPoints
std::vector< Eigen::Vector3d > RandomFrontFacingPoints(const int num_points)
Definition: test_utilities.cc:165
localization_common::PoseWithCovariance
Definition: pose_with_covariance.h:28
localization_common::RandomPoint3d
Eigen::Vector3d RandomPoint3d()
Definition: test_utilities.cc:55
localization_common::AddNoiseToIsometry3d
Eigen::Isometry3d AddNoiseToIsometry3d(const Eigen::Isometry3d &pose, const double translation_stddev, const double rotation_stddev)
Definition: test_utilities.cc:113
localization_common::RandomFrontFacingPose
Eigen::Isometry3d RandomFrontFacingPose(const double rho_min, const double rho_max, const double phi_min, const double phi_max, const double z_rho_scale, const double yaw_min, const double yaw_max, const double pitch_min, const double pitch_max, const double roll_min, const double roll_max)
Definition: test_utilities.cc:153
combined_nav_state.h
localization_common::AddNoiseToVector
Eigen::Matrix< double, N, 1 > AddNoiseToVector(const Eigen::Matrix< double, N, 1 > &vector, const double noise_stddev)
Definition: test_utilities.h:141
localization_common::RandomPoseWithCovariance
PoseWithCovariance RandomPoseWithCovariance()
Definition: test_utilities.cc:73
optimization_common::Affine3d
Eigen::Affine3d Affine3d(const Eigen::Matrix< double, 7, 1 > &affine_vector)
Definition: utilities.cc:43
localization_common::RandomGaussianDouble
double RandomGaussianDouble(const double mean, const double stddev)
Definition: test_utilities.cc:40
localization_common::RandomCombinedNavState
CombinedNavState RandomCombinedNavState()
Definition: test_utilities.cc:89
localization_common::Time
double Time
Definition: time.h:23