voronoi_graph_node.cpp
Go to the documentation of this file.
1 #include <ros/ros.h>
2 #include <nav_msgs/OccupancyGrid.h>
6 #include <memory>
7 #include <tuw_multi_robot_msgs/Graph.h>
8 #include <string>
9 
10 void publishTf(std::string mapName);
11 
12 
13 int main(int argc, char **argv)
14 {
15 
16  ros::init(argc, argv, "voronoi_graph_node");
18 
20 
21  return 0;
22 }
23 
24 namespace tuw_graph
25 {
27  {
28 
29 
30  double loop_rate;
31  n_param_.param<double>("loop_rate", loop_rate, 0.1);
32 
33  n_param_.param<bool>("publish_voronoi_map_image", publishVoronoiMapImage_, false);
34 
35  n_param_.param<double>("map_inflation", inflation_, 0.1);
36 
37  n_param_.param<float>("segment_length", segment_length_, 1.0);
38 
39 
41  n_param_.param<float>("opt_crossings", crossingOptimization_, 0.2);
42 
43  n_param_.param<float>("opt_end_segments", endSegmentOptimization_, 0.2);
44  //endSegmentOptimization_ = std::min<float>(endSegmentOptimization_, 0.7 * path_length_);
45 
46  n_param_.param<std::string>("graph_cache_path", graphCachePath_, "/tmp");
47 
48  if (graphCachePath_.back() != '/'){
49  graphCachePath_ += "/";
50  }
51  n_param_.param<std::string>("custom_graph_path", customGraphPath_, "");
52 
53  if (customGraphPath_.back() != '/' && customGraphPath_.size() != 0){
54  customGraphPath_ += "/";
55  }
56 
59  pubVoronoiMapImage_ = n.advertise<nav_msgs::OccupancyGrid>( "map_eroded", 1);
60  }
61  pubSegments_ = n.advertise<tuw_multi_robot_msgs::Graph>("segments", 1);
62 
63 
64  ros::Rate r(loop_rate);
65 
66  ROS_INFO("Initialization done!");
67 
68  while (ros::ok())
69  {
70  ros::spinOnce();
71 
73 
74  r.sleep();
75  }
76 
77  }
78 
79  void VoronoiGeneratorNode::globalMapCallback(const nav_msgs::OccupancyGrid::ConstPtr &_map)
80  {
81  std::vector<signed char> map = _map->data;
82 
83 
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);
88  parameters.push_back(inflation_);
89  parameters.push_back(segment_length_);
90  parameters.push_back(endSegmentOptimization_);
91  parameters.push_back(crossingOptimization_);
92 
93  size_t new_hash = getHash(map, parameters);
94 
95 
96  if (customGraphPath_.size() == 0)
97  {
98  if (new_hash != current_map_hash_ )
99  {
100  if (!loadGraph(new_hash) )
101  {
102  ROS_INFO("Graph generator: Graph not found! Generating new one!");
103  createGraph(_map, new_hash);
104  }
105  else
106  {
107  ROS_INFO("Graph generator: Graph loaded from memory");
108  }
109 
110  current_map_hash_ = new_hash;
111  }
112  }
113  else
114  {
115  ROS_INFO("loading custom graph from: %s", customGraphPath_.c_str());
117  ROS_INFO("graph loaded");
118  else
119  ROS_INFO("failed to load graph");
120  }
121 
122  if (publishVoronoiMapImage_ && (map_.size > 0))
123  {
124  voronoiMapImage_.header = _map->header;
125  voronoiMapImage_.info = _map->info;
126  voronoiMapImage_.data.resize(_map->data.size());
127 
128  for (unsigned int i = 0; i < voronoiMapImage_.data.size(); i++)
129  {
130  voronoiMapImage_.data[i] = map_.data[i];
131  }
133  }
134 
135  }
136 
137  void VoronoiGeneratorNode::createGraph(const nav_msgs::OccupancyGrid::ConstPtr &_map, size_t _map_hash)
138  {
139  std::vector<signed char> map = _map->data;
140 
141  segments_.clear();
143 
144  ROS_INFO("Graph generator: Computing distance field ...");
145  origin_[0] = _map->info.origin.position.x;
146  origin_[1] = _map->info.origin.position.y;
147  resolution_ = _map->info.resolution;
148 
149  cv::Mat m(_map->info.height, _map->info.width, CV_8SC1, map.data());
150  prepareMap(m, map_, inflation_ / _map->info.resolution);
152 
153  ROS_INFO("Graph generator: Computing voronoi graph ...");
155 
156  ROS_INFO("Graph generator: Generating graph ...");
157  potential.reset(new float[m.cols * m.rows]);
158  float pixel_path_length = segment_length_ / resolution_;
160 
161  //Check Directroy
162  save(graphCachePath_ + std::to_string(_map_hash) + "/", segments_, origin_, resolution_, map_);
163  ROS_INFO("Graph generator: Created new Graph %lu", _map_hash);
164  }
165 
166  bool VoronoiGeneratorNode::loadGraph(std::size_t _hash)
167  {
168  segments_.clear();
170  return load(graphCachePath_ + std::to_string(_hash) + "/", segments_, origin_, resolution_, map_);
171  }
172 
174  {
175  segments_.clear();
177  return load(_path, segments_, origin_, resolution_);
178  }
179 
181  {
182  tuw_multi_robot_msgs::Graph graph;
183  graph.header.frame_id = "map";
184  graph.header.seq = 0;
185  graph.header.stamp = ros::Time::now();
186 
187  graph.origin.position.x = origin_[0]; //TODO test
188  graph.origin.position.y = origin_[1]; //TODO test
189 
190  for (auto it = segments_.begin(); it != segments_.end(); ++it)
191  {
192  tuw_multi_robot_msgs::Vertex seg;
193 
194  seg.id = (*it).getId();
195  seg.weight = (*it).getLength();
196  seg.width = (*it).getMinPathSpace() * resolution_;
197  seg.valid = true;
198  std::vector<Eigen::Vector2d> path = (*it).getPath();
199 
200  for (uint32_t i = 0; i < path.size(); i++)
201  {
202  geometry_msgs::Point pos;
203  pos.x = path[i][0] * resolution_;
204  pos.y = path[i][1] * resolution_;
205  pos.z = 0;
206 
207  seg.path.push_back(pos);
208  }
209 
210  //ROS_INFO("distORIG: %i/%i", (*it)->GetPredecessors().size(), (*it)->GetSuccessors().size());
211  std::vector<uint32_t> predecessors = (*it).getPredecessors();
212 
213  for (uint32_t i = 0; i < predecessors.size(); i++)
214  {
215  seg.predecessors.push_back(predecessors[i]);
216  }
217 
218  std::vector<uint32_t> successors = (*it).getSuccessors();
219 
220  for (uint32_t i = 0; i < successors.size(); i++)
221  {
222  seg.successors.push_back(successors[i]);
223  }
224 
225  graph.vertices.push_back(seg);
226  }
227 
228  pubSegments_.publish(graph);
229  }
230 
231 } // namespace tuw_graph
tuw_graph::VoronoiGeneratorNode::customGraphPath_
std::string customGraphPath_
Definition: voronoi_graph_node.h:44
voronoi_path_generator.h
tuw_graph::VoronoiGeneratorNode::globalMapCallback
void globalMapCallback(const nav_msgs::OccupancyGrid::ConstPtr &_map)
Definition: voronoi_graph_node.cpp:79
tuw_graph::VoronoiGeneratorNode::publishSegments
void publishSegments()
Definition: voronoi_graph_node.cpp:180
ros::init
ROSCPP_DECL void init(const M_string &remappings, const std::string &name, uint32_t options=0)
ros.h
tuw_graph::VoronoiGeneratorNode
Definition: voronoi_graph_node.h:19
main
int main(int argc, char **argv)
Definition: voronoi_graph_node.cpp:13
tuw_graph::VoronoiGeneratorNode::voronoiMapImage_
nav_msgs::OccupancyGrid voronoiMapImage_
Definition: voronoi_graph_node.h:66
voronoi_map::VoronoiPathGenerator::prepareMap
void prepareMap(const cv::Mat &_map, cv::Mat &_smoothedMap, int _erodeSize)
prepares the map by smoothing it
Definition: voronoi_path_generator.cpp:22
tuw_graph::VoronoiGeneratorNode::segment_length_
float segment_length_
Definition: voronoi_graph_node.h:57
tuw_graph::VoronoiGeneratorNode::crossingOptimization_
float crossingOptimization_
Definition: voronoi_graph_node.h:62
tuw_graph::VoronoiGeneratorNode::n_param_
ros::NodeHandle n_param_
Definition: voronoi_graph_node.h:26
ros::spinOnce
ROSCPP_DECL void spinOnce()
tuw_graph::VoronoiGeneratorNode::subMap_
ros::Subscriber subMap_
Definition: voronoi_graph_node.h:40
tuw_graph::Segment::resetId
static void resetId()
resets the id counter (which is used to generate uinique ids)
Definition: segment.cpp:182
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
ros::ok
ROSCPP_DECL bool ok()
voronoi_graph_generator.h
tuw_graph::VoronoiGeneratorNode::distField_
cv::Mat distField_
Definition: voronoi_graph_node.h:55
tuw_graph::VoronoiGeneratorNode::current_map_hash_
size_t current_map_hash_
Definition: voronoi_graph_node.h:50
tuw_graph::VoronoiGeneratorNode::map_
cv::Mat map_
Definition: voronoi_graph_node.h:54
voronoi_map
Definition: thinning.h:7
tuw_graph::VoronoiGeneratorNode::pubVoronoiMapImage_
ros::Publisher pubVoronoiMapImage_
Definition: voronoi_graph_node.h:38
tuw_graph::VoronoiGeneratorNode::publishVoronoiMapImage_
bool publishVoronoiMapImage_
Definition: voronoi_graph_node.h:51
voronoi_graph_node.h
tuw_graph::Serializer::save
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
Definition: serializer.cpp:155
tuw_graph::VoronoiGeneratorNode::potential
std::unique_ptr< float[]> potential
Definition: voronoi_graph_node.h:58
tuw_graph::VoronoiGeneratorNode::VoronoiGeneratorNode
VoronoiGeneratorNode(ros::NodeHandle &n)
Definition: voronoi_graph_node.cpp:26
tuw_graph::VoronoiGeneratorNode::graphCachePath_
std::string graphCachePath_
Definition: voronoi_graph_node.h:43
voronoi_map::VoronoiPathGenerator::computeDistanceField
void computeDistanceField(const cv::Mat &_map, cv::Mat &_distField)
computes the distance field of a map
Definition: voronoi_path_generator.cpp:50
ros::NodeHandle::subscribe
Subscriber subscribe(const std::string &topic, uint32_t queue_size, const boost::function< void(C)> &callback, const VoidConstPtr &tracked_object=VoidConstPtr(), const TransportHints &transport_hints=TransportHints())
voronoi_map::VoronoiPathGenerator::computeVoronoiMap
void computeVoronoiMap(const cv::Mat &_distField, cv::Mat &_voronoiMap)
computes the voronoi _map
Definition: voronoi_path_generator.cpp:55
tuw_graph::VoronoiGeneratorNode::inflation_
double inflation_
Definition: voronoi_graph_node.h:61
tuw_graph::VoronoiGeneratorNode::segments_
std::vector< Segment > segments_
Definition: voronoi_graph_node.h:59
tuw_graph::VoronoiGraphGenerator
Definition: voronoi_graph_generator.h:38
tuw_graph::VoronoiGeneratorNode::loadCustomGraph
bool loadCustomGraph(std::string _path)
Definition: voronoi_graph_node.cpp:173
tuw_graph::Serializer
Definition: serializer.h:217
tuw_graph::Serializer::load
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
Definition: serializer.cpp:45
publishTf
void publishTf(std::string mapName)
tuw_graph::VoronoiGeneratorNode::loadGraph
bool loadGraph(size_t _hash)
Definition: voronoi_graph_node.cpp:166
tuw_graph::VoronoiGeneratorNode::voronoiMap_
cv::Mat voronoiMap_
Definition: voronoi_graph_node.h:56
ros::NodeHandle::param
T param(const std::string &param_name, const T &default_val) const
tuw_graph::VoronoiGeneratorNode::origin_
Eigen::Vector2d origin_
for debuging
Definition: voronoi_graph_node.h:52
tuw_graph::VoronoiGeneratorNode::resolution_
float resolution_
Definition: voronoi_graph_node.h:53
ros::Rate
ROS_INFO
#define ROS_INFO(...)
tuw_graph::Serializer::getHash
size_t getHash(const std::vector< signed char > &_map, const std::vector< double > &_parameters) const
generate a hash from a _map
Definition: serializer.cpp:27
tuw_graph::VoronoiGeneratorNode::pubSegments_
ros::Publisher pubSegments_
Definition: voronoi_graph_node.h:39
tuw_graph
Definition: serializer.h:19
tuw_graph::VoronoiGraphGenerator::calcSegments
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
Definition: voronoi_graph_generator.cpp:39
tuw_graph::VoronoiGeneratorNode::endSegmentOptimization_
float endSegmentOptimization_
Definition: voronoi_graph_node.h:63
ros::NodeHandle
ros::Time::now
static Time now()
tuw_graph::VoronoiGeneratorNode::createGraph
void createGraph(const nav_msgs::OccupancyGrid::ConstPtr &_map, size_t _map_hash)
Definition: voronoi_graph_node.cpp:137


tuw_voronoi_graph
Author(s): Benjamin Binder
autogenerated on Wed Mar 2 2022 01:10:12