Program Listing for File DijkstraSampler.h
↰ Return to documentation for file (include/ompl/mod/samplers/DijkstraSampler.h)
#pragma once
#include <ompl/base/OptimizationObjective.h>
#include <ompl/base/samplers/InformedStateSampler.h>
#include <ompl/base/spaces/SE2StateSpace.h>
#include <ompl/util/RandomNumbers.h>
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
#include <boost/graph/graph_traits.hpp>
#include <boost/graph/grid_graph.hpp>
#include <boost/log/trivial.hpp>
#include <boost/math/constants/constants.hpp>
#include <boost/property_map/property_map.hpp>
#include <fstream>
#include <memory>
#include <vector>
namespace ompl {
namespace MoD {
class DijkstraSampler : public ompl::base::InformedSampler {
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS, boost::no_property,
boost::property<boost::edge_weight_t, double>>
SamplingGraph;
typedef boost::graph_traits<SamplingGraph>::vertex_descriptor SamplingGraphVertexDescriptor;
typedef std::list<boost::graph_traits<SamplingGraph>::vertex_descriptor>::iterator
SamplingGraphVertexDescriptorIterator;
typedef boost::graph_traits<SamplingGraph>::edge_descriptor SamplingGraphEdgeDescriptor;
typedef std::pair<size_t, size_t> Edge;
struct props {
double cell_size;
double x_min;
double x_max;
double y_min;
double y_max;
size_t rows;
size_t cols;
size_t total_edges;
props() = default;
inline props(double cell_size, double x_min, double x_max, double y_min, double y_max, size_t rows, size_t cols,
size_t total_edges) {
this->cell_size = cell_size;
this->x_min = x_min;
this->x_max = x_max;
this->y_min = y_min;
this->y_max = y_max;
this->rows = rows;
this->cols = cols;
this->total_edges = total_edges;
}
};
double getCost(double xi, double yi, double xf, double yf);
double getCost(size_t row_i, size_t col_i, size_t row_f, size_t col_f);
double distance(size_t row_i, size_t col_i, size_t row_f, size_t col_f);
bool checkValidity(double xi, double yi, double xf, double yf);
bool checkValidity(size_t row_i, size_t col_i, size_t row_f, size_t col_f);
inline double colToX(size_t col) const {
return static_cast<double>(col) * this->props_.cell_size + this->props_.x_min;
}
inline double rowToY(size_t row) const {
return static_cast<double>(row) * this->props_.cell_size + this->props_.y_min;
}
protected:
props props_;
std::array<double, 3> start_{0.0, 0.0, 0.0};
std::array<double, 3> goal_{0.0, 0.0, 0.0};
std::list<Edge> edges_;
std::vector<double> weights_;
std::list<SamplingGraphVertexDescriptor> path_;
ompl::RNG rng_;
double bias_{0.05};
bool debug_{false};
std::fstream sampledPosesFile_;
void addEdgeAndWeight(size_t row_i, size_t col_i, size_t row_f, size_t col_f);
public:
DijkstraSampler(const ompl::base::ProblemDefinitionPtr &pdef, unsigned int maxCalls = 100, double cell_size = 0.5,
double bias = 0.05, bool debug = false);
static ompl::base::InformedSamplerPtr allocate(const ompl::base::ProblemDefinitionPtr &pdef,
unsigned int maxCalls = 100, double cell_size = 0.5,
double bias = 0.05, bool debug = false) {
return std::make_shared<DijkstraSampler>(pdef, maxCalls, cell_size, bias, debug);
}
inline ~DijkstraSampler() = default;
inline void setStart(const std::array<double, 3> &start) { this->start_ = start; }
inline void setGoal(const std::array<double, 3> &goal) { this->goal_ = goal; }
inline void setCellSize(double cell_size) { this->props_.cell_size = cell_size; }
inline void setBias(double bias) { this->bias_ = bias; }
void setup();
bool sampleUniform(ompl::base::State *state, const ompl::base::Cost &maxCost) override;
inline bool sampleUniform(ompl::base::State *state, const ompl::base::Cost &minCost,
const ompl::base::Cost &maxCost) override {
return sampleUniform(state, maxCost);
}
inline bool hasInformedMeasure() const override { return false; }
inline double getInformedMeasure(const ompl::base::Cost ¤tCost) const override {
return this->space_->getMeasure();
}
};
} // namespace MoD
} // namespace ompl