40 #ifndef SPECKLE_FILTER_H
41 #define SPECKLE_FILTER_H
43 #include <dynamic_reconfigure/server.h>
45 #include <laser_filters/SpeckleFilterConfig.h>
46 #include <sensor_msgs/LaserScan.h>
55 virtual bool checkWindowValid(
const sensor_msgs::LaserScan& scan,
size_t idx,
size_t window,
double max_range_difference) = 0;
60 virtual bool checkWindowValid(
const sensor_msgs::LaserScan& scan,
size_t idx,
size_t window,
double max_range_difference)
62 const float& range = scan.ranges[idx];
68 size_t i_max = std::min(idx + window, scan.ranges.size());
70 const float& neighbor_range = scan.ranges[i];
71 if (neighbor_range != neighbor_range || fabs(neighbor_range - range) > max_range_difference) {
83 virtual bool checkWindowValid(
const sensor_msgs::LaserScan& scan,
size_t idx,
size_t window,
double max_distance)
85 int num_neighbors = 0;
86 const float& r1 = scan.ranges[idx];
91 for (
int y = -(
int)window; y < (int)window + 1 && num_neighbors < (
int)window; y++)
96 if (j < 0 || j >=
static_cast<int>(scan.ranges.size()) || idx == j || std::isnan(r2))
128 const float d = sqrt(
129 pow(r1,2) + pow(r2,2) -
130 (2 * r1 * r2 * cosf(y * scan.angle_increment)));
133 if (
d <= max_distance)
140 if (num_neighbors < window)
163 bool update(
const sensor_msgs::LaserScan& input_scan, sensor_msgs::LaserScan& output_scan);
166 std::shared_ptr<dynamic_reconfigure::Server<laser_filters::SpeckleFilterConfig>>
dyn_server_;
167 void reconfigureCB(laser_filters::SpeckleFilterConfig& config, uint32_t level);
170 SpeckleFilterConfig
config_ = SpeckleFilterConfig::__getDefault__();