sick_scan_marker.cpp
Go to the documentation of this file.
1 /*
2  * @brief Implementation of object markers for sick_scan
3  *
4  * Copyright (C) 2021, Ing.-Buero Dr. Michael Lehning, Hildesheim
5  * Copyright (C) 2021, SICK AG, Waldkirch
6  * All rights reserved.
7  *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
19 *
20 *
21 * All rights reserved.
22 *
23 * Redistribution and use in source and binary forms, with or without
24 * modification, are permitted provided that the following conditions are met:
25 *
26 * * Redistributions of source code must retain the above copyright
27 * notice, this list of conditions and the following disclaimer.
28 * * Redistributions in binary form must reproduce the above copyright
29 * notice, this list of conditions and the following disclaimer in the
30 * documentation and/or other materials provided with the distribution.
31 * * Neither the name of Osnabrueck University nor the names of its
32 * contributors may be used to endorse or promote products derived from
33 * this software without specific prior written permission.
34 * * Neither the name of SICK AG nor the names of its
35 * contributors may be used to endorse or promote products derived from
36 * this software without specific prior written permission
37 * * Neither the name of Ing.-Buero Dr. Michael Lehning nor the names of its
38 * contributors may be used to endorse or promote products derived from
39 * this software without specific prior written permission
40 *
41 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
42 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
45 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
46 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
47 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
48 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
49 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
50 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
51 * POSSIBILITY OF SUCH DAMAGE.
52  *
53  * Created on: 13.01.2021
54  *
55  * Authors:
56  * Michael Lehning <michael.lehning@lehning.de>
57  *
58  */
62 
64 
65 #ifdef ROSSIMU
67 #endif
68 
69 static ros_std_msgs::ColorRGBA color(float r, float g, float b, float a = 0.5f)
70 {
72  color.r = r;
73  color.g = g;
74  color.b = b;
75  color.a = a;
76  return color;
77 }
78 
80 {
81  return color(1.0f, 0.0f, 0.0f);
82 }
83 
84 static ros_std_msgs::ColorRGBA green(void) // free fields
85 {
86  return color(0.0f, 1.0f, 0.0f);
87 }
88 
90 {
91  return color(0.0f, 0.0f, 1.0f);
92 }
93 
94 static ros_std_msgs::ColorRGBA yellow(void) // infringed fields
95 {
96  return color(1.0f, 1.0f, 0.0f);
97 }
98 
99 static ros_std_msgs::ColorRGBA gray(void) // invalid fields (default)
100 {
101  return color(0.5f, 0.5f, 0.5f);
102 }
103 
104 sick_scan_xd::SickScanMarker::SickScanMarker(rosNodePtr nh, const std::string & marker_topic, const std::string & marker_frame_id)
105 : m_nh(nh), m_scan_mon_fieldset(0), m_marker_output_legend_offset_x(-0.5)
106 {
107  if(nh)
108  {
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);
112  }
113 }
114 
116 {
117 }
118 
119 void sick_scan_xd::SickScanMarker::updateMarker(const std::vector<SickScanMonField>& fields, int fieldset, int _eval_field_logic)
120 {
121  sick_scan_xd::EVAL_FIELD_SUPPORT eval_field_logic = (sick_scan_xd::EVAL_FIELD_SUPPORT)_eval_field_logic;
122  m_scan_mon_fields = fields;
123  if(eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
124  {
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);
129  }
130  // if(eval_field_logic != USE_EVAL_FIELD_LMS5XX_LOGIC)
131  // m_scan_fieldset_legend = createMonFieldsetLegend(0);
132  // m_scan_outputstate_legend = createOutputStateLegend({"0", "0", "0"}, {"-", "-", "-"}, {gray(), gray(), gray()}); // only if outputstates active, i.e. after updateMarker(LIDoutputstateMsg)
133  publishMarker();
134 }
135 
137 {
138  sick_scan_xd::EVAL_FIELD_SUPPORT eval_field_logic = (sick_scan_xd::EVAL_FIELD_SUPPORT)_eval_field_logic;
140  if(fieldMon && eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
141  {
142  ROS_DEBUG_STREAM("SickScanMarker: active_fieldset = " << fieldMon->getActiveFieldset());
143  m_scan_mon_fieldset = fieldMon->getActiveFieldset();
144  m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
145  publishMarker();
146  }
147 }
148 
150 {
151  sick_scan_xd::EVAL_FIELD_SUPPORT eval_field_logic = (sick_scan_xd::EVAL_FIELD_SUPPORT)_eval_field_logic;
153  if(fieldMon && eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
154  {
155  m_scan_mon_fieldset = fieldMon->getActiveFieldset();
156  ROS_DEBUG_STREAM("SickScanMarker: active_fieldset = " << fieldMon->getActiveFieldset());
157  }
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++)
163  {
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);
168  if(state == 1) // 1 = active = yellow
169  {
170  output_state[field_idx] = "[ON]";
171  output_colors[field_idx] = yellow();
172  }
173  else // 0 = not active = gray or 2 = not used = gray
174  {
175  output_state[field_idx] = "[OFF]";
176  output_colors[field_idx] = gray();
177  }
178  }
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] << ")";
183  dbg_info << " }";
184  ROS_DEBUG_STREAM(dbg_info.str());
185  if(eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
186  m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
187  m_scan_outputstate_legend = createOutputStateLegend(output_state, output_count, output_colors);
188  publishMarker();
189 }
190 
192 {
193  sick_scan_xd::EVAL_FIELD_SUPPORT eval_field_logic = (sick_scan_xd::EVAL_FIELD_SUPPORT)_eval_field_logic;
195  if(fieldMon && eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
196  {
197  m_scan_mon_fieldset = fieldMon->getActiveFieldset();
198  ROS_DEBUG_STREAM("SickScanMarker: active_fieldset = " << fieldMon->getActiveFieldset());
199  }
200  std::vector<FieldInfo> field_info(msg.fields.size());
201  for(int field_idx = 0; field_idx < msg.fields.size(); field_idx++)
202  {
203  // LFErec: field_index runs from 1 to 3, field_info: field_index_scan_mon runs from 0 to 47 (field_index of m_scan_mon_fields)
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) // 1 = free/clear = green
207  {
208  field_info[field_idx].field_status = "Clear";
209  field_info[field_idx].field_color = green();
210  }
211  else if(field_info[field_idx].field_result == 2) // 2 = infringed = yellow
212  {
213  field_info[field_idx].field_status = "Infringed";
214  field_info[field_idx].field_color = yellow();
215  }
216  else // 0 = invalid = gray
217  {
218  field_info[field_idx].field_status = "Incorrect";
219  field_info[field_idx].field_color = gray();
220  }
221  if(eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
222  field_info[field_idx].field_name = std::to_string(field_info.size() - field_idx); // field_info[field_info_idx].field_index;
223  else
224  field_info[field_idx].field_name = std::to_string(msg.fields[field_idx].field_index);
225  }
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;
234  ROS_DEBUG_STREAM(dbg_info.str());
235  m_scan_mon_field_marker = createMonFieldMarker(field_info);
236  m_scan_mon_field_legend = createMonFieldLegend(field_info);
237  if(eval_field_logic == USE_EVAL_FIELD_TIM7XX_LOGIC)
238  m_scan_fieldset_legend = createMonFieldsetLegend(m_scan_mon_fieldset);
239  publishMarker();
240 }
241 
243 {
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]);
254  notifyVisualizationMarkerListener(m_nh, &marker_array);
255  rosPublish(m_marker_publisher, marker_array);
256 #ifdef ROSSIMU
257  setVisualizationMarkerArray(marker_array.markers); // update ros simu output image
258 #endif
259 }
260 
261 static void appendTrianglePoints(int point_count, const std::vector<float>& points_x, const std::vector<float>& points_y,
262  ros_visualization_msgs::Marker& marker_point, int& triangle_idx, int nr_triangles, ros_std_msgs::ColorRGBA field_color)
263 {
264  for(int point_idx = 2; point_idx < point_count && triangle_idx < nr_triangles; point_idx++, triangle_idx++)
265  {
266 
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;
270 
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;
274 
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;
278 
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;
282  }
283 }
284 
285 std::vector<ros_visualization_msgs::Marker> sick_scan_xd::SickScanMarker::createMonFieldMarker(const std::vector<FieldInfo>& field_info)
286 {
287  int nr_triangles = 0;
288  for(int field_info_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
289  {
290  int field_idx = field_info[field_info_idx].field_index_scan_mon;
291  const sick_scan_xd::SickScanMonField& mon_field = m_scan_mon_fields[field_idx];
292  SickScanMonFieldType field_typ = mon_field.fieldType();
293  if(field_typ == MON_FIELD_DYNAMIC) // dynamic fields have two rectangle (first rectangle for v = max, second rectangle for v = 0)
294  nr_triangles += 2 * std::max<int>(0, mon_field.getPointCount()/2 - 2); // 3 points: 1 triangle, 4 points: 3 triangles, and so on
295  else
296  nr_triangles += std::max<int>(0, mon_field.getPointCount() - 2); // 3 points: 1 triangle, 4 points: 3 triangles, and so on
297  // std::map<SickScanMonFieldType,std::string> field_type_str = { {MON_FIELD_RADIAL, "MON_FIELD_RADIAL"}, {MON_FIELD_RECTANGLE, "MON_FIELD_RECTANGLE"}, {MON_FIELD_SEGMENTED, "MON_FIELD_SEGMENTED"}, {MON_FIELD_DYNAMIC, "MON_FIELD_DYNAMIC"} };
298  // ROS_INFO_STREAM("sick_scan_xd::SickScanMarker::createMonFieldMarker(): field[" << field_info_idx << "]: type=" << field_type_str[field_typ] << ", " << (mon_field.getPointCount()) << " points");
299  }
300 
301  // Draw fields using marker triangles
302  ros_visualization_msgs::Marker marker_point;
303  marker_point.header.stamp = rosTimeNow();
304  marker_point.header.frame_id = m_frame_id;
305  marker_point.ns = "sick_scan";
306  marker_point.id = 1;
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; // note: ADD == MODIFY
319  marker_point.color = gray();
320  marker_point.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
321 
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++)
327  {
328  int field_idx = field_info[field_info_idx].field_index_scan_mon;
329  ros_std_msgs::ColorRGBA field_color = field_info[field_info_idx].field_color;
330  const sick_scan_xd::SickScanMonField& mon_field = m_scan_mon_fields[field_idx];
331  int point_count = mon_field.getPointCount();
332  const std::vector<float>& points_x = mon_field.getFieldPointsX();
333  const std::vector<float>& points_y = mon_field.getFieldPointsY();
334  SickScanMonFieldType field_typ = mon_field.fieldType();
335  if(field_typ == MON_FIELD_DYNAMIC) // dynamic fields have two rectangle (first rectangle for v = max, second rectangle for v = 0)
336  {
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++)
339  {
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];
344  }
345  ros_std_msgs::ColorRGBA field1_color = field_color, field2_color = field_color;
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);
351  }
352  else
353  {
354  appendTrianglePoints(point_count, points_x, points_y, marker_point, triangle_idx, nr_triangles, field_color);
355  }
356  }
357  // Apply an additional transform to the cartesian pointcloud, default: "0,0,0,0,0,0" (i.e. no transform)
358  for(int n = 0; n < marker_point.points.size(); n++)
359  {
360  m_add_transform_xyz_rpy.applyTransform(marker_point.points[n].x, marker_point.points[n].y, marker_point.points[n].z);
361  }
362 
363  std::vector<ros_visualization_msgs::Marker> marker_array;
364  marker_array.reserve(1 + field_info.size());
365  marker_array.push_back(marker_point);
366 
367  // Draw field names
368  for(int field_info_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
369  {
370  int field_idx = field_info[field_info_idx].field_index_scan_mon;
371  const sick_scan_xd::SickScanMonField& mon_field = m_scan_mon_fields[field_idx];
372  if(mon_field.getPointCount() >= 3)
373  {
374  ros_geometry_msgs::Point triangle_centroid;
375  triangle_centroid.x = 0;
376  triangle_centroid.y = 0;
377  triangle_centroid.z = 0;
378  const std::vector<float>& points_x = mon_field.getFieldPointsX();
379  const std::vector<float>& points_y = mon_field.getFieldPointsY();
380  for(int point_idx = 0; point_idx < mon_field.getPointCount(); point_idx++)
381  {
382  triangle_centroid.x += points_x[point_idx];
383  triangle_centroid.y += points_y[point_idx];
384  }
385  triangle_centroid.x /= (float)(mon_field.getPointCount());
386  triangle_centroid.y /= (float)(mon_field.getPointCount());
387  ros_visualization_msgs::Marker marker_field_name;
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; // note: ADD == MODIFY
402  marker_field_name.color = field_info[field_info_idx].field_color;
403  marker_field_name.color.a = 1;
404  marker_field_name.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
405  marker_field_name.text = field_info[field_info_idx].field_name;
406  marker_array.push_back(marker_field_name);
407  }
408  else
409  {
410  ros_visualization_msgs::Marker 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")
417 # undef DELETE
418  marker_field_name.action = ros_visualization_msgs::Marker::DELETE;
419 # pragma pop_macro("DELETE")
420 #else
421  marker_field_name.action = ros_visualization_msgs::Marker::DELETE;
422 #endif
423  marker_field_name.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
424  marker_array.push_back(marker_field_name);
425  }
426 
427  }
428 
429  return marker_array;
430 }
431 
432 std::vector<ros_visualization_msgs::Marker> sick_scan_xd::SickScanMarker::createMonFieldLegend(const std::vector<FieldInfo>& field_info)
433 {
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++)
437  {
438  for(int field_info_idx = 0, triangle_idx = 0; field_info_idx < field_info.size(); field_info_idx++)
439  {
440  int field_idx = field_info[field_info_idx].field_index_scan_mon;
441  ros_visualization_msgs::Marker marker_point;
442  marker_point.header.stamp = rosTimeNow();
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; // note: ADD == MODIFY
456  marker_point.color = field_info[field_info_idx].field_color;
457  marker_point.color.a = 1;
458  marker_point.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
459  std::stringstream marker_text;
460  // int detection_field_number = field_info.size() - field_info_idx; // field_info[field_info_idx].field_index;
461  if (loop_cnt == 0)
462  marker_text << "Detection field " << (field_info[field_info_idx].field_name) << " : ";
463  else
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;
469  }
470  }
471  return marker_array;
472 }
473 
474 std::vector<ros_visualization_msgs::Marker> sick_scan_xd::SickScanMarker::createMonFieldsetLegend(int fieldset)
475 {
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++)
479  {
480  ros_visualization_msgs::Marker marker_point;
481  marker_point.header.stamp = rosTimeNow();
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; // note: ADD == MODIFY
495  marker_point.color = green();
496  marker_point.color.a = 1;
497  marker_point.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
498  std::stringstream marker_text;
499  if (loop_cnt == 0)
500  marker_text << "Fieldset :";
501  else
502  marker_text << std::to_string(fieldset);
503  marker_point.text = marker_text.str();
504  marker_array.push_back(marker_point);
505  }
506  return marker_array;
507 }
508 
509 
510 std::vector<ros_visualization_msgs::Marker> sick_scan_xd::SickScanMarker::createOutputStateLegend(const std::vector<std::string>& output_state, const std::vector<std::string>& output_count, const std::vector<ros_std_msgs::ColorRGBA>& output_colors)
511 {
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++)
515  {
516  for(int field_idx = 0; field_idx < output_count.size(); field_idx++)
517  {
518  ros_visualization_msgs::Marker marker_point;
519  marker_point.header.stamp = rosTimeNow();
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; // note: ADD == MODIFY
533  marker_point.color = output_colors[field_idx];
534  marker_point.color.a = 1;
535  marker_point.lifetime = rosDurationFromSec(0); // lifetime 0 indicates forever
536  std::stringstream marker_text;
537  int output_device = field_idx + 1;
538  if (loop_cnt == 0)
539  marker_text << "Output " << output_device << " : ";
540  else
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);
544  }
545  }
546  return marker_array;
547 }
msg
msg
pointcloud_utils.h
sick_scan_xd::SickCloudTransform
Definition: sick_cloud_transform.h:85
sick_scan_marker.h
sick_scan_xd::SickScanMarker::FieldInfo
Definition: sick_scan_marker.h:90
sick_scan_xd::SickScanMarker::m_frame_id
std::string m_frame_id
Definition: sick_scan_marker.h:109
sick_scan_xd::SickScanMarker::publishMarker
void publishMarker(void)
Definition: sick_scan_marker.cpp:242
sick_scan_xd::SickScanMonField::getPointCount
int getPointCount(void) const
Definition: sick_generic_field_mon.h:136
red
static ros_std_msgs::ColorRGBA red(void)
Definition: sick_scan_marker.cpp:79
sick_scan_xd::SickScanMarker::createOutputStateLegend
std::vector< ros_visualization_msgs::Marker > createOutputStateLegend(const std::vector< std::string > &output_state, const std::vector< std::string > &output_count, const std::vector< ros_std_msgs::ColorRGBA > &output_colors)
Definition: sick_scan_marker.cpp:510
blue
static ros_std_msgs::ColorRGBA blue(void)
Definition: sick_scan_marker.cpp:89
sick_scan_common.h
f
f
gray
static ros_std_msgs::ColorRGBA gray(void)
Definition: sick_scan_marker.cpp:99
sick_scan_xd::LFErecMsg
::sick_scan_xd::LFErecMsg_< std::allocator< void > > LFErecMsg
Definition: LFErecMsg.h:61
sick_scan_xd::SickScanMarker::createMonFieldsetLegend
std::vector< ros_visualization_msgs::Marker > createMonFieldsetLegend(int fieldset)
Definition: sick_scan_marker.cpp:474
yellow
static ros_std_msgs::ColorRGBA yellow(void)
Definition: sick_scan_marker.cpp:94
sick_scan_xd::notifyVisualizationMarkerListener
void notifyVisualizationMarkerListener(rosNodePtr handle, const ros_visualization_msgs::MarkerArray *msg)
Definition: sick_generic_callback.cpp:214
sick_generic_parser.h
sick_scan_xd::SickScanFieldMonSingleton::getInstance
static SickScanFieldMonSingleton * getInstance()
Definition: sick_generic_field_mon.cpp:155
visualization_msgs::Marker
::visualization_msgs::Marker_< std::allocator< void > > Marker
Definition: Marker.h:193
green
static ros_std_msgs::ColorRGBA green(void)
Definition: sick_scan_marker.cpp:84
visualization_msgs::MarkerArray
::visualization_msgs::MarkerArray_< std::allocator< void > > MarkerArray
Definition: MarkerArray.h:50
sick_scan_xd::EVAL_FIELD_SUPPORT
EVAL_FIELD_SUPPORT
Definition: sick_generic_parser.h:93
rosPublish
void rosPublish(rosPublisher< T > &publisher, const T &msg)
Definition: sick_ros_wrapper.h:203
sick_scan_xd::LIDoutputstateMsg
::sick_scan_xd::LIDoutputstateMsg_< std::allocator< void > > LIDoutputstateMsg
Definition: LIDoutputstateMsg.h:110
ROS_DEBUG_STREAM
#define ROS_DEBUG_STREAM(args)
Definition: sick_scan_logging.h:113
ros::NodeHandle
sick_scan_xd::SickScanMonField::getFieldPointsX
const std::vector< float > & getFieldPointsX(void) const
Definition: sick_generic_field_mon.h:142
setVisualizationMarkerArray
void setVisualizationMarkerArray(const std::vector< ros_visualization_msgs::Marker > &marker_array)
Definition: pointcloud_utils.cpp:173
sick_scan_xd::SickScanMarker::SickScanMarker
SickScanMarker(rosNodePtr nh=0, const std::string &marker_topic="", const std::string &marker_frame_id="")
Definition: sick_scan_marker.cpp:104
std_msgs::ColorRGBA
::std_msgs::ColorRGBA_< std::allocator< void > > ColorRGBA
Definition: ColorRGBA.h:63
sick_scan_xd::SickScanMonFieldType
SickScanMonFieldType
Definition: sick_generic_field_mon.h:72
rosTimeNow
rosTime rosTimeNow(void)
Definition: sick_ros_wrapper.h:173
sick_scan_xd::SickScanMonField::getFieldPointsY
const std::vector< float > & getFieldPointsY(void) const
Definition: sick_generic_field_mon.h:143
sick_scan_xd::MON_FIELD_DYNAMIC
@ MON_FIELD_DYNAMIC
Definition: sick_generic_field_mon.h:77
sick_scan_xd::LIDinputstateMsg
::sick_scan_xd::LIDinputstateMsg_< std::allocator< void > > LIDinputstateMsg
Definition: LIDinputstateMsg.h:110
sick_scan_xd::SickScanMonField
Definition: sick_generic_field_mon.h:123
sick_scan_xd::SickScanMarker::~SickScanMarker
virtual ~SickScanMarker()
Definition: sick_scan_marker.cpp:115
sick_scan_xd::SickScanFieldMonSingleton
Definition: sick_generic_field_mon.h:152
sick_scan_common_nw.h
sick_scan_xd::SickScanMonField::fieldType
SickScanMonFieldType & fieldType(void)
Definition: sick_generic_field_mon.h:127
rosDurationFromSec
rosDuration rosDurationFromSec(double seconds)
Definition: sick_ros_wrapper.h:211
sick_scan_xd::SickScanMarker::createMonFieldLegend
std::vector< ros_visualization_msgs::Marker > createMonFieldLegend(const std::vector< FieldInfo > &field_info)
Definition: sick_scan_marker.cpp:432
sick_scan_xd::SickScanMarker::createMonFieldMarker
std::vector< ros_visualization_msgs::Marker > createMonFieldMarker(const std::vector< FieldInfo > &field_info)
Definition: sick_scan_marker.cpp:285
color
static ros_std_msgs::ColorRGBA color(float r, float g, float b, float a=0.5f)
Definition: sick_scan_marker.cpp:69
sick_scan_xd::SickScanMarker::m_marker_publisher
rosPublisher< ros_visualization_msgs::MarkerArray > m_marker_publisher
Definition: sick_scan_marker.h:110
sick_scan_xd::SickScanFieldMonSingleton::getActiveFieldset
int getActiveFieldset(void)
Definition: sick_generic_field_mon.h:172
appendTrianglePoints
static void appendTrianglePoints(int point_count, const std::vector< float > &points_x, const std::vector< float > &points_y, ros_visualization_msgs::Marker &marker_point, int &triangle_idx, int nr_triangles, ros_std_msgs::ColorRGBA field_color)
Definition: sick_scan_marker.cpp:261
sick_scan_xd::USE_EVAL_FIELD_TIM7XX_LOGIC
@ USE_EVAL_FIELD_TIM7XX_LOGIC
Definition: sick_generic_parser.h:96
sick_scan_xd::SickScanMarker::updateMarker
void updateMarker(const std::vector< SickScanMonField > &fields, int fieldset, int eval_field_logic)
Definition: sick_scan_marker.cpp:119
sick_scan_xd::SickScanMarker::m_add_transform_xyz_rpy
sick_scan_xd::SickCloudTransform m_add_transform_xyz_rpy
Definition: sick_scan_marker.h:118


sick_scan_xd
Author(s): Michael Lehning , Jochen Sprickerhof , Martin Günther
autogenerated on Fri Oct 25 2024 02:47:11