13 #include <ros/console.h>
18 #include <opencv2/imgproc/imgproc.hpp>
20 #define MIN_N_POINTS_FITTING 3
35 int& num_model_points)
46 uint num_sensor_points = 0;
48 double total_error = 0;
49 for (
unsigned int i = 0; i < test_model_ranges.
size(); ++i)
51 double ds = sensor_ranges[i];
52 double dm = test_model_ranges[i];
65 double diff = std::abs(ds - dm);
79 return total_error / (num_sensor_points+1);
87 if (pose_cache.
find(ID) == pose_cache.
end())
89 pose_cache[ID] = old_pose;
93 old_pose = pose_cache[ID];
117 double x_window,
double x_step,
double y_window,
double y_step,
double yaw_min,
double yaw_plus,
double yaw_step,
std::map<ed::UUID, geo::Pose3D>& pose_cache)
123 double min_error = 1e6;
126 for(
double dyaw = yaw_min; dyaw <= yaw_plus; dyaw += yaw_step)
131 test_pose.
R = old_pose.
R * rot;
133 for(
double dx = -x_window; dx <= x_window; dx += x_step)
135 test_pose.
t.
x = old_pose.
t.
x + dx;
136 for(
double dy = -y_window; dy <= y_window; dy += y_step)
138 test_pose.
t.
y = old_pose.
t.
y + dy;
140 int num_model_points;
141 double error =
getFittingError(e, lrf, sensor_pose_inv * test_pose, sensor_ranges, model_ranges, num_model_points);
145 best_pose = test_pose;
163 float max_dist = 0.3;
168 if (!clusters.
empty())
170 geo::Vec2 area_min(clusters[0].pose.t.x, clusters[0].pose.t.y);
171 geo::Vec2 area_max(clusters[0].pose.t.x, clusters[0].pose.t.y);
183 area_min -=
geo::Vec2(max_dist, max_dist);
184 area_max +=
geo::Vec2(max_dist, max_dist);
189 if (e->visual() || !e->has_pose())
195 if (entity_chull.
points.empty())
198 if (entity_pose.
t.
x < area_min.
x || entity_pose.
t.
x > area_max.
x
199 || entity_pose.
t.
y < area_min.
y || entity_pose.
t.
y > area_max.
y)
221 for (
unsigned int i_cluster = 0; i_cluster < clusters.
size(); ++i_cluster)
225 for (
unsigned int i_entity = 0; i_entity < entities.
size(); ++i_entity)
232 float dx = entity_pose.
t.
x - cluster.
pose.
t.
x;
233 float dy = entity_pose.
t.
y - cluster.
pose.
t.
y;
239 dz = entity_pose.
t.
z - cluster.
pose.
t.
z;
241 float dist_sq = (dx * dx + dy * dy + dz * dz);
244 double prob = 1.0 / (1.0 + 100 * dist_sq);
245 double dt = current_time - e->lastUpdateTimestamp();
248 if (dist_sq > e_max_dist * e_max_dist)
252 assoc_matrix.
setEntry(i_cluster, i_entity, prob);
261 int temp_min_segment_size_pixels = 0;
262 config.
value(
"min_segment_size_pixels", temp_min_segment_size_pixels);
267 int temp_max_gap_size = 0;
281 uint num_beams = sensor_ranges.
size();
284 for(
unsigned int i = 1; i < num_beams - 1; ++i)
286 double rs = sensor_ranges[i];
288 if (std::abs(rs - sensor_ranges[i - 1]) > 0.1 && std::abs(rs - sensor_ranges[i + 1]) > 0.1)
290 sensor_ranges[i] = sensor_ranges[i - 1];
307 if (!e->visual() || !e->has_pose())
310 geo::Pose3D e_pose_SENSOR = sensor_pose_inv * e->pose();
313 if (e_pose_SENSOR.
t.
length2() > 5.0 * 5.0 || e_pose_SENSOR.
t.
x < 0)
316 if (e->hasType(
"left_door") || e->hasType(
"door_left") || e->hasType(
"right_door") || e->hasType(
"door_right"))
319 geo::Pose3D new_pose =
fitEntity(*e, sensor_pose,
lrf_model_, sensor_ranges, model_ranges, 0, 0.1, 0, 0.1, -1.57, 1.57, 0.1,
pose_cache);
320 req.setPose(e->id(), new_pose);
324 opt.
setMesh(e->visual()->getMesh(), sensor_pose_inv * new_pose);
341 for(uint i_seg=0; i_seg < segments.
size(); ++i_seg)
351 ROS_WARN(
"Association failed!");
356 for (
unsigned int i_cluster = 0; i_cluster < clusters.
size(); ++i_cluster)
361 int i_entity = assig[i_cluster];
370 new_chull = cluster.
chull;
371 new_pose = cluster.
pose;
377 req.setExistenceProbability(
id, 1.0);
384 if (!e->hasFlag(
"locked"))
386 new_chull = cluster.
chull;
387 new_pose = cluster.
pose;
391 double p_exist = e->existenceProbability();
392 req.setExistenceProbability(e->id(),
std::min(1.0, p_exist + 0.1));
398 if (!new_chull.
points.empty())
400 req.setConvexHullNew(
id, new_chull, new_pose, timestamp,
lrf_frame_);
412 req.setLastUpdateTimestamp(
id, timestamp);
459 if (e->visual() && e->has_pose() && !(e->hasType(
"left_door") || e->hasType(
"door_left") || e->hasType(
"right_door") || e->hasType(
"door_right")))
463 opt.
setMesh(e->visual()->getMesh(), sensor_pose_inv * e->pose());
472 for (
unsigned int i = 0; i < sensor_ranges.
size(); ++i)
474 double rs = sensor_ranges[i];
475 double rm = model_ranges[i];
478 || (rm > 0 && rs > rm)
480 sensor_ranges[i] = 0;
487 uint num_beams = sensor_ranges.
size();
491 for(
unsigned int i = 0; i < num_beams; ++i)
493 if (sensor_ranges[i] > 0)
500 if (current_segment.
empty())
507 for(
unsigned int i = current_segment.
front(); i < num_beams; ++i)
509 double rs = sensor_ranges[i];
518 i = current_segment.
back() + 1;
524 for(
unsigned int k = 0; k < current_segment.
size(); ++k)
547 current_segment.
clear();
550 while(sensor_ranges[i] == 0 && i < num_beams)
567 unsigned int segment_size =
segment.size();
571 float z_min = 0., z_max = 0.;
572 for(
unsigned int i = 0; i < segment_size; ++i)
592 z_min = std::min<float>(z_min, p.
z);
593 z_max = std::max<float>(z_max, p.
z);
607 float size_sq =
diff.length2();
608 if (size_sq > 0.35 * 0.35 && size_sq < 0.8 * 0.8)
609 cluster.
flag =
"possible_human";