etsi_its_messages v3.4.0
Loading...
Searching...
No Matches
cam_setters.h
Go to the documentation of this file.
1// SPDX-License-Identifier: MIT
2// Copyright Institute for Automotive Engineering (ika), RWTH Aachen University
3
8
9#pragma once
10
11namespace etsi_its_cam_msgs::access {
12
14
21 */
22inline void setItsPduHeader(CAM &cam, const uint32_t station_id, const uint8_t protocol_version = 0) {
23 setItsPduHeader(cam.header, ItsPduHeader::MESSAGE_ID_CAM, station_id, protocol_version);
24}
28 *
29 * @param accel object to set
30 * @param value LongitudinalAccelerationValue in m/s^2 as decimal number (braking is negative)
31 */
32inline void setLongitudinalAccelerationValue(LongitudinalAccelerationValue& accel, const double value) {
33 auto accel_val = std::round(value * 1e1);
34 if (accel_val >= LongitudinalAccelerationValue::MIN && accel_val <= LongitudinalAccelerationValue::MAX) {
35 accel.value = static_cast<int16_t>(accel_val);
36 } else if (accel_val < LongitudinalAccelerationValue::MIN) {
37 accel.value = LongitudinalAccelerationValue::MIN;
38 } else if (accel_val > LongitudinalAccelerationValue::MAX) {
39 accel.value = LongitudinalAccelerationValue::MAX - 1;
40 }
41}
42
45
52 */
53inline void setLongitudinalAcceleration(LongitudinalAcceleration& accel, const double value, const double confidence = std::numeric_limits<double>::infinity()) {
54 setAccelerationConfidence(accel.longitudinal_acceleration_confidence, confidence);
55 setLongitudinalAccelerationValue(accel.longitudinal_acceleration_value, value);
56}
57
64inline void setLateralAccelerationValue(LateralAccelerationValue& accel, const double value) {
65 int64_t accel_val = (int64_t)std::round(value * 1e1);
66 if (accel_val >= LateralAccelerationValue::MIN && accel_val <= LateralAccelerationValue::MAX) {
67 accel.value = accel_val;
68 } else if (accel_val < LateralAccelerationValue::MIN) {
69 accel.value = LateralAccelerationValue::MIN;
70 } else if (accel_val > LateralAccelerationValue::MAX) {
71 accel.value = LateralAccelerationValue::MAX - 1;
72 }
73}
74
79 *
80 * @param accel object to set
81 * @param value LaterallAccelerationValue in m/s^2 as decimal number (left is positive)
82 * @param confidence standard deviation of the lateral acceleration in m/s^2 as decimal number
83 * Default is infinity, mapping to AccelerationConfidence::UNAVAILABLE
84 */
85inline void setLateralAcceleration(LateralAcceleration& accel, const double value, const double confidence = std::numeric_limits<double>::infinity()) {
86 setAccelerationConfidence(accel.lateral_acceleration_confidence, confidence);
87 setLateralAccelerationValue(accel.lateral_acceleration_value, value);
88}
89
101inline void setRefPosConfidence(CAM& cam, const std::array<double, 4>& covariance_matrix, const double object_heading) {
102 // First ensure, that the object has the correct heading by setting its value
103 double orientation = object_heading * 180 / M_PI; // Convert to degrees
104 // Normalize to [0, 360)
105 orientation = std::fmod(orientation + 360, 360);
106 while (orientation < 0) {
107 orientation += 360;
108 }
109 while (orientation >= 360) {
110 orientation -= 360;
111 }
112 setHeading(cam, orientation);
113 setPosConfidenceEllipse(cam.cam.cam_parameters.basic_container.reference_position.position_confidence_ellipse,
114 covariance_matrix, object_heading);
115}
116
117/**
118 * @brief Set the confidence of the reference position
119 *
120 * @param cam CAM-Message to set the confidence
121 * @param covariance_matrix The four values of the covariance matrix in the order: cov_xx, cov_xy, cov_yx, cov_yy
122 * The matrix has to be SPD, otherwise a std::invalid_argument exception is thrown.
123 * Its coordinate system is WGS84 (x = North, y = East)
124 */
125inline void setWGSRefPosConfidence(CAM& cam, const std::array<double, 4>& covariance_matrix) {
126 setWGSPosConfidenceEllipse(cam.cam.cam_parameters.basic_container.reference_position.position_confidence_ellipse,
127 covariance_matrix);
128}
130} // namespace etsi_its_cam_msgs::access
void setLateralAcceleration(LateralAcceleration &accel, const double value, const double confidence=std::numeric_limits< double >::infinity())
Set the LateralAcceleration object.
Definition cam_setters.h:85
void setLongitudinalAccelerationValue(LongitudinalAccelerationValue &accel, const double value)
Set the LongitudinalAccelerationValue object.
Definition cam_setters.h:32
void setItsPduHeader(ItsPduHeader &header, const uint8_t message_id, const uint32_t station_id, const uint8_t protocol_version=0)
Set the Its Pdu Header object.
Definition cam_setters.h:25
void setRefPosConfidence(CAM &cam, const std::array< double, 4 > &covariance_matrix, const double object_heading)
Set the confidence of the reference position.
void setLongitudinalAcceleration(LongitudinalAcceleration &accel, const double value, const double confidence=std::numeric_limits< double >::infinity())
Set the LongitudinalAcceleration object.
Definition cam_setters.h:53
void setLateralAccelerationValue(LateralAccelerationValue &accel, const double value)
Set the LateralAccelerationValue object.
Definition cam_setters.h:64
void setWGSPosConfidenceEllipse(PosConfidenceEllipse &position_confidence_ellipse, const std::array< double, 4 > &covariance_matrix)
Set the Pos Confidence Ellipse object.
void setAccelerationConfidence(AccelerationConfidence &accel_confidence, const double value)
Set the Acceleration Confidence object.
void setWGSRefPosConfidence(CAM &cam, const std::array< double, 4 > &covariance_matrix)
Set the confidence of the reference position.
Common setter functions for the ETSI ITS CAM (EN and TS).
void setHeading(CAM &cam, const double heading_val, const double confidence=std::numeric_limits< double >::infinity())
Set the Heading for a CAM.
void setPosConfidenceEllipse(PosConfidenceEllipse &position_confidence_ellipse, const double semi_major_axis, const double semi_minor_axis, const double orientation)
Set the Pos Confidence Ellipse object.
Setter functions for the ETSI ITS Common Data Dictionary (CDD) v1.3.1.