57 #include <sick_scan/RadarScan.h>
60 #include <ros/package.h>
63 #include <sick_scan/RadarScan.h>
93 return fabs( a - b ) < M_PI;
102 bool bRet =
isWithinRange(orgAngle, mainAngle - mainAngleTol, mainAngle + mainAngleTol);
105 tmpAngle = mainAngle;
107 *dstAngle = tmpAngle;
110 bRet =
isWithinRange(orgAngle, M_PI + mainAngle - mainAngleTol, M_PI + mainAngle + mainAngleTol);
113 tmpAngle = mainAngle + M_PI;
115 *dstAngle = tmpAngle;
131 double testAngleArrDeg[] = {-161.0, -10.0, -20.0, -30.0, 330.0, 10.0, 20.0, 30.0, -160.0};
133 std::vector<double> testAngleArr;
135 for (
int i =0; i <
sizeof(testAngleArrDeg)/
sizeof(testAngleArrDeg[0]); i++)
137 double tmpAngle = testAngleArrDeg[i] / 180.0 * M_PI;
138 testAngleArr.push_back(tmpAngle);
142 double mainAngle = 20.0/180.0 * M_PI;
143 double mainAngleTol = 30.0/180.0 * M_PI;
144 for (
int i = 0; i < testAngleArr.size(); i++)
146 float angle = testAngleArr[i];
150 printf(
"Ergebnis: %2d %6.2lf %6.2lf %s\n", i,
angle, dstAngle, bRet ?
"JA" :
"NEIN");
159 RadarObjectMarkerCfg *cfgPtr = &boost::serialization::singleton<RadarObjectMarkerCfg>::get_mutable_instance();
161 enum TARGET_MARKER_TYPE {TARGET_MARKER_BALL, TARGET_MARKER_ARROW, TARGET_MARKER_NUM};
165 for (
int i = 0; i < TARGET_MARKER_NUM; i++)
167 rawTargetArray[i].
markers.resize(oa->targets.width);
170 int coordIdx[3] = {0};
172 int amplitudeIdx = -1;
174 for (
int i = 0; i < 3; i++)
180 bool useCurrTimeStamp =
true;
182 for (
int i = 0; i < oa->targets.fields.size(); i++)
184 std::string fieldName = oa->targets.fields[i].name;
186 if (fieldName.compare(
"x") == 0)
190 if (fieldName.compare(
"y") == 0)
194 if (fieldName.compare(
"z") == 0)
198 if (fieldName.compare(
"vrad") == 0)
202 if (fieldName.compare(
"amplitude") == 0)
210 int numRawTargets = oa->targets.width;
212 if (numRawTargets > 0)
214 cloud_msg.
header = oa->header;
216 if (useCurrTimeStamp)
221 cloud_msg.
height = oa->targets.height;
222 cloud_msg.
width = oa->targets.width;
223 cloud_msg.
row_step = oa->targets.row_step;
224 cloud_msg.
point_step = oa->targets.point_step;
225 cloud_msg.
data = oa->targets.data;
226 cloud_msg.
fields = oa->targets.fields;
227 cloud_msg.
is_dense = oa->targets.is_dense;
231 for (
size_t i = 0; i < oa->targets.width; i++)
238 for (
int ii = 0; ii < 3; ii++)
240 if (coordIdx[ii] != -1)
242 int tmpIdx = coordIdx[ii];
243 float *valPtr = (
float *) (&(oa->targets.data[0]) + i * oa->targets.point_step +
244 oa->targets.fields[tmpIdx].offset);
250 int tmpIdx = vradIdx;
251 float *valPtr = (
float *) (&(oa->targets.data[0]) + i * oa->targets.point_step +
252 oa->targets.fields[tmpIdx].offset);
257 int tmpIdx = amplitudeIdx;
258 float *valPtr = (
float *) (&(oa->targets.data[0]) + i * oa->targets.point_step +
259 oa->targets.fields[tmpIdx].offset);
264 for (
int iLoop = 0; iLoop < TARGET_MARKER_NUM; iLoop++)
267 rawTargetArray[iLoop].
markers[i].header = oa->header;
269 if (useCurrTimeStamp)
271 rawTargetArray[iLoop].
markers[i].header.stamp = currTimeStamp;
274 rawTargetArray[iLoop].
markers[i].ns =
"rawtargets";
275 rawTargetArray[iLoop].
markers[i].id = tmpId + iLoop * numRawTargets;
278 case TARGET_MARKER_ARROW:
281 rawTargetArray[iLoop].
markers[i].scale.x = 0.1;
282 rawTargetArray[iLoop].
markers[i].scale.y = 0.2;
284 rawTargetArray[iLoop].
markers[i].points.resize(2);
285 rawTargetArray[iLoop].
markers[i].points[0].x = pts3d[0];
286 rawTargetArray[iLoop].
markers[i].points[0].y = pts3d[1];
287 rawTargetArray[iLoop].
markers[i].points[0].z = pts3d[2];
288 float lineOfSight = atan2(pts3d[1], pts3d[0]);
289 rawTargetArray[iLoop].
markers[i].points[1].x = pts3d[0] + cos(lineOfSight) * vrad * 0.1;
290 rawTargetArray[iLoop].
markers[i].points[1].y = pts3d[1] + sin(lineOfSight) * vrad * 0.1;
291 rawTargetArray[iLoop].
markers[i].points[1].z = pts3d[2];
295 case TARGET_MARKER_BALL:
302 rawTargetArray[iLoop].
markers[i].pose.position.x = pts3d[0];
303 rawTargetArray[iLoop].
markers[i].pose.position.y = pts3d[1];
304 rawTargetArray[iLoop].
markers[i].pose.position.z = pts3d[2];
305 rawTargetArray[iLoop].
markers[i].pose.orientation.x = 0.0;
306 rawTargetArray[iLoop].
markers[i].pose.orientation.y = 0.0;
307 rawTargetArray[iLoop].
markers[i].pose.orientation.z = 0.0;
308 rawTargetArray[iLoop].
markers[i].pose.orientation.w = 1.0;
318 idxRange /= rangeAmpl;
327 unsigned char greyIdx = (
unsigned char)(255.999 * idxRange);
332 float redF, greenF, blueF;
334 greenF =
green / 255.00;
335 blueF =
blue / 255.00;
336 rawTargetArray[iLoop].
markers[i].color.a = 0.75;
337 rawTargetArray[iLoop].
markers[i].color.r = redF;
338 rawTargetArray[iLoop].
markers[i].color.g = greenF;
339 rawTargetArray[iLoop].
markers[i].color.b = blueF;
342 rawTargetArray[iLoop].
markers[i].color.a = 0.75;
353 for (
int iLoop = 0; iLoop < TARGET_MARKER_NUM; iLoop++)
366 object_boxes.
markers.resize(2 * oa->objects.size());
369 object_labels.
markers.resize(1 * oa->objects.size());
372 float vp_dir_deg = 0.0;
374 double angleMainDirDeg = 20;
375 double angleMainDir = angleMainDirDeg / 180.0 * M_PI;
376 double angleMainDirTolDeg = 20.0;
377 double angleMainDirTol = angleMainDirTolDeg / 180.0 * M_PI;
379 std::vector<float> vehiclePredefinedDir;
380 std::vector<float> vehicleAbsoluteSpeed;
381 std::vector<bool> vehicleIsInPredefinedDir;
383 int objNum = oa->objects.size();
385 vehiclePredefinedDir.resize(objNum);
386 vehicleIsInPredefinedDir.resize(objNum);
387 vehicleAbsoluteSpeed.resize(objNum);
389 for (
int iLoop = 0; iLoop < 2; iLoop++)
391 for (
size_t i = 0; i < oa->objects.size(); i++)
393 int colorId = oa->objects[i].id % 256;
395 vp[0] = oa->objects[i].velocity.twist.linear.x;
396 vp[1] = oa->objects[i].velocity.twist.linear.y;
397 vp[2] = oa->objects[i].velocity.twist.linear.z;
398 float vabs = sqrt(vp[0] * vp[0] + vp[1]*vp[1] + vp[2]*vp[2]);
399 vehicleAbsoluteSpeed[i] = vabs;
400 vp_dir = atan2(vp[1], vp[0]);
401 vp_dir_deg = vp_dir / 3.141592 * 180.0;
405 vehiclePredefinedDir[i] = dstAngle;
406 vehicleIsInPredefinedDir[i] = bRet;
408 int idx = i + iLoop * oa->objects.size();
410 object_boxes.
markers[idx].header = oa->header;
412 if (useCurrTimeStamp)
414 object_boxes.
markers[idx].header.stamp = currTimeStamp;
416 std::string nameSpaceBoxes =
"object_boxes_slow";
419 nameSpaceBoxes =
"object_boxes_fast";
421 object_boxes.
markers[idx].ns = nameSpaceBoxes;
422 object_boxes.
markers[idx].id = tmpId + iLoop * oa->objects.size();
424 object_boxes.
markers[idx].color.a = 0.75;
432 object_labels.
markers[i].header = oa->header;
433 if (useCurrTimeStamp)
436 object_labels.
markers[i].header.stamp = currTimeStamp;
440 object_labels.
markers[i].id = tmpId + iLoop * oa->objects.size();
442 object_labels.
markers[i].color.a = 0.75;
449 object_labels.
markers[i].pose = oa->objects[i].object_box_center.pose;
450 object_labels.
markers[i].scale.z = 1.0;
455 sprintf(szLabel,
"%5.1lf [m/s]", vabs );
461 std::string object_label_ns =
"???";
464 object_label_ns =
"object_label_fast";
468 object_label_ns =
"object_label_slow";
471 object_labels.
markers[i].text = szLabel;
472 object_labels.
markers[i].ns = object_label_ns;
474 if (vehicleIsInPredefinedDir[i] ==
false)
476 object_labels.
markers[i].scale.z = 0.00;
485 object_boxes.
markers[idx].pose = oa->objects[i].object_box_center.pose;
486 object_boxes.
markers[idx].scale = oa->objects[i].object_box_size;
492 object_boxes.
markers[idx].pose.position.z += oa->objects[i].object_box_size.z * 0.5;
505 if (object_boxes.
markers[idx].scale.x == 0.0)
507 object_boxes.
markers[idx].scale.x = 0.01;
509 if (object_boxes.
markers[idx].scale.y == 0.0)
511 object_boxes.
markers[idx].scale.y = 0.01;
513 if (object_boxes.
markers[idx].scale.z == 0.0)
515 object_boxes.
markers[idx].scale.z = 0.01;
518 if (vehicleIsInPredefinedDir[i] ==
false) {
519 object_boxes.
markers[idx].scale.x = 0.0;
520 object_boxes.
markers[idx].scale.y = 0.0;
521 object_boxes.
markers[idx].scale.z = 0.0;
526 if (vehicleIsInPredefinedDir[i] ==
true)
528 float theta = vehiclePredefinedDir[i];
535 float theta2 = 0.5 * theta;
536 object_boxes.
markers[idx].pose.orientation.z = sin(theta2);
537 object_boxes.
markers[idx].pose.orientation.w = cos(theta2);
549 object_boxes.
markers[idx].scale.x = 0.5;
550 object_boxes.
markers[idx].scale.y = 0.5;
551 object_boxes.
markers[idx].scale.z = 0.5;
558 xTmp = oa->objects[i].object_box_center.pose.position.x;
559 yTmp = oa->objects[i].object_box_center.pose.position.y;
561 double vehLen = oa->objects[i].object_box_size.x;
564 float quaternion[4] = {0};
566 quaternion[0] = oa->objects[i].object_box_center.pose.orientation.x;
567 quaternion[1] = oa->objects[i].object_box_center.pose.orientation.y;
568 quaternion[2] = oa->objects[i].object_box_center.pose.orientation.z;
569 quaternion[3] = oa->objects[i].object_box_center.pose.orientation.w;
576 float theta2 = atan2(quaternion[2], quaternion[3]);
577 float theta = 2.0f * theta2;
578 if (vehicleIsInPredefinedDir[i] ==
true)
580 theta = vehiclePredefinedDir[i];
583 float cosVal = cos(theta);
584 float sinVal = sin(theta);
585 xTmp += cosVal * vehLen * 0.5;
586 yTmp += sinVal * vehLen * 0.5;
587 object_boxes.
markers[idx].pose.position.x = xTmp;
588 object_boxes.
markers[idx].pose.position.y = yTmp;
589 object_boxes.
markers[idx].pose.position.z = 0.0;
593 object_boxes.
markers[idx].pose.orientation.x = 0.0;
594 object_boxes.
markers[idx].pose.orientation.y = 0.0;
595 object_boxes.
markers[idx].pose.orientation.z = 0.0;
596 object_boxes.
markers[idx].pose.orientation.w = 0.0;
598 object_boxes.
markers[idx].points.resize(2);
599 object_boxes.
markers[idx].points[0].x = 0.0;
600 object_boxes.
markers[idx].points[0].y = 0.0;
601 object_boxes.
markers[idx].points[0].z = 0.0;
603 float absSpeed = 0.0;
604 for (
int j = 0; j < 3; j++)
606 float speedPartial = 0.0;
609 case 0: speedPartial = oa->objects[i].velocity.twist.linear.x;
break;
610 case 1: speedPartial = oa->objects[i].velocity.twist.linear.y;
break;
611 case 2: speedPartial = oa->objects[i].velocity.twist.linear.z;
break;
613 absSpeed += speedPartial * speedPartial;
615 absSpeed = sqrt(absSpeed);
623 if (vehicleIsInPredefinedDir[i] ==
false) {
627 object_boxes.
markers[idx].points[1].x = 0.0 + lengthOfArrow * cosVal;
628 object_boxes.
markers[idx].points[1].y = 0.0 + lengthOfArrow * sinVal;
629 object_boxes.
markers[idx].points[1].z = 0.0;
645 int main(
int argc,
char **argv)
648 ROS_INFO(
"radar_object_marker, compiled at [%s] [%s]", __DATE__, __TIME__);
649 RadarObjectMarkerCfg *cfgPtr = &boost::serialization::singleton<RadarObjectMarkerCfg>::get_mutable_instance();
650 ros::init(argc, argv,
"radar_object_marker");
655 double minAmpl = 10.0;
656 double maxAmpl = 90.0;
658 paramRes = nhPriv.
getParam(
"rawtarget_palette_name", heatMap);
659 paramRes = nhPriv.
getParam(
"rawtarget_palette_min_ampl", minAmpl);
660 paramRes = nhPriv.
getParam(
"rawtarget_palette_max_ampl", maxAmpl);
674 std::string heatMapFileName = path +
"/config/" + cfgPtr->
getPaletteName();
685 ROS_INFO(
"Subscribing to radar and pulishing to radar_markers");