Skip to content

Commit 103fe1e

Browse files
authored
Merge pull request #75 from AutoModality/AM-706/uam_canyon
fix: fixed uninit var bug in dust_filter.
2 parents bb44089 + fc8cf3d commit 103fe1e

File tree

4 files changed

+34
-33
lines changed

4 files changed

+34
-33
lines changed

include/am_utils/am_pcl_utils.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ class AMPCLUtils
1414
static pcl::PointCloud<pcl::PointXYZIR>::ConstPtr convertToPointXYZIR(
1515
const sensor_msgs::PointCloud2::ConstPtr pc2,
1616
pcl::PointCloud<pcl::PointXYZIR>::Ptr &pcl);
17+
static bool isSetToNaN(pcl::PointXYZIR &point);
18+
static void setNaN(pcl::PointXYZIR &point);
1719
};
1820

1921
}

include/am_utils/dust_filter.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,14 @@ class DustFilter
3434
float outside_min_z_m_;
3535
float outside_max_z_m_;
3636

37-
bool isSetToNaN(pcl::PointXYZIR &point);
38-
void setNaN(pcl::PointXYZIR &point);
3937
void printInsideParams();
4038
void printOutsideParams();
4139

4240
public:
4341
DustFilter(ros::NodeHandle &nh, std::string name_space);
4442
~DustFilter();
4543

46-
int process(pcl::PointCloud<pcl::PointXYZIR> &pc);
44+
int process(pcl::PointCloud<pcl::PointXYZIR> &pc, bool skip_dust_filter = false);
4745
void getParams();
4846
void setInsideFilter(float min_x_m_, float max_x_m_, float min_y_m_, float max_y_m_, float min_z_m_, float max_z_m_);
4947
void setOutsideFilter(float min_x_m_, float max_x_m_, float min_y_m_, float max_y_m_, float min_z_m_, float max_z_m_);

src/am_utils/am_pcl_utils.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,25 @@ pcl::PointCloud<pcl::PointXYZIR>::ConstPtr AMPCLUtils::convertToPointXYZIR(
3131
return pcl;
3232
}
3333

34+
bool AMPCLUtils::isSetToNaN(pcl::PointXYZIR &point)
35+
{
36+
if (std::isnan(point.x) || std::isnan(point.y) || std::isnan(point.z) ||
37+
std::isnan(point.intensity) || std::isnan(point.intensity))
38+
{
39+
setNaN(point);
40+
return true;
41+
}
42+
return false;
43+
}
44+
45+
void AMPCLUtils::setNaN(pcl::PointXYZIR &point)
46+
{
47+
point.x = std::nanf("");
48+
point.y = std::nanf("");
49+
point.z = std::nanf("");
50+
point.intensity = std::nanf("");
51+
point.range = std::nanf("");
52+
}
53+
3454
} // namespace
3555

src/am_utils/dust_filter.cpp

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include <pcl_conversions/pcl_conversions.h>
44
#include <pcl_ros/point_cloud.h>
55

6+
#include <am_utils/am_pcl_utils.h>
67
#include <am_utils/dust_filter.h>
78
#include <am_utils/point_types.h>
89
#include <vb_util_lib/frame_names.h>
@@ -33,10 +34,10 @@ void DustFilter::getParams()
3334
nh_.param<float>(name_space_ + "/range_threshold_m", range_threshold_m_, DEFAULT_RANGE_THRESHHOLD_M);
3435
nh_.param<int>(name_space_ + "/min_neighbors", min_neighbors_, DEFAULT_MIN_NEIGHBORS);
3536
nh_.param<float>(name_space_ + "/max_range_m", max_range_m_, DEFAULT_MAX_RANGE_M);
36-
nh_.param<float>(name_space_ + "/inside_min_x_m", inside_min_x_m_, -0.5);
37-
nh_.param<float>(name_space_ + "/inside_max_x_m", inside_max_x_m_, 0.5);
38-
nh_.param<float>(name_space_ + "/inside_min_y_m", inside_min_y_m_, -0.5);
39-
nh_.param<float>(name_space_ + "/inside_max_y_m", inside_max_y_m_, 0.5);
37+
nh_.param<float>(name_space_ + "/inside_min_x_m", inside_min_x_m_, -0.7);
38+
nh_.param<float>(name_space_ + "/inside_max_x_m", inside_max_x_m_, 0.7);
39+
nh_.param<float>(name_space_ + "/inside_min_y_m", inside_min_y_m_, -0.7);
40+
nh_.param<float>(name_space_ + "/inside_max_y_m", inside_max_y_m_, 0.7);
4041
nh_.param<float>(name_space_ + "/inside_min_z_m", inside_min_z_m_, -0.5);
4142
nh_.param<float>(name_space_ + "/inside_max_z_m", inside_max_z_m_, 0.5);
4243
nh_.param<float>(name_space_ + "/outside_min_x_m", outside_min_x_m_, std::numeric_limits<float>::lowest());
@@ -59,7 +60,7 @@ void DustFilter::getParams()
5960

