2 #include <nav_msgs/OccupancyGrid.h> 7 #include <tuw_multi_robot_msgs/Graph.h> 13 int main(
int argc,
char **argv)
16 ros::init(argc, argv,
"voronoi_graph_node");
48 if (graphCachePath_.back() !=
'/'){
49 graphCachePath_ +=
"/";
53 if (customGraphPath_.back() !=
'/' && customGraphPath_.size() != 0){
54 customGraphPath_ +=
"/";
58 if(publishVoronoiMapImage_){
81 std::vector<signed char> map = _map->data;
84 std::vector<double> parameters;
85 parameters.push_back(_map->info.origin.position.x);
86 parameters.push_back(_map->info.origin.position.y);
87 parameters.push_back(_map->info.resolution);
93 size_t new_hash =
getHash(map, parameters);
102 ROS_INFO(
"Graph generator: Graph not found! Generating new one!");
107 ROS_INFO(
"Graph generator: Graph loaded from memory");
139 std::vector<signed char> map = _map->data;
144 ROS_INFO(
"Graph generator: Computing distance field ...");
145 origin_[0] = _map->info.origin.position.x;
146 origin_[1] = _map->info.origin.position.y;
149 cv::Mat m(_map->info.height, _map->info.width, CV_8SC1, map.data());
153 ROS_INFO(
"Graph generator: Computing voronoi graph ...");
156 ROS_INFO(
"Graph generator: Generating graph ...");
157 potential.reset(
new float[m.cols * m.rows]);
163 ROS_INFO(
"Graph generator: Created new Graph %lu", _map_hash);
182 tuw_multi_robot_msgs::Graph graph;
183 graph.header.frame_id =
"map";
184 graph.header.seq = 0;
187 graph.origin.position.x =
origin_[0];
188 graph.origin.position.y =
origin_[1];
192 tuw_multi_robot_msgs::Vertex seg;
194 seg.id = (*it).getId();
195 seg.weight = (*it).getLength();
198 std::vector<Eigen::Vector2d> path = (*it).getPath();
200 for (uint32_t i = 0; i < path.size(); i++)
202 geometry_msgs::Point pos;
207 seg.path.push_back(pos);
211 std::vector<uint32_t> predecessors = (*it).getPredecessors();
213 for (uint32_t i = 0; i < predecessors.size(); i++)
215 seg.predecessors.push_back(predecessors[i]);
218 std::vector<uint32_t> successors = (*it).getSuccessors();
220 for (uint32_t i = 0; i < successors.size(); i++)
222 seg.successors.push_back(successors[i]);
225 graph.vertices.push_back(seg);
void createGraph(const nav_msgs::OccupancyGrid::ConstPtr &_map, size_t _map_hash)
void globalMapCallback(const nav_msgs::OccupancyGrid::ConstPtr &_map)
bool loadGraph(size_t _hash)
size_t getHash(const std::vector< signed char > &_map, const std::vector< double > &_parameters) const
generate a hash from a _map
ros::Publisher pubSegments_
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
std::unique_ptr< float[]> potential
static void resetId()
resets the id counter (which is used to generate uinique ids)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
ros::Publisher pubVoronoiMapImage_
float endSegmentOptimization_
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
void publish(const boost::shared_ptr< M > &message) const
bool load(const std::string &_mapPath, std::vector< Segment > &_segs, Eigen::Vector2d &_origin, float &_resolution)
loads a graph from memory which is saved in plain text
bool publishVoronoiMapImage_
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
std::string graphCachePath_
std::vector< Segment > segments_
VoronoiGeneratorNode(ros::NodeHandle &n)
void prepareMap(const cv::Mat &_map, cv::Mat &_smoothedMap, int _erodeSize)
prepares the map by smoothing it
void save(const std::string &_mapPath, const std::vector< Segment > &_segs, const Eigen::Vector2d &_origin, const float &_resolution)
saves the graph to a specific path in xml format
void publishTf(std::string mapName)
std::string customGraphPath_
float crossingOptimization_
bool loadCustomGraph(std::string _path)
Eigen::Vector2d origin_
for debuging
ROSCPP_DECL void spinOnce()
int main(int argc, char **argv)
nav_msgs::OccupancyGrid voronoiMapImage_
void computeVoronoiMap(const cv::Mat &_distField, cv::Mat &_voronoiMap)
computes the voronoi _map
void computeDistanceField(const cv::Mat &_map, cv::Mat &_distField)
computes the distance field of a map
std::vector< Segment > calcSegments(cv::Mat &_map, cv::Mat &_distField, cv::Mat &_voronoiPath, float *potential, float _path_length, float _optimizeCrossingPixels, float _optimizeEndSegmentsPixel)
calculates the search graph