/* * Software License Agreement (BSD License) * * Copyright (c) 2018, Locus Robotics * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided * with the distribution. * * Neither the name of the copyright holder nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include template class InfiniteIterator { public: InfiniteIterator(Iterator it, unsigned char active_value, unsigned char seen_value) : it_(it), active_(active_value), seen_(seen_value) { } void iterate(nav_grid::NavGrid& grid) { // Note that this demo assumes that each iterator has at least one point on the grid grid.setValue(*it_, seen_); ++it_; if (it_ == it_.end()) { it_ = it_.begin(); } grid.setValue(*it_, active_); } private: Iterator it_; unsigned char active_, seen_; }; int main(int argc, char** argv) { ros::init(argc, argv, "iterator_demo"); nav_grid::VectorNavGrid grid; nav_grid::NavGridInfo info; sleep(5.0); info.width = 75; info.height = 60; info.resolution = 0.1; grid.setInfo(info); ros::NodeHandle nh("~"); ros::Publisher pub = nh.advertise("/map", 1); ros::Rate r(33); nav_2d_msgs::Polygon2D triangle; triangle.points.resize(3); triangle.points[0].x = 1.9; triangle.points[0].y = 0.5; triangle.points[1].x = 3.5; triangle.points[1].y = 1.0; triangle.points[2].x = 2.0; triangle.points[2].y = 2.4; nav_2d_msgs::Polygon2D diamond; diamond.points.resize(4); diamond.points[0].x = 4.5; diamond.points[0].y = 0.0; diamond.points[1].x = 5.3; diamond.points[1].y = 1.25; diamond.points[2].x = 4.5; diamond.points[2].y = 2.5; diamond.points[3].x = 3.7; diamond.points[3].y = 1.25; nav_2d_msgs::Polygon2D diamond2; diamond2.points.resize(4); diamond2.points[0].x = 6.5; diamond2.points[0].y = 0.0; diamond2.points[1].x = 7.3; diamond2.points[1].y = 1.25; diamond2.points[2].x = 6.5; diamond2.points[2].y = 2.5; diamond2.points[3].x = 5.7; diamond2.points[3].y = 1.25; InfiniteIterator whole_grid(nav_grid_iterators::WholeGrid(&info), 100, 50); InfiniteIterator sub_grid(nav_grid_iterators::SubGrid(&info, 3, 5, 14, 15), 99, 101); InfiniteIterator line(nav_grid_iterators::Line(&info, 7.3, 2.8, 0.2, 2.5), 126, 200); InfiniteIterator line2(nav_grid_iterators::Line(&info, 7.3, 3.3, 0.2, 3.0, true, false), 126, 200); InfiniteIterator circle_fill(nav_grid_iterators::CircleFill(&info, 1.25, 4.8, 1.0), 254, 255); InfiniteIterator spiral(nav_grid_iterators::Spiral(&info, 3.75, 4.8, 1.0), 254, 126); InfiniteIterator circle_o(nav_grid_iterators::CircleOutline(&info, 6.25, 4.8, 1.0), 254, 99); InfiniteIterator poly_f(nav_grid_iterators::PolygonFill(&info, triangle), 126, 254); InfiniteIterator poly_o(nav_grid_iterators::PolygonOutline(&info, diamond), 0, 1); InfiniteIterator poly_r(nav_grid_iterators::PolygonOutline(&info, diamond2, 0), 0, 1); nav_msgs::OccupancyGrid ogrid; ogrid.header.frame_id = info.frame_id; ogrid.info = nav_2d_utils::infoToInfo(info); ogrid.data.resize(info.width * info.height); while (ros::ok()) { whole_grid.iterate(grid); sub_grid.iterate(grid); line.iterate(grid); line2.iterate(grid); circle_fill.iterate(grid); spiral.iterate(grid); circle_o.iterate(grid); poly_f.iterate(grid); poly_o.iterate(grid); poly_r.iterate(grid); // Manaully creating OccupancyGrid (rather than use nav_grid_pub_sub) to avoid circular dependency ogrid.header.stamp = ros::Time::now(); unsigned int data_index = 0; for (const nav_grid::Index& index : nav_grid_iterators::WholeGrid(info)) { ogrid.data[data_index++] = grid(index); } pub.publish(ogrid); r.sleep(); } return 0; }