nav_grid_publisher.h
Go to the documentation of this file.
1 /*
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2018, Locus Robotics
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  */
34 
35 #ifndef NAV_GRID_PUB_SUB_NAV_GRID_PUBLISHER_H
36 #define NAV_GRID_PUB_SUB_NAV_GRID_PUBLISHER_H
37 
42 #include <ros/ros.h>
43 #include <nav_grid/nav_grid.h>
45 #include <nav_core2/bounds.h>
46 #include <geometry_msgs/PolygonStamped.h>
47 #include <limits>
48 #include <string>
49 #include <vector>
50 
51 namespace nav_grid_pub_sub
52 {
53 // Helper function: needs temp double variables for conversion, then made into floats for Point32
54 inline geometry_msgs::Point32 makePoint(const nav_grid::NavGridInfo& info, int x, int y)
55 {
56  double point_x = 0.0;
57  double point_y = 0.0;
58  gridToWorld(info, x, y, point_x, point_y);
59  geometry_msgs::Point32 point;
60  point.x = point_x;
61  point.y = point_y;
62  return point;
63 }
64 
105 template<typename NumericType, typename NavGridOfX, typename NavGridOfXUpdate>
107 {
108 public:
110 
128  const std::string& nav_grid_topic = "grid",
129  const std::string& occupancy_grid_topic = "costmap",
130  const std::string& update_area_topic = "update_area",
131  bool publish_updates = true,
132  ros::Duration full_publish_cycle = ros::Duration(0),
133  ros::Duration update_publish_cycle = ros::Duration(0))
134  {
135  full_publish_cycle_ = full_publish_cycle;
136  update_publish_cycle_ = update_publish_cycle;
139  publish_updates_ = publish_updates;
140 
141  createPublishers<NavGridOfX, NavGridOfXUpdate>(
142  nh, nav_grid_topic, std::bind(&GenericGridPublisher::onNewSubscriptionNav, this, std::placeholders::_1),
143  nav_pub_, nav_update_pub_, publish_updates);
144 
145  createPublishers<nav_msgs::OccupancyGrid, map_msgs::OccupancyGridUpdate>(
146  nh, occupancy_grid_topic, std::bind(&GenericGridPublisher::onNewSubscriptionOcc, this, std::placeholders::_1),
147  occ_pub_, occ_update_pub_, publish_updates);
148 
149  if (update_area_topic.length() > 0)
150  {
151  update_area_pub_ = nh.advertise<geometry_msgs::PolygonStamped>(update_area_topic, 1);
152  }
153  }
154 
158  void publish()
159  {
160  if (!shouldPublishFull()) return;
163  publishNav();
164  publishOcc();
165  }
166 
174  void publish(const nav_core2::UIntBounds& bounds)
175  {
176  if (!publish_updates_)
177  {
178  // Don't publish an update, publish the full grid if enough time has passed
179  publish();
180  return;
181  }
182 
183  update_bounds_.merge(bounds);
184 
185  if (!shouldPublishUpdate()) return;
186 
187  const nav_grid::NavGridInfo& info = data_.getInfo();
190 
191  if (saved_info_ != info)
192  {
193  // If the info has changed, force publish the whole grid
194  saved_info_ = info;
195  publishNav();
196  publishOcc();
197  }
198  else if (!update_bounds_.isEmpty())
199  {
200  // If actual data was updated, publish the updates
203  }
204 
205  // Publish the update area (or an empty polygon message if there was no update)
207 
209  }
210 
211 
212 protected:
213  template<class FullGridType, class UpdateType, class Callback>
214  void createPublishers(ros::NodeHandle& nh, const std::string& topic, Callback new_subscription_callback,
215  ros::Publisher& full_grid_pub, ros::Publisher& update_pub, bool publish_updates)
216  {
217  if (topic.length() > 0)
218  {
219  full_grid_pub = nh.advertise<FullGridType>(topic, 1, new_subscription_callback);
220  if (publish_updates)
221  {
222  update_pub = nh.advertise<UpdateType>(topic + "_updates", 1);
223  }
224  }
225  }
226 
227  virtual nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time& timestamp) = 0;
228  virtual map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds& bounds,
229  const ros::Time& timestamp) = 0;
230 
231  bool shouldPublishHelper(const ros::Time& last_publish, const ros::Duration& cycle) const
232  {
233  double cycle_secs = cycle.toSec();
234  if (cycle_secs < 0.0)
235  {
236  return false;
237  }
238  else if (cycle_secs == 0.0)
239  {
240  return true;
241  }
242  else
243  {
244  return last_publish + cycle < ros::Time::now();
245  }
246  }
247 
248  inline bool shouldPublishFull() const
249  {
251  }
252 
253  inline bool shouldPublishUpdate() const
254  {
256  }
257 
259  {
260  if (update_area_pub_.getNumSubscribers() == 0) return;
261 
262  geometry_msgs::PolygonStamped polygon;
263  polygon.header.frame_id = info.frame_id;
264  polygon.header.stamp = synced_time_stamp_;
265 
266  if (!bounds.isEmpty())
267  {
268  polygon.polygon.points.push_back(makePoint(info, bounds.getMinX(), bounds.getMinY()));
269  polygon.polygon.points.push_back(makePoint(info, bounds.getMaxX(), bounds.getMinY()));
270  polygon.polygon.points.push_back(makePoint(info, bounds.getMaxX(), bounds.getMaxY()));
271  polygon.polygon.points.push_back(makePoint(info, bounds.getMinX(), bounds.getMaxY()));
272  }
273  update_area_pub_.publish(polygon);
274  }
275 
277  {
279  }
280 
282  {
284  }
285 
286  void publishNav()
287  {
288  if (nav_pub_.getNumSubscribers() == 0) return;
290  }
291 
292  void publishOcc()
293  {
294  if (occ_pub_.getNumSubscribers() == 0) return;
296  }
297 
299  {
300  if (nav_update_pub_.getNumSubscribers() == 0) return;
302  }
303 
305  {
306  if (occ_update_pub_.getNumSubscribers() == 0) return;
308  }
309 
310  // Data
314 
315  // Track time
318 
319  // Track Update Bounds
321 
322  // Publishers
326 };
327 
335  : public GenericGridPublisher<unsigned char, nav_2d_msgs::NavGridOfChars, nav_2d_msgs::NavGridOfCharsUpdate>
336 {
337 public:
340 
341  void setCostInterpretation(const std::vector<unsigned char>& cost_interpretation_table)
342  {
343  cost_interpretation_table_ = cost_interpretation_table;
344  }
345 protected:
346  nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time& timestamp) override
347  {
349  }
350 
351  map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds& bounds,
352  const ros::Time& timestamp) override
353  {
355  }
356  std::vector<unsigned char> cost_interpretation_table_ { OCC_GRID_PUBLISHING };
357 };
358 
363 template<typename NumericType>
365  : public GenericGridPublisher<NumericType, nav_2d_msgs::NavGridOfDoubles, nav_2d_msgs::NavGridOfDoublesUpdate>
366 {
367 public:
370 
371  void setIgnoreValue(NumericType ignore_value) { ignore_value_ = ignore_value; }
372 
373 protected:
374  nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time& timestamp) override
375  {
378  }
379 
380  map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds& bounds,
381  const ros::Time& timestamp) override
382  {
384  }
385 
386  NumericType ignore_value_ { std::numeric_limits<NumericType>::max() };
387  NumericType min_val_, max_val_;
388 };
389 
390 
391 } // namespace nav_grid_pub_sub
392 
393 #endif // NAV_GRID_PUB_SUB_NAV_GRID_PUBLISHER_H
nav_grid_pub_sub::toOccupancyGrid
nav_msgs::OccupancyGrid toOccupancyGrid(const nav_grid::NavGrid< unsigned char > &grid, const ros::Time &stamp=ros::Time(0), const std::vector< unsigned char > cost_interpretation_table=std::vector< unsigned char >())
NavGrid<unsigned char> to OccupancyGrid using cost_interpretation_table.
Definition: occ_grid_message_utils.h:56
GenericBounds< unsigned int >::getMinY
unsigned int getMinY() const
nav_grid_pub_sub::GenericGridPublisher::occ_update_pub_
ros::Publisher occ_update_pub_
Definition: nav_grid_publisher.h:324
GenericBounds< unsigned int >::isEmpty
bool isEmpty() const
nav_grid_pub_sub::ScaleGridPublisher::max_val_
NumericType max_val_
Definition: nav_grid_publisher.h:387
ros::Publisher
nav_grid_pub_sub::GenericGridPublisher::publishNavUpdate
void publishNavUpdate(const nav_core2::UIntBounds &bounds)
Definition: nav_grid_publisher.h:298
cost_interpretation.h
nav_grid_pub_sub::GenericGridPublisher::shouldPublishUpdate
bool shouldPublishUpdate() const
Definition: nav_grid_publisher.h:253
nav_grid_pub_sub::getExtremeValues
void getExtremeValues(const nav_grid::NavGrid< NumericType > &grid, const NumericType unknown_value, NumericType &min_val, NumericType &max_val)
Retrieve the minimum and maximum values from a grid, ignoring the unknown_value.
Definition: occ_grid_message_utils.h:138
nav_grid_pub_sub::GenericGridPublisher::last_full_publish_
ros::Time last_full_publish_
Definition: nav_grid_publisher.h:317
GenericBounds< unsigned int >::reset
void reset()
nav_grid_pub_sub::OCC_GRID_PUBLISHING
static std::vector< unsigned char > OCC_GRID_PUBLISHING
Scale [0, 255] down to [0, 100] (except for a few special values)
Definition: cost_interpretation_tables.h:97
nav_grid_pub_sub::GenericGridPublisher::onNewSubscriptionNav
void onNewSubscriptionNav(const ros::SingleSubscriberPublisher &pub)
Definition: nav_grid_publisher.h:276
ros.h
nav_grid_pub_sub::GenericGridPublisher::publishUpdateArea
void publishUpdateArea(const nav_grid::NavGridInfo &info, const nav_core2::UIntBounds &bounds)
Definition: nav_grid_publisher.h:258
nav_grid::NavGrid::getInfo
NavGridInfo getInfo() const
nav_grid::NavGrid< NumericType >
ros::SingleSubscriberPublisher::publish
void publish(const boost::shared_ptr< M > &message) const
nav_grid_pub_sub::makePoint
geometry_msgs::Point32 makePoint(const nav_grid::NavGridInfo &info, int x, int y)
Definition: nav_grid_publisher.h:54
nav_grid_pub_sub::GenericGridPublisher
An interface for publishing NavGridOfX/OccupancyGrid msgs and their updates periodically.
Definition: nav_grid_publisher.h:106
nav_grid_pub_sub::ScaleGridPublisher::toOccupancyGrid
nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time &timestamp) override
Definition: nav_grid_publisher.h:374
nav_grid_pub_sub::GenericGridPublisher::update_bounds_
nav_core2::UIntBounds update_bounds_
Definition: nav_grid_publisher.h:320
nav_grid.h
ros::Publisher::publish
void publish(const boost::shared_ptr< M > &message) const
nav_grid_pub_sub
Definition: cost_interpretation.h:42
nav_grid_pub_sub::ScaleGridPublisher
An interface for publishing NavGridOfDoubles/OccupancyGrid msgs and their updates periodically.
Definition: nav_grid_publisher.h:364
ros::NodeHandle::advertise
Publisher advertise(AdvertiseOptions &ops)
bounds.h
nav_grid_pub_sub::ScaleGridPublisher::ignore_value_
NumericType ignore_value_
Definition: nav_grid_publisher.h:386
nav_grid_pub_sub::GenericGridPublisher::createPublishers
void createPublishers(ros::NodeHandle &nh, const std::string &topic, Callback new_subscription_callback, ros::Publisher &full_grid_pub, ros::Publisher &update_pub, bool publish_updates)
Definition: nav_grid_publisher.h:214
nav_grid_pub_sub::GenericGridPublisher::shouldPublishHelper
bool shouldPublishHelper(const ros::Time &last_publish, const ros::Duration &cycle) const
Definition: nav_grid_publisher.h:231
nav_grid_pub_sub::GenericGridPublisher::init
void init(ros::NodeHandle &nh, const std::string &nav_grid_topic="grid", const std::string &occupancy_grid_topic="costmap", const std::string &update_area_topic="update_area", bool publish_updates=true, ros::Duration full_publish_cycle=ros::Duration(0), ros::Duration update_publish_cycle=ros::Duration(0))
Initialize method for determining what gets published when.
Definition: nav_grid_publisher.h:127
ros::SingleSubscriberPublisher
nav_grid_pub_sub::GenericGridPublisher::full_publish_cycle_
ros::Duration full_publish_cycle_
Definition: nav_grid_publisher.h:316
nav_grid_pub_sub::GenericGridPublisher::last_update_publish_
ros::Time last_update_publish_
Definition: nav_grid_publisher.h:317
gridToWorld
void gridToWorld(const NavGridInfo &info, int mx, int my, double &wx, double &wy)
nav_grid_pub_sub::NavGridPublisher::toOccupancyGridUpdate
map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds &bounds, const ros::Time &timestamp) override
Definition: nav_grid_publisher.h:351
nav_grid_pub_sub::ScaleGridPublisher::toOccupancyGridUpdate
map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds &bounds, const ros::Time &timestamp) override
Definition: nav_grid_publisher.h:380
nav_grid_pub_sub::NavGridPublisher::setCostInterpretation
void setCostInterpretation(const std::vector< unsigned char > &cost_interpretation_table)
Definition: nav_grid_publisher.h:341
nav_grid_pub_sub::GenericGridPublisher::nav_update_pub_
ros::Publisher nav_update_pub_
Definition: nav_grid_publisher.h:323
nav_grid_pub_sub::GenericGridPublisher::onNewSubscriptionOcc
void onNewSubscriptionOcc(const ros::SingleSubscriberPublisher &pub)
Definition: nav_grid_publisher.h:281
nav_grid_pub_sub::GenericGridPublisher::toOccupancyGridUpdate
virtual map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_core2::UIntBounds &bounds, const ros::Time &timestamp)=0
GenericBounds< unsigned int >::getMinX
unsigned int getMinX() const
nav_grid_pub_sub::GenericGridPublisher::occ_pub_
ros::Publisher occ_pub_
Definition: nav_grid_publisher.h:324
nav_grid_message_utils.h
nav_grid_pub_sub::GenericGridPublisher::data_
nav_grid::NavGrid< NumericType > & data_
Definition: nav_grid_publisher.h:311
nav_grid_pub_sub::GenericGridPublisher::GenericGridPublisher
GenericGridPublisher(nav_grid::NavGrid< NumericType > &data)
Definition: nav_grid_publisher.h:109
nav_grid::NavGridInfo::frame_id
std::string frame_id
GenericBounds< unsigned int >::getMaxX
unsigned int getMaxX() const
GenericBounds< unsigned int >::getMaxY
unsigned int getMaxY() const
nav_grid_pub_sub::ScaleGridPublisher::min_val_
NumericType min_val_
Definition: nav_grid_publisher.h:387
nav_grid::NavGridInfo
nav_grid_pub_sub::GenericGridPublisher::publishOccUpdate
void publishOccUpdate(const nav_core2::UIntBounds &bounds)
Definition: nav_grid_publisher.h:304
nav_grid_pub_sub::GenericGridPublisher::toOccupancyGrid
virtual nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time &timestamp)=0
coordinate_conversion.h
nav_grid_pub_sub::NavGridPublisher::toOccupancyGrid
nav_msgs::OccupancyGrid toOccupancyGrid(const ros::Time &timestamp) override
Definition: nav_grid_publisher.h:346
nav_grid_pub_sub::GenericGridPublisher::publishOcc
void publishOcc()
Definition: nav_grid_publisher.h:292
ros::Time
nav_grid_pub_sub::GenericGridPublisher::synced_time_stamp_
ros::Time synced_time_stamp_
Definition: nav_grid_publisher.h:317
nav_grid_pub_sub::GenericGridPublisher::update_area_pub_
ros::Publisher update_area_pub_
Definition: nav_grid_publisher.h:325
nav_grid_pub_sub::GenericGridPublisher::saved_info_
nav_grid::NavGridInfo saved_info_
Definition: nav_grid_publisher.h:312
nav_grid_pub_sub::toUpdate
ROSMsgType toUpdate(const nav_grid::NavGrid< NumericType > &grid, const nav_core2::UIntBounds &bounds, const ros::Time &stamp)
Generic conversion from a portion of a grid of arbitrary type to an update message of arbitrary type.
Definition: nav_grid_message_utils.h:82
nav_grid_pub_sub::toMsg
ROSMsgType toMsg(const nav_grid::NavGrid< NumericType > &grid, const ros::Time &stamp)
Utilities for converting NavGrid objects to NavGridOfX messages and updates.
Definition: nav_grid_message_utils.h:59
ros::Publisher::getNumSubscribers
uint32_t getNumSubscribers() const
DurationBase< Duration >::toSec
double toSec() const
nav_grid_pub_sub::GenericGridPublisher::publish
void publish(const nav_core2::UIntBounds &bounds)
Publish the full grid or updates, as dictated by parameters passed to init.
Definition: nav_grid_publisher.h:174
nav_grid_pub_sub::NavGridPublisher
An interface for publishing NavGridOfChars/OccupancyGrid msgs and their updates periodically.
Definition: nav_grid_publisher.h:334
cost_interpretation_tables.h
nav_grid_pub_sub::GenericGridPublisher::publish_updates_
bool publish_updates_
Definition: nav_grid_publisher.h:313
nav_grid_pub_sub::GenericGridPublisher::update_publish_cycle_
ros::Duration update_publish_cycle_
Definition: nav_grid_publisher.h:316
nav_grid_pub_sub::GenericGridPublisher::shouldPublishFull
bool shouldPublishFull() const
Definition: nav_grid_publisher.h:248
occ_grid_message_utils.h
ros::Duration
nav_grid_pub_sub::GenericGridPublisher::publish
void publish()
Publish the full grid if the full_publish_cycle allows.
Definition: nav_grid_publisher.h:158
nav_grid_pub_sub::GenericGridPublisher::publishNav
void publishNav()
Definition: nav_grid_publisher.h:286
GenericBounds< unsigned int >::merge
void merge(const GenericBounds< unsigned int > &other)
nav_core2::UIntBounds
nav_grid_pub_sub::NavGridPublisher::cost_interpretation_table_
std::vector< unsigned char > cost_interpretation_table_
Definition: nav_grid_publisher.h:356
nav_grid_pub_sub::GenericGridPublisher::nav_pub_
ros::Publisher nav_pub_
Definition: nav_grid_publisher.h:323
nav_grid_pub_sub::ScaleGridPublisher::setIgnoreValue
void setIgnoreValue(NumericType ignore_value)
Definition: nav_grid_publisher.h:371
nav_grid_pub_sub::toOccupancyGridUpdate
map_msgs::OccupancyGridUpdate toOccupancyGridUpdate(const nav_grid::NavGrid< unsigned char > &grid, const nav_core2::UIntBounds &bounds, const ros::Time &stamp=ros::Time(0), const std::vector< unsigned char > cost_interpretation_table=std::vector< unsigned char >())
NavGrid<unsigned char> to OccupancyGridUpdate using cost_interpretation_table.
Definition: occ_grid_message_utils.h:78
ros::NodeHandle
ros::Time::now
static Time now()


nav_grid_pub_sub
Author(s):
autogenerated on Sun May 18 2025 02:47:41