178 lines
5.2 KiB
C++
Executable File
178 lines
5.2 KiB
C++
Executable File
/*********************************************************************
|
|
*
|
|
* Software License Agreement (BSD License)
|
|
*
|
|
* Copyright (c) 2008, 2013, Willow Garage, Inc.
|
|
* 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 Willow Garage, Inc. 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 OWNER 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.
|
|
*
|
|
* Author: Eitan Marder-Eppstein
|
|
* David V. Lu!!
|
|
*********************************************************************/
|
|
#ifndef ROBOT_COSTMAP_2D_LAYERED_COSTMAP_H_
|
|
#define ROBOT_COSTMAP_2D_LAYERED_COSTMAP_H_
|
|
|
|
#include <robot_costmap_2d/cost_values.h>
|
|
#include <robot_costmap_2d/layer.h>
|
|
#include <robot_costmap_2d/costmap_2d.h>
|
|
#include <vector>
|
|
#include <string>
|
|
|
|
namespace robot_costmap_2d
|
|
{
|
|
class Layer;
|
|
|
|
/**
|
|
* @class LayeredCostmap
|
|
* @brief Instantiates different layer plugins and aggregates them into one score
|
|
*/
|
|
class LayeredCostmap
|
|
{
|
|
public:
|
|
/**
|
|
* @brief Constructor for a costmap
|
|
*/
|
|
LayeredCostmap(std::string global_frame, bool rolling_window, bool track_unknown);
|
|
|
|
/**
|
|
* @brief Destructor
|
|
*/
|
|
~LayeredCostmap();
|
|
|
|
/**
|
|
* @brief Update the underlying costmap with new data.
|
|
* If you want to update the map outside of the update loop that runs, you can call this.
|
|
*/
|
|
void updateMap(double robot_x, double robot_y, double robot_yaw);
|
|
|
|
inline const std::string& getGlobalFrameID() const noexcept
|
|
{
|
|
return global_frame_;
|
|
}
|
|
|
|
void resizeMap(unsigned int size_x, unsigned int size_y, double resolution, double origin_x, double origin_y,
|
|
bool size_locked = false);
|
|
|
|
void getUpdatedBounds(double& minx, double& miny, double& maxx, double& maxy)
|
|
{
|
|
minx = minx_;
|
|
miny = miny_;
|
|
maxx = maxx_;
|
|
maxy = maxy_;
|
|
}
|
|
|
|
bool isCurrent();
|
|
|
|
Costmap2D* getCostmap()
|
|
{
|
|
return &costmap_;
|
|
}
|
|
|
|
bool isRolling()
|
|
{
|
|
return rolling_window_;
|
|
}
|
|
|
|
bool isTrackingUnknown()
|
|
{
|
|
return costmap_.getDefaultValue() == robot_costmap_2d::NO_INFORMATION;
|
|
}
|
|
|
|
std::vector<boost::shared_ptr<Layer> >* getPlugins()
|
|
{
|
|
return &plugins_;
|
|
}
|
|
|
|
void addPlugin(boost::shared_ptr<Layer> plugin)
|
|
{
|
|
plugins_.push_back(plugin);
|
|
}
|
|
|
|
bool isSizeLocked()
|
|
{
|
|
return size_locked_;
|
|
}
|
|
|
|
void getBounds(unsigned int* x0, unsigned int* xn, unsigned int* y0, unsigned int* yn)
|
|
{
|
|
*x0 = bx0_;
|
|
*xn = bxn_;
|
|
*y0 = by0_;
|
|
*yn = byn_;
|
|
}
|
|
|
|
bool isInitialized()
|
|
{
|
|
return initialized_;
|
|
}
|
|
|
|
/** @brief Updates the stored footprint, updates the circumscribed
|
|
* and inscribed radii, and calls onFootprintChanged() in all
|
|
* layers. */
|
|
void setFootprint(const std::vector<robot_geometry_msgs::Point>& footprint_spec);
|
|
|
|
/** @brief Returns the latest footprint stored with setFootprint(). */
|
|
const std::vector<robot_geometry_msgs::Point>& getFootprint() { return footprint_; }
|
|
|
|
/** @brief The radius of a circle centered at the origin of the
|
|
* robot which just surrounds all points on the robot's
|
|
* footprint.
|
|
*
|
|
* This is updated by setFootprint(). */
|
|
double getCircumscribedRadius() { return circumscribed_radius_; }
|
|
|
|
/** @brief The radius of a circle centered at the origin of the
|
|
* robot which is just within all points and edges of the robot's
|
|
* footprint.
|
|
*
|
|
* This is updated by setFootprint(). */
|
|
double getInscribedRadius() { return inscribed_radius_; }
|
|
|
|
private:
|
|
Costmap2D costmap_;
|
|
std::string global_frame_;
|
|
|
|
bool rolling_window_; /// < @brief Whether or not the costmap should roll with the robot
|
|
|
|
bool current_;
|
|
double minx_, miny_, maxx_, maxy_;
|
|
unsigned int bx0_, bxn_, by0_, byn_;
|
|
|
|
std::vector<boost::shared_ptr<Layer> > plugins_;
|
|
|
|
bool initialized_;
|
|
bool size_locked_;
|
|
double circumscribed_radius_, inscribed_radius_;
|
|
std::vector<robot_geometry_msgs::Point> footprint_;
|
|
};
|
|
|
|
} // namespace robot_costmap_2d
|
|
|
|
#endif // ROBOT_COSTMAP_2D_LAYERED_COSTMAP_H_
|