etsi_its_messages v3.4.0
Loading...
Searching...
No Matches
mcm_getters.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_mcm_uulm_msgs::access {
12
19inline double getLatitude(const Latitude& latitude) { return ((double)latitude.value) * 1e-7; }
20
27inline double getLongitude(const Longitude& longitude) { return ((double)longitude.value) * 1e-7; }
28
35inline double getAltitude(const Altitude& altitude) {
36 if (altitude.altitude_value.value == AltitudeValue::UNAVAILABLE) {
37 return 0.0;
38 }
39
40 return ((double)altitude.altitude_value.value) * 1e-2;
41}
42
55template <typename T>
56inline gm::PointStamped getUTMPosition(const T& reference_position, int& zone, bool& northp, double& conv_angle) {
57 gm::PointStamped utm_point;
58 double latitude = getLatitude(reference_position.latitude);
59 double longitude = getLongitude(reference_position.longitude);
60 utm_point.point.z = getAltitude(reference_position.altitude);
61 try {
62 double scale;
63 GeographicLib::UTMUPS::Forward(latitude, longitude, zone, northp, utm_point.point.x, utm_point.point.y, conv_angle,
64 scale);
65 std::string hemisphere;
66 if (northp) {
67 hemisphere = "N";
68 } else {
69 hemisphere = "S";
70 }
71 utm_point.header.frame_id = "utm_" + std::to_string(zone) + hemisphere;
72 } catch (GeographicLib::GeographicErr& e) {
73 throw std::invalid_argument(e.what());
74 }
75 return utm_point;
76}
77
90inline gm::PointStamped getUTMPosition(const MCM& mcm, int& zone, bool& northp, double& conv_angle) {
91 return getUTMPosition(mcm.mcm.mcm_parameters.basic_container.reference_position, zone, northp, conv_angle);
92}
93
105inline gm::PointStamped getUTMPosition(const MCM& mcm, int& zone, bool& northp) {
106 double conv_angle; // unused, but required by the function signature
107 return getUTMPosition(mcm.mcm.mcm_parameters.basic_container.reference_position, zone, northp, conv_angle);
108}
109
119inline gm::PointStamped getUTMPosition(const MCM& mcm) {
120 int zone; // unused, but required by the function signature
121 bool northp; // unused, but required by the function signature
122 double conv_angle; // unused, but required by the function signature
123 return getUTMPosition(mcm.mcm.mcm_parameters.basic_container.reference_position, zone, northp, conv_angle);
124}
125
126// ---------- suggested maneuver container getters ----------
127
135inline SuggestedManeuverContainer getSuggestedManeuverContainer(const MCM& mcm) {
136 if (mcm.mcm.mcm_parameters.maneuver_container.choice != ManeuverContainer::CHOICE_SUGGESTED_MANEUVER_CONTAINER) {
137 throw std::invalid_argument("No suggested maneuver container present in MCM");
138 }
139 return mcm.mcm.mcm_parameters.maneuver_container.suggested_maneuver_container;
140}
141
148inline uint32_t getTargetStationId(const SuggestedManeuverContainer& suggested_maneuver_container) {
149 return suggested_maneuver_container.target_station_id.value;
150}
151
159inline SuggestedManeuver getSuggestedManeuver(const SuggestedManeuverContainer& suggested_maneuver_container) {
160 if (!suggested_maneuver_container.suggested_maneuver_is_present) {
161 throw std::invalid_argument("No suggested maneuver present in SuggestedManeuverContainer");
162 }
163 return suggested_maneuver_container.suggested_maneuver;
164}
165
172inline SuggestedManeuver getSuggestedManeuver(const MCM& mcm) {
174}
175
182inline uint16_t getManeuverId(const SuggestedManeuver& suggested_maneuver) {
183 return suggested_maneuver.maneuver_id.value;
184}
185
192inline uint16_t getAdviceUpdateId(const SuggestedManeuver& suggested_maneuver) {
193 return suggested_maneuver.advice_update_id.value;
194}
195
202inline bool getConfirmationRequiredFlag(const SuggestedManeuver& suggested_maneuver) {
203 return suggested_maneuver.confirmation_required_flag.value;
204}
205
213inline ManeuverConstraints getManeuverConstraints(const SuggestedManeuver& suggested_maneuver) {
214 if (suggested_maneuver.maneuver_parameters.choice != ManeuverParameters::CHOICE_MANEUVER_CONSTRAINTS) {
215 throw std::invalid_argument("No maneuver constraints present in SuggestedManeuver");
216 }
217 return suggested_maneuver.maneuver_parameters.maneuver_constraints;
218}
219
226inline ManeuverConstraints getManeuverConstraints(const MCM& mcm) {
228}
229
236inline std::vector<LongitudinalWaypoint> getLongitudinalWaypoints(const ManeuverConstraints& maneuver_constraints) {
237 return maneuver_constraints.longitudinal_maneuver_waypoint_container.array;
238}
239
246inline std::vector<LongitudinalWaypoint> getLongitudinalWaypoints(const MCM& mcm) {
248}
249
256inline gm::Point getWaypointDelta(const LongitudinalWaypoint& longitudinal_waypoint) {
257 gm::Point point;
258 point.x = static_cast<double>(longitudinal_waypoint.waypoint.x_distance.value * 1e-2); // convert cm to m
259 point.y = static_cast<double>(longitudinal_waypoint.waypoint.y_distance.value * 1e-2); // convert cm to m
260 point.z = 0.0; // z-coordinate is not used in longitudinal waypoints
261 return point;
262}
263
270inline double getMinArrivalTimeDelta(const LongitudinalWaypoint& longitudinal_waypoint) {
271 return static_cast<double>(longitudinal_waypoint.min_arrival_time.value * 1e-3); // convert ms to s
272}
273
280inline double getMaxArrivalTimeDelta(const LongitudinalWaypoint& longitudinal_waypoint) {
281 return static_cast<double>(longitudinal_waypoint.max_arrival_time.value * 1e-3); // convert ms to s
282}
283
291inline double getMinVelocity(const LongitudinalWaypoint& longitudinal_waypoint) {
292 if (!longitudinal_waypoint.min_velocity_is_present) {
293 throw std::invalid_argument("No min velocity present in LongitudinalWaypoint");
294 } else if (longitudinal_waypoint.min_velocity.value == SpeedValue::UNAVAILABLE) {
295 return std::numeric_limits<double>::quiet_NaN();
296 }
297 return static_cast<double>(longitudinal_waypoint.min_velocity.value * 1e-2); // convert cm/s to m/s
298}
299
307inline double getMaxVelocity(const LongitudinalWaypoint& longitudinal_waypoint) {
308 if (!longitudinal_waypoint.max_velocity_is_present) {
309 throw std::invalid_argument("No max velocity present in LongitudinalWaypoint");
310 } else if (longitudinal_waypoint.max_velocity.value == SpeedValue::UNAVAILABLE) {
311 return std::numeric_limits<double>::quiet_NaN();
312 }
313 return static_cast<double>(longitudinal_waypoint.max_velocity.value * 1e-2); // convert cm/s to m/s
314}
315
316// ---------- road user container getters ----------
317
325inline RoadUserContainer getRoadUserContainer(const MCM& mcm) {
326 if (mcm.mcm.mcm_parameters.maneuver_container.choice != ManeuverContainer::CHOICE_ROAD_USER_CONTAINER) {
327 throw std::invalid_argument("No road user container present in MCM");
328 }
329 return mcm.mcm.mcm_parameters.maneuver_container.road_user_container;
330}
331
332} // namespace etsi_its_mcm_uulm_msgs::access
std::vector< LongitudinalWaypoint > getLongitudinalWaypoints(const ManeuverConstraints &maneuver_constraints)
Retrieves the list of longitudinal waypoints from the given maneuver constraints.
double getMinVelocity(const LongitudinalWaypoint &longitudinal_waypoint)
Retrieves the minimum velocity from a LongitudinalWaypoint.
gm::Point getWaypointDelta(const LongitudinalWaypoint &longitudinal_waypoint)
Converts a LongitudinalWaypoint to a gm::Point.
double getLatitude(const Latitude &latitude)
Get the Latitude value.
Definition mcm_getters.h:19
uint16_t getAdviceUpdateId(const SuggestedManeuver &suggested_maneuver)
Retrieves the advice update identifier from a SuggestedManeuver object.
bool getConfirmationRequiredFlag(const SuggestedManeuver &suggested_maneuver)
Retrieves the confirmation required flag from a SuggestedManeuver.
double getMaxArrivalTimeDelta(const LongitudinalWaypoint &longitudinal_waypoint)
Returns the maximum allowed arrival time delta for a given longitudinal waypoint.
uint16_t getManeuverId(const SuggestedManeuver &suggested_maneuver)
Retrieves the maneuver ID from a SuggestedManeuver object.
double getMaxVelocity(const LongitudinalWaypoint &longitudinal_waypoint)
Retrieves the maximum velocity from a LongitudinalWaypoint object.
double getMinArrivalTimeDelta(const LongitudinalWaypoint &longitudinal_waypoint)
Returns the minimum arrival time delta for a given longitudinal waypoint.
SuggestedManeuver getSuggestedManeuver(const SuggestedManeuverContainer &suggested_maneuver_container)
Retrieves the suggested maneuver from a SuggestedManeuverContainer.
ManeuverConstraints getManeuverConstraints(const SuggestedManeuver &suggested_maneuver)
Retrieves the ManeuverConstraints from a SuggestedManeuver.
uint32_t getTargetStationId(const SuggestedManeuverContainer &suggested_maneuver_container)
Retrieves the target station ID from a SuggestedManeuverContainer.
double getAltitude(const Altitude &altitude)
Get the Altitude value.
Definition mcm_getters.h:35
SuggestedManeuverContainer getSuggestedManeuverContainer(const MCM &mcm)
Retrieves the SuggestedManeuverContainer from the given MCM object.
RoadUserContainer getRoadUserContainer(const MCM &mcm)
Retrieves the RoadUserContainer from the given MCM object.
double getLongitude(const Longitude &longitude)
Get the Longitude value.
Definition mcm_getters.h:27
gm::PointStamped getUTMPosition(const T &reference_position, int &zone, bool &northp, double &conv_angle)
Get the UTM Position defined by the given ReferencePosition along with the grid-convergence angle.
Definition mcm_getters.h:56