multivariate_uniform_distribution.hpp
Go to the documentation of this file.
1 // Copyright 2024 Ekumen, Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef BELUGA_RANDOM_MULTIVARIATE_UNIFORM_DISTRIBUTION_HPP
16 #define BELUGA_RANDOM_MULTIVARIATE_UNIFORM_DISTRIBUTION_HPP
17 
18 #include <random>
19 
20 #include <sophus/se2.hpp>
21 #include <sophus/se3.hpp>
22 
23 #include <Eigen/Geometry>
24 
26 
32 namespace beluga {
33 
35 
39 template <class T, class Constraint>
41 
43 template <>
44 class MultivariateUniformDistribution<Sophus::SE2d, Eigen::AlignedBox2d> {
45  public:
47 
50  explicit MultivariateUniformDistribution(const Eigen::AlignedBox2d& box)
51  : x_distribution_{box.min().x(), box.max().x()}, y_distribution_{box.min().y(), box.max().y()} {}
52 
54 
59  template <class URNG>
60  [[nodiscard]] Sophus::SE2d operator()(URNG& engine) {
61  return Sophus::SE2d{
64  x_distribution_(engine),
65  y_distribution_(engine),
66  },
67  };
68  }
69 
70  private:
71  std::uniform_real_distribution<double> x_distribution_;
72  std::uniform_real_distribution<double> y_distribution_;
73 };
74 
76 MultivariateUniformDistribution(const Eigen::AlignedBox2d&)
78 
80 template <>
81 class MultivariateUniformDistribution<Sophus::SE3d, Eigen::AlignedBox3d> {
82  public:
84 
87  explicit MultivariateUniformDistribution(const Eigen::AlignedBox3d& box)
88  : x_distribution_{box.min().x(), box.max().x()},
89  y_distribution_{box.min().y(), box.max().y()},
90  z_distribution_{box.min().z(), box.max().z()} {}
91 
93 
98  template <class URNG>
99  [[nodiscard]] Sophus::SE3d operator()(URNG& engine) {
100  return Sophus::SE3d{
103  x_distribution_(engine),
104  y_distribution_(engine),
105  z_distribution_(engine),
106  },
107  };
108  }
109 
110  private:
111  std::uniform_real_distribution<double> x_distribution_;
112  std::uniform_real_distribution<double> y_distribution_;
113  std::uniform_real_distribution<double> z_distribution_;
114 };
115 
117 MultivariateUniformDistribution(const Eigen::AlignedBox3d&)
119 
121 
126 template <class OccupancyGrid>
128  public:
130 
134  constexpr explicit MultivariateUniformDistribution(const OccupancyGrid& grid)
135  : free_states_{compute_free_states(grid)}, distribution_{0, free_states_.size() - 1} {
136  assert(!free_states_.empty());
137  }
138 
140 
149  template <class URNG>
150  [[nodiscard]] Sophus::SE2d operator()(URNG& engine) {
151  return {Sophus::SO2d::sampleUniform(engine), free_states_[distribution_(engine)]};
152  }
153 
154  private:
155  std::vector<Eigen::Vector2d> free_states_;
156  std::uniform_int_distribution<std::size_t> distribution_;
157 
158  static std::vector<Eigen::Vector2d> compute_free_states(const OccupancyGrid& grid) {
159  return grid.coordinates_for(grid.free_cells(), OccupancyGrid::Frame::kGlobal) | ranges::to<std::vector>;
160  }
161 };
162 
164 template <class Derived>
165 MultivariateUniformDistribution(const BaseOccupancyGrid2<Derived>&)
166  -> MultivariateUniformDistribution<Sophus::SE2d, Derived>;
167 
168 } // namespace beluga
169 
170 #endif
beluga::MultivariateUniformDistribution< Sophus::SE2d, OccupancyGrid >::MultivariateUniformDistribution
constexpr MultivariateUniformDistribution(const OccupancyGrid &grid)
Constructs a multivariate uniform distribution based on the provided occupancy grid.
Definition: multivariate_uniform_distribution.hpp:134
beluga::MultivariateUniformDistribution
MultivariateUniformDistribution(const Eigen::AlignedBox2d &) -> MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >
Deduction guide for bounding regions in SE2 space.
beluga::MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >::operator()
Sophus::SE2d operator()(URNG &engine)
Generates a random 2D pose within the bounding region.
Definition: multivariate_uniform_distribution.hpp:60
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >::operator()
Sophus::SE3d operator()(URNG &engine)
Generates a random 3D pose within the bounding region.
Definition: multivariate_uniform_distribution.hpp:99
beluga::MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >
Specialization of multivariate uniform distribution for bounding regions in 2D space.
Definition: multivariate_uniform_distribution.hpp:44
Sophus::Vector3d
Vector3< double > Vector3d
se2.hpp
beluga::MultivariateUniformDistribution< Sophus::SE2d, OccupancyGrid >::distribution_
std::uniform_int_distribution< std::size_t > distribution_
Uniform distribution for indices.
Definition: multivariate_uniform_distribution.hpp:156
beluga::MultivariateUniformDistribution< Sophus::SE2d, OccupancyGrid >::free_states_
std::vector< Eigen::Vector2d > free_states_
Vector containing free states.
Definition: multivariate_uniform_distribution.hpp:155
Sophus
Sophus::SE2
beluga::MultivariateUniformDistribution< Sophus::SE2d, OccupancyGrid >::operator()
Sophus::SE2d operator()(URNG &engine)
Generates a random 2D pose.
Definition: multivariate_uniform_distribution.hpp:150
Sophus::Vector2d
Vector2< double > Vector2d
beluga::MultivariateUniformDistribution< Sophus::SE2d, OccupancyGrid >::compute_free_states
static std::vector< Eigen::Vector2d > compute_free_states(const OccupancyGrid &grid)
Definition: multivariate_uniform_distribution.hpp:158
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >::MultivariateUniformDistribution
MultivariateUniformDistribution(const Eigen::AlignedBox3d &box)
Constructs a multivariate uniform distribution in SE(3) with 3D bounding region.
Definition: multivariate_uniform_distribution.hpp:87
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >::z_distribution_
std::uniform_real_distribution< double > z_distribution_
Definition: multivariate_uniform_distribution.hpp:113
occupancy_grid.hpp
Concepts and abstract implementations of occupancy grids.
beluga::MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >::MultivariateUniformDistribution
MultivariateUniformDistribution(const Eigen::AlignedBox2d &box)
Constructs a multivariate uniform distribution in SE(2) with 2D bounding region.
Definition: multivariate_uniform_distribution.hpp:50
Sophus::SE3
beluga::MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >::y_distribution_
std::uniform_real_distribution< double > y_distribution_
Definition: multivariate_uniform_distribution.hpp:72
Sophus::SO3::sampleUniform
static SO3 sampleUniform(UniformRandomBitGenerator &generator)
beluga::MultivariateUniformDistribution< Sophus::SE2d, Eigen::AlignedBox2d >::x_distribution_
std::uniform_real_distribution< double > x_distribution_
Definition: multivariate_uniform_distribution.hpp:71
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >
Specialization of multivariate uniform distribution for bounding regions in 3D space.
Definition: multivariate_uniform_distribution.hpp:81
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >::y_distribution_
std::uniform_real_distribution< double > y_distribution_
Definition: multivariate_uniform_distribution.hpp:112
SE3d
SE3< double > SE3d
SE2d
SE2< double > SE2d
Sophus::SO2::sampleUniform
static SO2 sampleUniform(UniformRandomBitGenerator &generator)
beluga::MultivariateUniformDistribution< Sophus::SE3d, Eigen::AlignedBox3d >::x_distribution_
std::uniform_real_distribution< double > x_distribution_
Definition: multivariate_uniform_distribution.hpp:111
beluga::MultivariateUniformDistribution
Primary template for a multivariate uniform distribution.
Definition: multivariate_uniform_distribution.hpp:40
beluga
The main Beluga namespace.
Definition: 3d_embedding.hpp:21
se3.hpp


beluga
Author(s):
autogenerated on Tue Jul 16 2024 02:59:53