57 return cpm.payload.management_container.reference_time;
74 inline double getLatitude(
const CollectivePerceptionMessage &cpm) {
75 return getLatitude(cpm.payload.management_container.reference_position.latitude);
84 inline double getLongitude(
const CollectivePerceptionMessage &cpm) {
85 return getLongitude(cpm.payload.management_container.reference_position.longitude);
94 inline double getAltitude(
const CollectivePerceptionMessage &cpm) {
95 return getAltitude(cpm.payload.management_container.reference_position.altitude);
109 inline gm::PointStamped
getUTMPosition(
const CollectivePerceptionMessage &cpm,
int &zone,
bool &northp) {
110 return getUTMPosition(cpm.payload.management_container.reference_position, zone, northp);
138 std::vector<uint8_t> container_ids;
139 for (
int i = 0; i < cpm.payload.cpm_containers.value.array.size(); i++) {
140 container_ids.push_back(cpm.payload.cpm_containers.value.array[i].container_id.value);
142 return container_ids;
153 inline WrappedCpmContainer
getCpmContainer(
const CollectivePerceptionMessage &cpm,
const uint8_t container_id) {
154 for (
int i = 0; i < cpm.payload.cpm_containers.value.array.size(); i++) {
155 if (cpm.payload.cpm_containers.value.array[i].container_id.value == container_id) {
156 return cpm.payload.cpm_containers.value.array[i];
159 throw std::invalid_argument(
"No Container with ID " + std::to_string(container_id) +
" found in CPM");
171 return getCpmContainer(cpm, WrappedCpmContainer::CHOICE_CONTAINER_DATA_PERCEIVED_OBJECT_CONTAINER);
182 if (container.container_id.value != WrappedCpmContainer::CHOICE_CONTAINER_DATA_PERCEIVED_OBJECT_CONTAINER) {
183 throw std::invalid_argument(
"Container is not a PerceivedObjectContainer");
185 uint8_t number = container.container_data_perceived_object_container.number_of_perceived_objects.value;
213 throw std::invalid_argument(
"Index out of range");
215 return container.container_data_perceived_object_container.perceived_objects.array[i];
235 return coordinate.value.value;
245 return coordinate.confidence.value;
258 if (
object.position.z_coordinate_is_present) {
274 double z_confidence =
object.position.z_coordinate_is_present
276 : std::numeric_limits<double>::infinity();
277 return std::make_tuple(x_confidence, y_confidence, z_confidence);
307 if (!
object.angles_is_present)
throw std::invalid_argument(
"No angles present in PerceivedObject");
309 double roll{0}, pitch{0}, yaw{0};
311 if (
object.angles.x_angle_is_present) {
315 if (
object.angles.y_angle_is_present) {
322 q.
setRPY(roll, pitch, yaw);
335 tf2::Quaternion q(orientation.x, orientation.y, orientation.z, orientation.w);
336 double roll, pitch, yaw;
349 if(!
object.angles_is_present)
throw std::invalid_argument(
"No angles present in PerceivedObject");
351 yaw_confidence *= M_PI / 180.0;
352 return yaw_confidence;
376 if (!
object.z_angular_velocity_is_present)
throw std::invalid_argument(
"No yaw rate present in PerceivedObject");
377 return object.z_angular_velocity.value.value * M_PI / 180.0;
390 if (!
object.z_angular_velocity_is_present)
throw std::invalid_argument(
"No yaw rate present in PerceivedObject");
391 auto val =
object.z_angular_velocity.confidence.value;
392 static const std::map<uint8_t, double> confidence_map = {
393 {AngularSpeedConfidence::UNAVAILABLE, 0.0},
394 {AngularSpeedConfidence::DEG_SEC_01, 1.0},
395 {AngularSpeedConfidence::DEG_SEC_02, 2.0},
396 {AngularSpeedConfidence::DEG_SEC_05, 5.0},
397 {AngularSpeedConfidence::DEG_SEC_10, 10.0},
398 {AngularSpeedConfidence::DEG_SEC_20, 20.0},
399 {AngularSpeedConfidence::DEG_SEC_50, 50.0},
400 {AngularSpeedConfidence::OUT_OF_RANGE, std::numeric_limits<double>::infinity()},
411 inline double getVelocityComponent(
const VelocityComponent &velocity) {
return double(velocity.value.value) / 100.0; }
431 if (!
object.velocity_is_present)
throw std::invalid_argument(
"No velocity present in PerceivedObject");
432 if (
object.velocity.choice != Velocity3dWithConfidence::CHOICE_CARTESIAN_VELOCITY) {
433 throw std::invalid_argument(
"Velocity is not Cartesian");
435 gm::Vector3 velocity;
438 if (
object.velocity.cartesian_velocity.z_velocity_is_present) {
453 if (!
object.velocity_is_present)
throw std::invalid_argument(
"No velocity present in PerceivedObject");
454 if (
object.velocity.choice != Velocity3dWithConfidence::CHOICE_CARTESIAN_VELOCITY) {
455 throw std::invalid_argument(
"Velocity is not Cartesian");
459 double z_confidence =
object.velocity.cartesian_velocity.z_velocity_is_present
461 : std::numeric_limits<double>::infinity();
462 return std::make_tuple(x_confidence, y_confidence, z_confidence);
472 return double(acceleration.value.value) / 10.0;
493 if (!
object.acceleration_is_present)
throw std::invalid_argument(
"No acceleration present in PerceivedObject");
494 if (
object.acceleration.choice != Acceleration3dWithConfidence::CHOICE_CARTESIAN_ACCELERATION) {
495 throw std::invalid_argument(
"Acceleration is not Cartesian");
497 gm::Vector3 acceleration;
500 if (
object.acceleration.cartesian_acceleration.z_acceleration_is_present) {
515 if (!
object.acceleration_is_present)
throw std::invalid_argument(
"No acceleration present in PerceivedObject");
516 if (
object.acceleration.choice != Acceleration3dWithConfidence::CHOICE_CARTESIAN_ACCELERATION) {
517 throw std::invalid_argument(
"Acceleration is not Cartesian");
521 double z_confidence =
object.acceleration.cartesian_acceleration.z_acceleration_is_present
523 : std::numeric_limits<double>::infinity();
524 return std::make_tuple(x_confidence, y_confidence, z_confidence);
539 if (!
object.object_dimension_x_is_present)
throw std::invalid_argument(
"No x-dimension present in PerceivedObject");
540 return object.object_dimension_x.value.value;
551 if (!
object.object_dimension_x_is_present)
throw std::invalid_argument(
"No x-dimension present in PerceivedObject");
552 return object.object_dimension_x.confidence.value;
567 if (!
object.object_dimension_y_is_present)
throw std::invalid_argument(
"No y-dimension present in PerceivedObject");
568 return object.object_dimension_y.value.value;
579 if (!
object.object_dimension_y_is_present)
throw std::invalid_argument(
"No y-dimension present in PerceivedObject");
580 return object.object_dimension_y.confidence.value;
595 if (!
object.object_dimension_z_is_present)
throw std::invalid_argument(
"No z-dimension present in PerceivedObject");
596 return object.object_dimension_z.value.value;
607 if (!
object.object_dimension_z_is_present)
throw std::invalid_argument(
"No z-dimension present in PerceivedObject");
608 return object.object_dimension_z.confidence.value;
621 gm::Vector3 dimensions;
638 return {conf_x, conf_y, conf_z};
652 const PerceivedObject &
object) {
653 gm::PointStamped utm_position;
657 utm_position.header.frame_id = reference_position.header.frame_id;
658 utm_position.point.x = reference_position.point.x + relative_position.x;
659 utm_position.point.y = reference_position.point.y + relative_position.y;
660 utm_position.point.z = reference_position.point.z + relative_position.z;
684 inline uint8_t
getSensorID(
const SensorInformation &sensor_information) {
685 return sensor_information.sensor_id.value;
695 return sensor_information.sensor_type.value;