15 #include <benchmark/benchmark.h>
18 #include <initializer_list>
36 const auto n =
state.range(0);
38 for (
auto _ :
state) {
39 Eigen::Vector2i storage;
40 for (
const auto& cell : algorithm({0, 0}, {n, n})) {
41 benchmark::DoNotOptimize(storage = cell);
44 state.SetComplexityN(n);
59 template <std::
size_t Rows, std::
size_t Cols>
63 [[nodiscard]]
bool is_free(
bool value)
const {
return !value; }
64 [[nodiscard]]
bool is_unknown(
bool)
const {
return false; }
65 [[nodiscard]]
bool is_occupied(
bool value)
const {
return value; }
68 explicit BaselineGrid(std::initializer_list<bool>,
double resolution) : resolution_{resolution} {
69 std::fill(std::begin(data()), std::end(data()),
false);
72 [[nodiscard]]
const Sophus::SE2d& origin()
const {
return origin_; }
74 [[nodiscard]]
auto& data() {
return grid_; }
75 [[nodiscard]]
const auto& data()
const {
return grid_; }
76 [[nodiscard]] std::size_t size()
const {
return grid_.size(); }
78 [[nodiscard]] std::size_t width()
const {
return Cols; }
79 [[nodiscard]] std::size_t height()
const {
return Rows; }
80 [[nodiscard]]
double resolution()
const {
return resolution_; }
82 [[nodiscard]]
auto value_traits()
const {
return ValueTraits{}; }
87 std::array<bool, Rows * Cols> grid_;
88 static constexpr std::size_t kWidth = Cols;
89 static constexpr std::size_t kHeight = Rows;
92 const auto kBearingAngles = std::array{
98 const auto kBearingLabels = std::array{
104 template <
template <std::
size_t, std::
size_t>
class Grid>
105 void BM_RayCasting2d_BaselineRaycast(benchmark::State&
state) {
106 constexpr
double kMaxRange = 100.0;
107 constexpr
double kResolution = 0.05;
109 const auto bearing_index =
static_cast<std::size_t
>(
state.range(0));
110 const auto n =
static_cast<int>(
state.range(1));
111 Grid<1280, 1280> grid{{}, kResolution};
112 grid.data()[grid.index_at(n, n)] =
true;
113 grid.data()[grid.index_at(0, n)] =
true;
114 grid.data()[grid.index_at(n, 0)] =
true;
116 const auto source_pose = Eigen::Vector2d{0., 0.};
117 const auto beam_bearing =
Sophus::SO2d{kBearingAngles.at(bearing_index)};
119 const auto source = grid.cell_near(source_pose);
120 const auto target = grid.cell_near(source_pose + kMaxRange * beam_bearing.unit_complex());
122 for (
auto _ :
state) {
125 state.SetComplexityN(n);
126 state.SetLabel(kBearingLabels.at(bearing_index));
129 BENCHMARK_TEMPLATE(BM_RayCasting2d_BaselineRaycast, BaselineGrid)
144 BENCHMARK_TEMPLATE(BM_RayCasting2d_BaselineRaycast, StaticOccupancyGrid)
159 template <
template <std::
size_t, std::
size_t>
class Grid>
160 void BM_RayCasting2d(benchmark::State&
state) {
161 constexpr
double kMaxRange = 100.0;
162 constexpr
double kResolution = 0.05;
164 const auto bearing_index =
static_cast<std::size_t
>(
state.range(0));
165 const auto n =
static_cast<int>(
state.range(1));
166 auto grid = Grid<1280, 1280>{{}, kResolution};
167 grid.data()[grid.index_at(n, n)] =
true;
168 grid.data()[grid.index_at(0, n)] =
true;
169 grid.data()[grid.index_at(n, 0)] =
true;
171 const auto source_pose =
Sophus::SE2d{0., Eigen::Vector2d{0., 0.}};
172 const auto beam_bearing =
Sophus::SO2d{kBearingAngles.at(bearing_index)};
173 const auto beam =
beluga::Ray2d{grid, source_pose, kMaxRange};
174 for (
auto _ :
state) {
175 benchmark::DoNotOptimize(beam.cast(beam_bearing));
177 state.SetComplexityN(n);
178 state.SetLabel(kBearingLabels.at(bearing_index));
181 BENCHMARK_TEMPLATE(BM_RayCasting2d, BaselineGrid)
196 BENCHMARK_TEMPLATE(BM_RayCasting2d, StaticOccupancyGrid)