49 s->range = scan.ranges[ind];
50 s->x = cos(scan.angle_min + ind * scan.angle_increment) *
s->range;
51 s->y = sin(scan.angle_min + ind * scan.angle_increment) *
s->range;
52 if (
s->range > scan.range_min &&
s->range < scan.range_max)
63 for (SampleSet::iterator i = begin();
69 set<Sample*, CompareSample>::clear();
76 int rgb = (r << 16) | (g << 8) | b;
77 color_val = *(
float*) & (rgb);
79 for (iterator sample_iter = begin();
83 geometry_msgs::Point32 point;
84 point.x = (*sample_iter)->x;
85 point.y = (*sample_iter)->y;
88 cloud.points.push_back(point);
90 if (cloud.channels[0].name ==
"rgb")
91 cloud.channels[0].values.push_back(color_val);
99 for (iterator i = begin();
104 x_mean += ((*i)->x) / size();
105 y_mean += ((*i)->y) / size();
118 size = scan.ranges.size();
123 size != scan.ranges.size())
125 throw std::runtime_error(
"laser_scan::ScanMask::addScan: inconsistantly sized scans added to mask");
128 for (uint32_t i = 0; i < scan.ranges.size(); i++)
134 SampleSet::iterator m =
mask_.find(
s);
136 if (m !=
mask_.end())
138 if ((*m)->range >
s->range)
162 SampleSet::iterator m =
mask_.find(s);
163 if (m !=
mask_.end())
164 if (((*m)->range - thresh) <
s->range)
176 SampleSet* cluster =
new SampleSet;
178 for (uint32_t i = 0; i < scan.ranges.size(); i++)
184 if (!mask_.hasSample(s, mask_threshold))
200 for (std::list<SampleSet*>::iterator c =
clusters_.begin();
209 std::list<SampleSet*>::iterator c_iter =
clusters_.begin();
212 if ((*c_iter)->size() < num)
228 std::list<SampleSet*> tmp_clusters;
230 std::list<SampleSet*>::iterator c_iter =
clusters_.begin();
236 while ((*c_iter)->size() > 0)
239 SampleSet::iterator s_first = (*c_iter)->begin();
242 std::list<Sample*> sample_queue;
243 sample_queue.push_back(*s_first);
245 (*c_iter)->erase(s_first);
248 std::list<Sample*>::iterator s_q = sample_queue.begin();
249 while (s_q != sample_queue.end())
251 int expand =
static_cast<int>(asin(thresh / (*s_q)->range) / std::abs(
scan_.angle_increment));
253 SampleSet::iterator s_rest = (*c_iter)->begin();
255 while ((s_rest != (*c_iter)->end() &&
256 (*s_rest)->index < (*s_q)->index + expand))
258 if ((*s_rest)->range - (*s_q)->range > thresh)
262 else if (sqrt(pow((*s_q)->x - (*s_rest)->x, 2.0f) + pow((*s_q)->y - (*s_rest)->y, 2.0f)) < thresh)
264 sample_queue.push_back(*s_rest);
265 (*c_iter)->erase(s_rest++);
277 SampleSet* c =
new SampleSet;
278 for (s_q = sample_queue.begin(); s_q != sample_queue.end(); s_q++)
282 tmp_clusters.push_back(c);