7 #pragma GCC diagnostic push 8 #pragma GCC diagnostic ignored "-Wpedantic" 9 #pragma GCC diagnostic ignored "-Wformat" 10 #include <filters/filter_chain.hpp> 11 #pragma GCC diagnostic pop 33 double& directionalErrorRasterSum);
66 int main(
int argc,
char** argv) {
68 ros::init(argc, argv,
"normal_filter_comparison_demo");
77 std::string filterChainParametersName_;
78 nh.
param(
"filter_chain_parameter_name", filterChainParametersName_, std::string(
"grid_map_filters"));
82 nh.
param(
"noise_on_map", noise_on_map, 0.015);
83 ROS_INFO(
"noise_on_map = %f", noise_on_map);
85 double outliers_percentage;
87 nh.
param(
"outliers_percentage", outliers_percentage, 0.0);
88 ROS_INFO(
"outliers_percentage = %f", outliers_percentage);
91 if (!filterChain_.
configure(filterChainParametersName_, nh)) {
92 ROS_ERROR(
"Could not configure the filter chain!");
96 const double mapLength = 2.5;
97 const double mapWidth = 4.0;
98 const double mapResolution = 0.02;
101 grid_map::GridMap map({
"elevation",
"normal_analytic_x",
"normal_analytic_y",
"normal_analytic_z"});
105 ROS_INFO(
"Created map with size %f x %f m (%i x %i cells).\n The center of the map is located at (%f, %f) in the %s frame.",
106 map.getLength().x(), map.getLength().y(), map.getSize()(0), map.getSize()(1), map.getPosition().x(), map.getPosition().y(),
107 map.getFrameId().c_str());
110 double directionalErrorAreaSum = 0;
111 double directionalErrorRasterSum = 0;
114 const double surfaceSpeed = 0.5;
115 const double surfaceSlope = 0.2;
116 const double surfaceBias = -0.04;
117 const double wavePeriod = 5.0;
127 map.getPosition(*it, position);
128 map.at(
"elevation", *it) =
129 surfaceBias + surfaceSlope * std::sin(surfaceSpeed * time.
toSec() + wavePeriod * position.y()) * position.x();
132 grid_map::Vector3 normalAnalytic(-surfaceSlope * std::sin(surfaceSpeed * time.
toSec() + wavePeriod * position.y()),
133 -position.x() * std::cos(surfaceSpeed * time.
toSec() + wavePeriod * position.y()), 1.0);
134 normalAnalytic.normalize();
135 map.at(
"normal_analytic_x", *it) = normalAnalytic.x();
136 map.at(
"normal_analytic_y", *it) = normalAnalytic.y();
137 map.at(
"normal_analytic_z", *it) = normalAnalytic.z();
141 map.add(
"elevation_filtered", map.get(
"elevation"));
144 if (noise_on_map != 0.0) {
147 if (outliers_percentage != 0.0) {
150 if ((noise_on_map != 0.0) || (outliers_percentage != 0.0)) {
155 if (!filterChain_.
update(map, map)) {
156 ROS_ERROR(
"Could not update the grid map filter chain!");
162 ROS_INFO_THROTTLE(2.0,
"directionalErrorRaster = %f", directionalErrorRasterSum);
165 map.setTimestamp(time.
toNSec());
166 grid_map_msgs::GridMap message;
172 if ((end - begin) > 60) {
182 double& directionalErrorRasterSum) {
200 map.
add(
"directionalErrorArea", grid_map::Matrix::Zero(gridMapSize(0), gridMapSize(1)));
201 map.
add(
"directionalErrorRaster", grid_map::Matrix::Zero(gridMapSize(0), gridMapSize(1)));
205 const grid_map::Index submapBufferSize(gridMapSize(0) - 2, gridMapSize(1) - 2);
209 normalVectorAnalytic(0) = mapNormalAnalyticX(index(0), index(1));
210 normalVectorAnalytic(1) = mapNormalAnalyticY(index(0), index(1));
211 normalVectorAnalytic(2) = mapNormalAnalyticZ(index(0), index(1));
213 normalVectorArea(0) = mapNormalAreaX(index(0), index(1));
214 normalVectorArea(1) = mapNormalAreaY(index(0), index(1));
215 normalVectorArea(2) = mapNormalAreaZ(index(0), index(1));
217 normalVectorRaster(0) = mapNormalRasterX(index(0), index(1));
218 normalVectorRaster(1) = mapNormalRasterY(index(0), index(1));
219 normalVectorRaster(2) = mapNormalRasterZ(index(0), index(1));
223 map.
at(
"directionalErrorArea", *iterator) = 1.0 - std::abs(normalVectorAnalytic.dot(normalVectorArea));
224 map.
at(
"directionalErrorRaster", *iterator) = 1.0 - std::abs(normalVectorAnalytic.dot(normalVectorRaster));
228 const double directionalErrorArea = map[
"directionalErrorArea"].array().sum();
229 const double directionalErrorRaster = map[
"directionalErrorRaster"].array().sum();
232 directionalErrorAreaSum = (directionalErrorAreaSum * 19.0 + directionalErrorArea) / 20.0;
233 directionalErrorRasterSum = (directionalErrorRasterSum * 19.0 + directionalErrorRaster) / 20.0;
238 map.
add(
"noise", noise_on_map * Matrix::Random(gridMapSize(0), gridMapSize(1)));
239 map.
add(
"elevation_noisy", map.
get(
"elevation") + map[
"noise"]);
244 const double numberInfPoints = outlierPercentage * gridMapSize(0) * gridMapSize(1);
246 for (
int i = 0; i < static_cast<int>(numberInfPoints); ++i) {
249 map.
atPosition(
"elevation_noisy", randomPosition) = std::numeric_limits<float>::infinity();
262 double sumOfWeights = 0.0;
266 if (!map.
isValid(*circleIt,
"elevation_noisy")) {
270 map.
getPosition(*circleIt, currentPositionInCircle);
273 double distance = (currentPosition - currentPositionInCircle).norm();
274 double weight =
pow(filterRadius - distance, 2);
275 mean += weight * map.
at(
"elevation_noisy", *circleIt);
276 sumOfWeights += weight;
278 if (sumOfWeights!=0) {
279 map.
at(
"elevation_filtered", *it) = mean / sumOfWeights;
281 map.
at(
"elevation_filtered", *it) = std::numeric_limits<float>::infinity();
float & atPosition(const std::string &layer, const Position &position)
void publish(const boost::shared_ptr< M > &message) const
bool getPosition(const Index &index, Position &position) const
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
static void toMessage(const grid_map::GridMap &gridMap, grid_map_msgs::GridMap &message)
TFSIMD_FORCE_INLINE tfScalar distance(const Vector3 &v) const
int main(int argc, char **argv)
bool isValid(const Index &index) const
Node for comparing different normal filters performances.
bool isInside(const Position &position) const
void mapAverageFiltering(grid_map::GridMap &map, const grid_map::Size &gridMapSize, const double filterRadius)
const Matrix & get(const std::string &layer) const
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val) const
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
float & at(const std::string &layer, const Index &index)
INLINE Rall1d< T, V, S > pow(const Rall1d< T, V, S > &arg, double m)
void add(const std::string &layer, const double value=NAN)
void mapAddNoise(grid_map::GridMap &map, const grid_map::Size &gridMapSize, const double &noise_on_map)
void mapAddOutliers(grid_map::GridMap &map, const grid_map::Size &gridMapSize, const double outlierPercentage)
bool update(const T &data_in, T &data_out)
bool configure(std::string param_name, ros::NodeHandle node=ros::NodeHandle())
#define ROS_INFO_THROTTLE(rate,...)
void setFrameId(const std::string &frameId)
void normalsErrorCalculation(grid_map::GridMap &map, const grid_map::Size &gridMapSize, double &directionalErrorAreaSum, double &directionalErrorRasterSum)