6061
void DustFilter::printInsideParams()
6162
{
62-
ROS_INFO_STREAM(name_space_ + "/inside_max_x_m = " << inside_max_x_m_);
63+
ROS_INFO_STREAM(name_space_ + "/inside_min_x_m = " << inside_min_x_m_);
6364
ROS_INFO_STREAM(name_space_ + "/inside_max_x_m = " << inside_max_x_m_);
6465
ROS_INFO_STREAM(name_space_ + "/inside_min_y_m = " << inside_min_y_m_);
6566
ROS_INFO_STREAM(name_space_ + "/inside_max_y_m = " << inside_max_y_m_);
@@ -77,27 +78,27 @@ void DustFilter::printOutsideParams()
7778
ROS_INFO_STREAM(name_space_ + "/outside_max_z_m = " << outside_max_z_m_);
7879
}
7980

80-
int DustFilter::process(pcl::PointCloud<pcl::PointXYZIR> &pcl)
81+
int DustFilter::process(pcl::PointCloud<pcl::PointXYZIR> &pcl, bool skip_dust_filter)
8182
{
82-
bool nan_mask[pcl.width * pcl.width];
83+
bool nan_mask[pcl.width * pcl.height];
8384

8485
bool is_dense = pcl.is_dense;
8586
for (uint32_t width = 0; width < pcl.width; width++)
8687
{
8788
for (uint32_t height = 0; height < pcl.height; height++)
8889
{
8990
int index = width * pcl.height + height;
91+
nan_mask[index] = false;
9092
pcl::PointXYZIR &point = pcl.points[index];
9193

9294
// if already nan, continue
93-
if(isSetToNaN(point))
95+
if(AMPCLUtils::isSetToNaN(point))
9496
{
9597
nan_mask[index] = true;
9698
continue;
9799
}
98100

99101
// if beyond the max range, don't filter dust
100-
bool skip_dust_filter = false;
101102
if(point.range > max_range_m_)
102103
{
103104
skip_dust_filter = true;
@@ -175,7 +176,7 @@ int DustFilter::process(pcl::PointCloud<pcl::PointXYZIR> &pcl)
175176
pcl::PointXYZIR &point = pcl.points[index];
176177
if(nan_mask[index])
177178
{
178-
setNaN(point);
179+
AMPCLUtils::setNaN(point);
179180
points_removed++;
180181
is_dense = false;
181182
}
@@ -192,26 +193,6 @@ int DustFilter::process(pcl::PointCloud<pcl::PointXYZIR> &pcl)
192193
return points_removed;
193194
}
194195

195-
bool DustFilter::isSetToNaN(pcl::PointXYZIR &point)
196-
{
197-
if (std::isnan(point.x) || std::isnan(point.y) || std::isnan(point.z) ||
198-
std::isnan(point.intensity) || std::isnan(point.intensity))
199-
{
200-
setNaN(point);
201-
return true;
202-
}
203-
return false;
204-
}
205-
206-
void DustFilter::setNaN(pcl::PointXYZIR &point)
207-
{
208-
point.x = std::nanf("");
209-
point.y = std::nanf("");
210-
point.z = std::nanf("");
211-
point.intensity = std::nanf("");
212-
point.range = std::nanf("");
213-
}
214-
215196
void DustFilter::setInsideFilter(float min_x_m_, float max_x_m_, float min_y_m_, float max_y_m_, float min_z_m_, float max_z_m_)
216197
{
217198
inside_min_x_m_ = min_x_m_;

0 commit comments

Comments
 (0)