184 const uint16_t x_confidence = CoordinateConfidence::UNAVAILABLE,
185 const uint16_t y_confidence = CoordinateConfidence::UNAVAILABLE,
186 const uint16_t z_confidence = CoordinateConfidence::UNAVAILABLE) {
189 if (point.z != 0.0) {
191 object.position.z_coordinate_is_present =
true;
211 const gm::PointStamped& utm_position,
212 const uint16_t x_confidence = CoordinateConfidence::UNAVAILABLE,
213 const uint16_t y_confidence = CoordinateConfidence::UNAVAILABLE,
214 const uint16_t z_confidence = CoordinateConfidence::UNAVAILABLE) {
216 if (utm_position.header.frame_id != reference_position.header.frame_id) {
217 throw std::invalid_argument(
"UTM-Position frame_id (" + utm_position.header.frame_id +
218 ") does not match the reference position frame_id (" + reference_position.header.frame_id +
222 (utm_position.point.x - reference_position.point.x) * 100, x_confidence);
224 (utm_position.point.y - reference_position.point.y) * 100, y_confidence);
225 if (utm_position.point.z != 0.0) {
227 (utm_position.point.z - reference_position.point.z) * 100, z_confidence);
228 object.position.z_coordinate_is_present =
true;
244 const uint8_t confidence = SpeedConfidence::UNAVAILABLE) {
246 if (value < VelocityComponentValue::NEGATIVE_OUT_OF_RANGE) {
247 velocity.value.value = VelocityComponentValue::NEGATIVE_OUT_OF_RANGE;
248 }
else if (value > VelocityComponentValue::POSITIVE_OUT_OF_RANGE) {
249 velocity.value.value = VelocityComponentValue::POSITIVE_OUT_OF_RANGE;
251 velocity.value.value = value;
255 if (confidence > SpeedConfidence::MAX || confidence < SpeedConfidence::MIN) {
256 velocity.confidence.value = SpeedConfidence::OUT_OF_RANGE;
258 velocity.confidence.value = confidence;
274inline void setVelocityOfPerceivedObject(PerceivedObject&
object,
const gm::Vector3& cartesian_velocity,
275 const uint8_t x_confidence = SpeedConfidence::UNAVAILABLE,
276 const uint8_t y_confidence = SpeedConfidence::UNAVAILABLE,
277 const uint8_t z_confidence = SpeedConfidence::UNAVAILABLE) {
278 object.velocity.choice = Velocity3dWithConfidence::CHOICE_CARTESIAN_VELOCITY;
279 setVelocityComponent(
object.velocity.cartesian_velocity.x_velocity, cartesian_velocity.x * 100, x_confidence * 100);
280 setVelocityComponent(
object.velocity.cartesian_velocity.y_velocity, cartesian_velocity.y * 100, y_confidence * 100);
281 if (cartesian_velocity.z != 0.0) {
282 setVelocityComponent(
object.velocity.cartesian_velocity.z_velocity, cartesian_velocity.z * 100, z_confidence * 100);
283 object.velocity.cartesian_velocity.z_velocity_is_present =
true;
285 object.velocity_is_present =
true;
299inline void setAccelerationComponent(AccelerationComponent& acceleration,
const int16_t value,
300 const uint8_t confidence = AccelerationConfidence::UNAVAILABLE) {
302 if (value < AccelerationValue::NEGATIVE_OUT_OF_RANGE) {
303 acceleration.value.value = AccelerationValue::NEGATIVE_OUT_OF_RANGE;
304 }
else if (value > AccelerationValue::POSITIVE_OUT_OF_RANGE) {
305 acceleration.value.value = AccelerationValue::POSITIVE_OUT_OF_RANGE;
307 acceleration.value.value = value;
311 if (confidence > AccelerationConfidence::MAX || confidence < AccelerationConfidence::MIN) {
312 acceleration.confidence.value = AccelerationConfidence::OUT_OF_RANGE;
314 acceleration.confidence.value = confidence;
331 const uint8_t x_confidence = AccelerationConfidence::UNAVAILABLE,
332 const uint8_t y_confidence = AccelerationConfidence::UNAVAILABLE,
333 const uint8_t z_confidence = AccelerationConfidence::UNAVAILABLE) {
334 object.acceleration.choice = Acceleration3dWithConfidence::CHOICE_CARTESIAN_ACCELERATION;
339 if (cartesian_acceleration.z != 0.0) {
342 object.acceleration.cartesian_acceleration.z_acceleration_is_present =
true;
344 object.acceleration_is_present =
true;
357inline void setYawOfPerceivedObject(PerceivedObject&
object,
const double yaw,
358 const uint8_t confidence = AngleConfidence::UNAVAILABLE) {
360 double yaw_in_degrees = yaw * 180 / M_PI + 180;
361 while (yaw_in_degrees > 360.0) yaw_in_degrees -= 360.0;
362 while (yaw_in_degrees < 0) yaw_in_degrees += 360.0;
363 object.angles.z_angle.value.value = yaw_in_degrees * 10;
365 if (confidence > AngleConfidence::MAX || confidence < AngleConfidence::MIN) {
366 object.angles.z_angle.confidence.value = AngleConfidence::OUT_OF_RANGE;
368 object.angles.z_angle.confidence.value = confidence;
370 object.angles_is_present =
true;
384inline void setYawRateOfPerceivedObject(PerceivedObject&
object,
const double yaw_rate,
385 const uint8_t confidence = AngularSpeedConfidence::UNAVAILABLE) {
386 int16_t yaw_rate_in_degrees = yaw_rate * 180 / M_PI;
387 if (yaw_rate_in_degrees != CartesianAngularVelocityComponentValue::UNAVAILABLE) {
389 if (yaw_rate_in_degrees < CartesianAngularVelocityComponentValue::NEGATIVE_OUTOF_RANGE) {
390 yaw_rate_in_degrees = CartesianAngularVelocityComponentValue::NEGATIVE_OUTOF_RANGE;
391 }
else if (yaw_rate_in_degrees > CartesianAngularVelocityComponentValue::POSITIVE_OUT_OF_RANGE) {
392 yaw_rate_in_degrees = CartesianAngularVelocityComponentValue::POSITIVE_OUT_OF_RANGE;
395 object.z_angular_velocity.value.value = yaw_rate_in_degrees;
396 object.z_angular_velocity.confidence.value = confidence;
397 object.z_angular_velocity_is_present =
true;
415 const uint8_t confidence = ObjectDimensionConfidence::UNAVAILABLE) {
417 if (value < ObjectDimensionValue::MIN || value > ObjectDimensionValue::MAX) {
418 dimension.value.value = ObjectDimensionValue::OUT_OF_RANGE;
420 dimension.value.value = value;
424 if (confidence > ObjectDimensionConfidence::MAX || confidence < ObjectDimensionConfidence::MIN) {
425 dimension.confidence.value = ObjectDimensionConfidence::OUT_OF_RANGE;
427 dimension.confidence.value = confidence;
442 const uint8_t confidence = ObjectDimensionConfidence::UNAVAILABLE) {
443 setObjectDimension(
object.object_dimension_x, (uint16_t)(value * 10), confidence * 10);
444 object.object_dimension_x_is_present =
true;
458 const uint8_t confidence = ObjectDimensionConfidence::UNAVAILABLE) {
459 setObjectDimension(
object.object_dimension_y, (uint16_t)(value * 10), confidence * 10);
460 object.object_dimension_y_is_present =
true;
473inline void setZDimensionOfPerceivedObject(PerceivedObject&
object,
const double value,
474 const uint8_t confidence = ObjectDimensionConfidence::UNAVAILABLE) {
475 setObjectDimension(
object.object_dimension_z, (uint16_t)(value * 10), confidence * 10);
476 object.object_dimension_z_is_present =
true;
491 const uint8_t x_confidence = ObjectDimensionConfidence::UNAVAILABLE,
492 const uint8_t y_confidence = ObjectDimensionConfidence::UNAVAILABLE,
493 const uint8_t z_confidence = ObjectDimensionConfidence::UNAVAILABLE) {
508inline void initPerceivedObject(PerceivedObject&
object,
const gm::Point& point,
const int16_t delta_time = 0) {
509 setPositionOfPerceivedObject(
object, point);
525inline void initPerceivedObjectWithUTMPosition(CollectivePerceptionMessage& cpm, PerceivedObject&
object,
526 const gm::PointStamped& point,
const int16_t delta_time = 0) {
527 setUTMPositionOfPerceivedObject(cpm,
object, point);
528 setMeasurementDeltaTimeOfPerceivedObject(
object, delta_time);
541 container.container_id.value = WrappedCpmContainer::CHOICE_CONTAINER_DATA_PERCEIVED_OBJECT_CONTAINER;
542 container.container_data_perceived_object_container.number_of_perceived_objects.value = n_objects;
558inline void addPerceivedObjectToContainer(WrappedCpmContainer& container,
const PerceivedObject& perceived_object) {
559 if (container.container_id.value == WrappedCpmContainer::CHOICE_CONTAINER_DATA_PERCEIVED_OBJECT_CONTAINER) {
560 container.container_data_perceived_object_container.perceived_objects.array.push_back(perceived_object);
561 container.container_data_perceived_object_container.number_of_perceived_objects.value =
562 container.container_data_perceived_object_container.perceived_objects.array.size();
564 throw std::invalid_argument(
"Container is not a PerceivedObjectContainer");
580inline void addContainerToCPM(CollectivePerceptionMessage& cpm,
const WrappedCpmContainer& container) {
582 if (cpm.payload.cpm_containers.value.array.size() < WrappedCpmContainers::MAX_SIZE) {
583 cpm.payload.cpm_containers.value.array.push_back(container);
585 throw std::invalid_argument(
"Maximum number of CPM-Containers reached");