etsi_its_messages v3.4.0
Loading...
Searching...
No Matches
cdd_getters_common.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#ifndef ETSI_ITS_MSGS_UTILS_IMPL_CDD_CDD_GETTERS_COMMON_H
10#define ETSI_ITS_MSGS_UTILS_IMPL_CDD_CDD_GETTERS_COMMON_H
11
12#include <array>
13#include <cmath>
14#include <cstdint>
15#include <GeographicLib/UTMUPS.hpp>
16
23inline uint32_t getStationID(const ItsPduHeader& header) { return header.station_id.value; }
24
31inline double getLatitude(const Latitude& latitude) { return ((double)latitude.value) * 1e-7; }
32
39inline double getLongitude(const Longitude& longitude) { return ((double)longitude.value) * 1e-7; }
40
47inline double getAltitude(const Altitude& altitude) {
48 if (altitude.altitude_value.value == AltitudeValue::UNAVAILABLE) {
49 return 0.0;
50 }
51 return ((double)altitude.altitude_value.value) * 1e-2;
52}
53
60inline double getSpeed(const Speed& speed) { return ((double)speed.speed_value.value) * 1e-2; }
61
68inline double getSpeedConfidence(const Speed& speed) {
69 return ((double)speed.speed_confidence.value) / etsi_its_msgs::ONE_D_GAUSSIAN_FACTOR * 1e-2;
70}
71
78template <typename AccelerationMagnitude>
79inline double getAccelerationMagnitude(const AccelerationMagnitude& acceleration_magnitude) {
80 return ((double)acceleration_magnitude.acceleration_magnitude_value.value) * 1e-1;
81}
82
89template <typename AccelerationMagnitude>
90inline double getAccelerationMagnitudeConfidence(const AccelerationMagnitude& acceleration_magnitude) {
91 return ((double)acceleration_magnitude.acceleration_confidence.value) / etsi_its_msgs::ONE_D_GAUSSIAN_FACTOR * 1e-1;
92}
93
105template <typename T>
106inline gm::PointStamped getUTMPosition(const T& reference_position, int& zone, bool& northp) {
107 gm::PointStamped utm_point;
108 double latitude = getLatitude(reference_position.latitude);
109 double longitude = getLongitude(reference_position.longitude);
110 utm_point.point.z = getAltitude(reference_position.altitude);
111 try {
112 GeographicLib::UTMUPS::Forward(latitude, longitude, zone, northp, utm_point.point.x, utm_point.point.y);
113 std::string hemisphere;
114 if (northp) {
115 hemisphere = "N";
116 } else {
117 hemisphere = "S";
118 }
119 utm_point.header.frame_id = "utm_" + std::to_string(zone) + hemisphere;
120 } catch (GeographicLib::GeographicErr& e) {
121 throw std::invalid_argument(e.what());
122 }
123 return utm_point;
124}
125
134template <typename Heading>
135inline double getHeadingCDD(const Heading& heading) { return ((double)heading.heading_value.value) * 1e-1; }
136
145template <typename Heading>
146inline double getHeadingConfidenceCDD(const Heading& heading) { return ((double)heading.heading_confidence.value) * 1e-1 / etsi_its_msgs::ONE_D_GAUSSIAN_FACTOR; }
147
154template <typename YawRate>
155inline double getYawRateCDD(const YawRate& yaw_rate) {
156 return ((double)yaw_rate.yaw_rate_value.value) * 1e-2; // Yaw rate in deg/s
157}
158
165template <typename YawRate, typename YawRateConfidence = decltype(YawRate::yaw_rate_confidence)>
166inline double getYawRateConfidenceCDD(const YawRate& yaw_rate) {
167 auto val = yaw_rate.yaw_rate_confidence.value;
168 static const std::map<uint8_t, double> confidence_map = {
169 {YawRateConfidence::UNAVAILABLE, std::numeric_limits<double>::infinity()},
170 {YawRateConfidence::DEG_SEC_000_01, 0.01},
171 {YawRateConfidence::DEG_SEC_000_05, 0.05},
172 {YawRateConfidence::DEG_SEC_000_10, 0.1},
173 {YawRateConfidence::DEG_SEC_001_00, 1.0},
174 {YawRateConfidence::DEG_SEC_005_00, 5.0},
175 {YawRateConfidence::DEG_SEC_010_00, 10.0},
176 {YawRateConfidence::DEG_SEC_100_00, 100.0},
177 {YawRateConfidence::OUT_OF_RANGE, std::numeric_limits<double>::infinity()},
178 };
179 return confidence_map.at(val) / etsi_its_msgs::ONE_D_GAUSSIAN_FACTOR;
180}
181
182
189template <typename SemiAxisLength>
190inline double getSemiAxis(const SemiAxisLength& semi_axis_length) {
191 return ((double)semi_axis_length.value) * 1e-2 / etsi_its_msgs::OneCentimeterHelper<SemiAxisLength>::value;
192}
193
200template <typename PosConfidenceEllipse>
201inline std::tuple<double, double, double> getPosConfidenceEllipse(const PosConfidenceEllipse& position_confidence_ellipse) {
202 return {
203 getSemiAxis(position_confidence_ellipse.semi_major_confidence),
204 getSemiAxis(position_confidence_ellipse.semi_minor_confidence),
205 position_confidence_ellipse.semi_major_orientation.value * 1e-1
206 };
207}
208
220inline std::array<double, 4> CovMatrixFromConfidenceEllipse(double semi_major, double semi_minor, double major_orientation, const double object_heading) {
221 std::array<double, 4> covariance_matrix;
222 double semi_major_squared = semi_major * semi_major / (etsi_its_msgs::TWO_D_GAUSSIAN_FACTOR * etsi_its_msgs::TWO_D_GAUSSIAN_FACTOR);
223 double semi_minor_squared = semi_minor * semi_minor / (etsi_its_msgs::TWO_D_GAUSSIAN_FACTOR * etsi_its_msgs::TWO_D_GAUSSIAN_FACTOR);
224 double major_orientation_rad = major_orientation * M_PI / 180;
225 double object_heading_rad = object_heading;
226
227 double angle_to_object = object_heading_rad - major_orientation_rad;
228
229 double cos_angle = std::cos(angle_to_object);
230 double sin_angle = std::sin(angle_to_object);
231 covariance_matrix[0] = semi_major_squared * cos_angle * cos_angle + semi_minor_squared * sin_angle * sin_angle;
232 covariance_matrix[1] = (semi_major_squared - semi_minor_squared) * cos_angle * sin_angle;
233 covariance_matrix[2] = covariance_matrix[1];
234 covariance_matrix[3] = semi_major_squared * sin_angle * sin_angle + semi_minor_squared * cos_angle * cos_angle;
235
236 return covariance_matrix;
237}
238
249inline std::array<double, 4> WGSCovMatrixFromConfidenceEllipse(double semi_major, double semi_minor, double major_orientation) {
250 // The WGS covariance matrix is the same as in vehicle coordinates, if it would have a heading of 0.0
251 return CovMatrixFromConfidenceEllipse(semi_major, semi_minor, major_orientation, 0.0);
252}
253
261template <typename PosConfidenceEllipse>
262inline std::array<double, 4> getPosConfidenceEllipse(const PosConfidenceEllipse& position_confidence_ellipse, const double object_heading){
263 auto [semi_major, semi_minor, major_orientation] = getPosConfidenceEllipse(position_confidence_ellipse);
264 return CovMatrixFromConfidenceEllipse(semi_major, semi_minor, major_orientation, object_heading);
265}
266
274template <typename PosConfidenceEllipse>
275inline std::array<double, 4> getWGSPosConfidenceEllipse(const PosConfidenceEllipse& position_confidence_ellipse){
276 auto [semi_major, semi_minor, major_orientation] = getPosConfidenceEllipse(position_confidence_ellipse);
277 return WGSCovMatrixFromConfidenceEllipse(semi_major, semi_minor, major_orientation);
278}
279
280#endif // ETSI_ITS_MSGS_UTILS_IMPL_CDD_CDD_GETTERS_COMMON_H
double getHeadingCDD(const Heading &heading)
Get the Heading value.
double getSpeedConfidence(const Speed &speed)
Get the Speed Confidence.
gm::PointStamped getUTMPosition(const T &reference_position, int &zone, bool &northp)
Get the UTM Position defined by the given ReferencePosition.
double getAccelerationMagnitude(const AccelerationMagnitude &acceleration_magnitude)
Get the AccelerationMagnitude value.
double getSemiAxis(const SemiAxisLength &semi_axis_length)
Get the Semi Axis object.
std::array< double, 4 > getWGSPosConfidenceEllipse(const PosConfidenceEllipse &position_confidence_ellipse)
Get the covariance matrix of the position confidence ellipse.
double getLatitude(const Latitude &latitude)
Get the Latitude value.
double getAccelerationMagnitudeConfidence(const AccelerationMagnitude &acceleration_magnitude)
Get the AccelerationMagnitude Confidence.
double getHeadingConfidenceCDD(const Heading &heading)
Get the Heading value.
double getYawRateConfidenceCDD(const YawRate &yaw_rate)
Get the Yaw Rate Confidence.
std::tuple< double, double, double > getPosConfidenceEllipse(const PosConfidenceEllipse &position_confidence_ellipse)
Extract major axis length, minor axis length and orientation from the given position confidence ellip...
double getLongitude(const Longitude &longitude)
Get the Longitude value.
double getYawRateCDD(const YawRate &yaw_rate)
Get the Yaw Rate value.
std::array< double, 4 > CovMatrixFromConfidenceEllipse(double semi_major, double semi_minor, double major_orientation, const double object_heading)
Convert the confidence ellipse to a covariance matrix.
uint32_t getStationID(const ItsPduHeader &header)
Get the StationID of ItsPduHeader.
std::array< double, 4 > WGSCovMatrixFromConfidenceEllipse(double semi_major, double semi_minor, double major_orientation)
Convert the confidence ellipse to a covariance matrix.
double getAltitude(const Altitude &altitude)
Get the Altitude value.
double getSpeed(const Speed &speed)
Get the vehicle speed.