105 : m_nh(nh), m_scan_mon_fieldset(0), m_marker_output_legend_offset_x(-0.5)
109 m_frame_id = marker_frame_id.empty() ?
"/cloud" : marker_frame_id;
110 m_marker_publisher = rosAdvertise<ros_visualization_msgs::MarkerArray>(nh, marker_topic.empty() ?
"sick_scan/marker" : marker_topic, 1);
122 m_scan_mon_fields = fields;
125 m_scan_mon_fieldset = fieldset;
126 std::vector<FieldInfo> default_fields = {
FieldInfo(0,0,
"-",
"3",
gray()),
FieldInfo(1,0,
"-",
"2",
gray()),
FieldInfo(2,0,
"-",
"1",
gray())};
127 m_scan_mon_field_marker = createMonFieldMarker(default_fields);
128 m_scan_mon_field_legend = createMonFieldLegend(default_fields);
144 m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
158 int num_devices = (int)std::min<size_t>(
msg.output_count.size(),
msg.output_state.size());
159 std::vector<std::string> output_state(num_devices);
160 std::vector<std::string> output_count(num_devices);
161 std::vector<ros_std_msgs::ColorRGBA> output_colors(num_devices);
162 for(
int field_idx = 0; field_idx < num_devices; field_idx++)
164 int count =
msg.output_count[field_idx];
165 int state =
msg.output_state[field_idx];
166 output_state[field_idx] = std::to_string(state);
167 output_count[field_idx] = std::to_string(count);
170 output_state[field_idx] =
"[ON]";
171 output_colors[field_idx] =
yellow();
175 output_state[field_idx] =
"[OFF]";
176 output_colors[field_idx] =
gray();
179 std::stringstream dbg_info;
180 dbg_info <<
"SickScanMarker::updateMarker(): LIDoutputstateMsg (state,count) = { ";
181 for(
int field_idx = 0; field_idx < num_devices; field_idx++)
182 dbg_info << ((field_idx > 0) ?
", (" :
"(") << output_state[field_idx] <<
"," << output_count[field_idx] <<
")";
186 m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
187 m_scan_outputstate_legend = createOutputStateLegend(output_state, output_count, output_colors);
200 std::vector<FieldInfo> field_info(
msg.fields.size());
201 for(
int field_idx = 0; field_idx <
msg.fields.size(); field_idx++)
204 field_info[field_idx].field_index_scan_mon = (int)(
msg.fields[field_idx].field_index - 1 +
msg.fields.size() * m_scan_mon_fieldset);
205 field_info[field_idx].field_result =
msg.fields[field_idx].field_result_mrs;
206 if(field_info[field_idx].field_result == 1)
208 field_info[field_idx].field_status =
"Clear";
209 field_info[field_idx].field_color =
green();
211 else if(field_info[field_idx].field_result == 2)
213 field_info[field_idx].field_status =
"Infringed";
214 field_info[field_idx].field_color =
yellow();
218 field_info[field_idx].field_status =
"Incorrect";
219 field_info[field_idx].field_color =
gray();
222 field_info[field_idx].field_name = std::to_string(field_info.size() - field_idx);
224 field_info[field_idx].field_name = std::to_string(
msg.fields[field_idx].field_index);
226 std::stringstream dbg_info;
227 dbg_info <<
"SickScanMarker::updateMarker(): LFErec states={";
228 for(
int field_idx = 0; field_idx <
msg.fields.size(); field_idx++)
229 dbg_info << ((field_idx > 0) ?
"," :
"") << (int)
msg.fields[field_idx].field_index <<
":" << (
int)
msg.fields[field_idx].field_result_mrs;
230 dbg_info <<
"}, mon_field_point_cnt={";
231 for(
int field_idx = 0; field_idx < m_scan_mon_fields.size(); field_idx++)
232 dbg_info << ((field_idx > 0) ?
"," :
"") << m_scan_mon_fields[field_idx].getPointCount();
233 dbg_info <<
"}, mon_field_set = " << m_scan_mon_fieldset;
235 m_scan_mon_field_marker = createMonFieldMarker(field_info);
236 m_scan_mon_field_legend = createMonFieldLegend(field_info);
238 m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
245 marker_array.markers.reserve(m_scan_mon_field_marker.size() + m_scan_mon_field_legend.size() + m_scan_outputstate_legend.size());
246 for(
int n = 0; n < m_scan_mon_field_marker.size(); n++)
247 marker_array.markers.push_back(m_scan_mon_field_marker[n]);
248 for(
int n = 0; n < m_scan_mon_field_legend.size(); n++)
249 marker_array.markers.push_back(m_scan_mon_field_legend[n]);
250 for(
int n = 0; n < m_scan_outputstate_legend.size(); n++)
251 marker_array.markers.push_back(m_scan_outputstate_legend[n]);
252 for(
int n = 0; n < m_scan_fieldset_legend.size(); n++)
253 marker_array.markers.push_back(m_scan_fieldset_legend[n]);
261 static void appendTrianglePoints(
int point_count,
const std::vector<float>& points_x,
const std::vector<float>& points_y,
264 for(
int point_idx = 2; point_idx < point_count && triangle_idx < nr_triangles; point_idx++, triangle_idx++)
267 marker_point.points[3 * triangle_idx + 0].x = points_x[0];
268 marker_point.points[3 * triangle_idx + 0].y = points_y[0];
269 marker_point.points[3 * triangle_idx + 0].z = 0;
271 marker_point.points[3 * triangle_idx + 1].x = points_x[point_idx - 1];
272 marker_point.points[3 * triangle_idx + 1].y = points_y[point_idx - 1];
273 marker_point.points[3 * triangle_idx + 1].z = 0;
275 marker_point.points[3 * triangle_idx + 2].x = points_x[point_idx];
276 marker_point.points[3 * triangle_idx + 2].y = points_y[point_idx];
277 marker_point.points[3 * triangle_idx + 2].z = 0;
279 marker_point.colors[3 * triangle_idx + 0] = field_color;
280 marker_point.colors[3 * triangle_idx + 1] = field_color;
281 marker_point.colors[3 * triangle_idx + 2] = field_color;
287 int nr_triangles = 0;
288 for(
int field_info_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
290 int field_idx = field_info[field_info_idx].field_index_scan_mon;
294 nr_triangles += 2 * std::max<int>(0, mon_field.
getPointCount()/2 - 2);
296 nr_triangles += std::max<int>(0, mon_field.
getPointCount() - 2);
304 marker_point.header.frame_id = m_frame_id;
305 marker_point.ns =
"sick_scan";
307 marker_point.type = ros_visualization_msgs::Marker::TRIANGLE_LIST;
308 marker_point.scale.x = 1;
309 marker_point.scale.y = 1;
310 marker_point.scale.z = 1;
311 marker_point.pose.position.x = 0.0;
312 marker_point.pose.position.y = 0.0;
313 marker_point.pose.position.z = 0.0;
314 marker_point.pose.orientation.x = 0.0;
315 marker_point.pose.orientation.y = 0.0;
316 marker_point.pose.orientation.z = 0.0;
317 marker_point.pose.orientation.w = 1.0;
318 marker_point.action = ros_visualization_msgs::Marker::ADD;
319 marker_point.color =
gray();
322 marker_point.points.resize(3 * nr_triangles);
323 marker_point.colors.resize(3 * nr_triangles);
324 std::vector<ros_geometry_msgs::Point> triangle_centroids;
325 triangle_centroids.reserve(field_info.size());
326 for(
int field_info_idx = 0, triangle_idx = 0; field_info_idx < field_info.size() && triangle_idx < nr_triangles; field_info_idx++)
328 int field_idx = field_info[field_info_idx].field_index_scan_mon;
337 std::vector<float> field1_points_x(point_count/2), field1_points_y(point_count/2), field2_points_x(point_count/2), field2_points_y(point_count/2);
338 for(
int n = 0; n < point_count/2; n++)
340 field1_points_x[n] = points_x[n];
341 field1_points_y[n] = points_y[n];
342 field2_points_x[n] = points_x[n + point_count/2];
343 field2_points_y[n] = points_y[n + point_count/2];
346 field1_color.r *= 0.5;
347 field1_color.g *= 0.5;
348 field1_color.b *= 0.5;
349 appendTrianglePoints(point_count/2, field1_points_x, field1_points_y, marker_point, triangle_idx, nr_triangles, field1_color);
350 appendTrianglePoints(point_count/2, field2_points_x, field2_points_y, marker_point, triangle_idx, nr_triangles, field2_color);
354 appendTrianglePoints(point_count, points_x, points_y, marker_point, triangle_idx, nr_triangles, field_color);
358 for(
int n = 0; n < marker_point.points.size(); n++)
360 m_add_transform_xyz_rpy.applyTransform(marker_point.points[n].x, marker_point.points[n].y, marker_point.points[n].z);
363 std::vector<ros_visualization_msgs::Marker> marker_array;
364 marker_array.reserve(1 + field_info.size());
365 marker_array.push_back(marker_point);
368 for(
int field_info_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
370 int field_idx = field_info[field_info_idx].field_index_scan_mon;
374 ros_geometry_msgs::Point triangle_centroid;
375 triangle_centroid.x = 0;
376 triangle_centroid.y = 0;
377 triangle_centroid.z = 0;
380 for(
int point_idx = 0; point_idx < mon_field.
getPointCount(); point_idx++)
382 triangle_centroid.x += points_x[point_idx];
383 triangle_centroid.y += points_y[point_idx];
388 marker_field_name.header.stamp =
rosTimeNow();
389 marker_field_name.header.frame_id = m_frame_id;
390 marker_field_name.ns =
"sick_scan";
391 marker_field_name.id = 2 + field_info_idx;
392 marker_field_name.type = ros_visualization_msgs::Marker::TEXT_VIEW_FACING;
393 marker_field_name.scale.z = 0.1;
394 marker_field_name.pose.position.x = triangle_centroid.x;
395 marker_field_name.pose.position.y = triangle_centroid.y;
396 marker_field_name.pose.position.z = triangle_centroid.z;
397 marker_field_name.pose.orientation.x = 0.0;
398 marker_field_name.pose.orientation.y = 0.0;
399 marker_field_name.pose.orientation.z = 0.0;
400 marker_field_name.pose.orientation.w = 1.0;
401 marker_field_name.action = ros_visualization_msgs::Marker::ADD;
402 marker_field_name.color = field_info[field_info_idx].field_color;
403 marker_field_name.color.a = 1;
405 marker_field_name.text = field_info[field_info_idx].field_name;
406 marker_array.push_back(marker_field_name);
411 marker_field_name.header.stamp =
rosTimeNow();
412 marker_field_name.header.frame_id = m_frame_id;
413 marker_field_name.ns =
"sick_scan";
414 marker_field_name.id = 2 + field_info_idx;
415 #if defined(_WIN32) && defined(DELETE)
416 # pragma push_macro("DELETE")
418 marker_field_name.action = ros_visualization_msgs::Marker::DELETE;
419 # pragma pop_macro("DELETE")
421 marker_field_name.action = ros_visualization_msgs::Marker::DELETE;
424 marker_array.push_back(marker_field_name);
434 std::vector<ros_visualization_msgs::Marker> marker_array;
435 marker_array.reserve(2 * field_info.size());
436 for(
int loop_cnt = 0; loop_cnt < 2; loop_cnt++)
438 for(
int field_info_idx = 0, triangle_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
440 int field_idx = field_info[field_info_idx].field_index_scan_mon;
443 marker_point.header.frame_id = m_frame_id;
444 marker_point.ns =
"sick_scan";
445 marker_point.id = 100 + loop_cnt * (int)m_scan_mon_fields.size() + field_info_idx;
446 marker_point.type = ros_visualization_msgs::Marker::TEXT_VIEW_FACING;
447 marker_point.scale.z = 0.1;
448 marker_point.pose.position.x = -0.1 * field_info_idx - 0.1;
449 marker_point.pose.position.y = ((loop_cnt == 0) ? 0.3 : -0.2);
450 marker_point.pose.position.z = 0.0;
451 marker_point.pose.orientation.x = 0.0;
452 marker_point.pose.orientation.y = 0.0;
453 marker_point.pose.orientation.z = 0.0;
454 marker_point.pose.orientation.w = 1.0;
455 marker_point.action = ros_visualization_msgs::Marker::ADD;
456 marker_point.color = field_info[field_info_idx].field_color;
457 marker_point.color.a = 1;
459 std::stringstream marker_text;
462 marker_text <<
"Detection field " << (field_info[field_info_idx].field_name) <<
" : ";
464 marker_text << field_info[field_info_idx].field_status;
465 marker_point.text = marker_text.str();
466 marker_array.push_back(marker_point);
467 if(m_marker_output_legend_offset_x > marker_point.pose.position.x - 0.1)
468 m_marker_output_legend_offset_x = marker_point.pose.position.x - 0.1;
476 std::vector<ros_visualization_msgs::Marker> marker_array;
477 marker_array.reserve(2);
478 for(
int loop_cnt = 0; loop_cnt < 2; loop_cnt++)
482 marker_point.header.frame_id = m_frame_id;
483 marker_point.ns =
"sick_scan";
484 marker_point.id = 500 + loop_cnt;
485 marker_point.type = ros_visualization_msgs::Marker::TEXT_VIEW_FACING;
486 marker_point.scale.z = 0.1;
487 marker_point.pose.position.x = -0.4;
488 marker_point.pose.position.y = ((loop_cnt == 0) ? 0.16 : -0.2);
489 marker_point.pose.position.z = 0.0;
490 marker_point.pose.orientation.x = 0.0;
491 marker_point.pose.orientation.y = 0.0;
492 marker_point.pose.orientation.z = 0.0;
493 marker_point.pose.orientation.w = 1.0;
494 marker_point.action = ros_visualization_msgs::Marker::ADD;
495 marker_point.color =
green();
496 marker_point.color.a = 1;
498 std::stringstream marker_text;
500 marker_text <<
"Fieldset :";
502 marker_text << std::to_string(fieldset);
503 marker_point.text = marker_text.str();
504 marker_array.push_back(marker_point);
512 std::vector<ros_visualization_msgs::Marker> marker_array;
513 marker_array.reserve(2 * output_count.size());
514 for(
int loop_cnt = 0; loop_cnt < 2; loop_cnt++)
516 for(
int field_idx = 0; field_idx < output_count.size(); field_idx++)
520 marker_point.header.frame_id = m_frame_id;
521 marker_point.ns =
"sick_scan";
522 marker_point.id = 400 + loop_cnt * (int)output_count.size() + field_idx;
523 marker_point.type = ros_visualization_msgs::Marker::TEXT_VIEW_FACING;
524 marker_point.scale.z = 0.1;
525 marker_point.pose.position.x = -0.1 * field_idx + m_marker_output_legend_offset_x;
526 marker_point.pose.position.y = ((loop_cnt == 0) ? 0.16 : -0.3);
527 marker_point.pose.position.z = 0.0;
528 marker_point.pose.orientation.x = 0.0;
529 marker_point.pose.orientation.y = 0.0;
530 marker_point.pose.orientation.z = 0.0;
531 marker_point.pose.orientation.w = 1.0;
532 marker_point.action = ros_visualization_msgs::Marker::ADD;
533 marker_point.color = output_colors[field_idx];
534 marker_point.color.a = 1;
536 std::stringstream marker_text;
537 int output_device = field_idx + 1;
539 marker_text <<
"Output " << output_device <<
" : ";
541 marker_text << (field_idx < output_state.size() ? (output_state[field_idx]) :
"") <<
" Count:" << output_count[field_idx];
542 marker_point.text = marker_text.str();
543 marker_array.push_back(marker_point);