scenario_simulator_v2 C++ API
conversions.hpp
Go to the documentation of this file.
1 // Copyright 2015 TIER IV, Inc. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef SIMULATION_INTERFACE__CONVERSIONS_HPP_
16 #define SIMULATION_INTERFACE__CONVERSIONS_HPP_
17 
18 #include <osi_common.pb.h>
19 #include <simulation_interface/builtin_interfaces.pb.h>
20 #include <simulation_interface/geometry_msgs.pb.h>
21 #include <simulation_interface/rosgraph_msgs.pb.h>
22 #include <simulation_interface/simulation_api_schema.pb.h>
23 #include <simulation_interface/std_msgs.pb.h>
24 #include <simulation_interface/traffic_simulator_msgs.pb.h>
25 
26 #include <autoware_control_msgs/msg/control.hpp>
27 #include <autoware_vehicle_msgs/msg/gear_command.hpp>
28 #include <builtin_interfaces/msg/duration.hpp>
29 #include <builtin_interfaces/msg/time.hpp>
30 #include <cstring>
31 #include <geometry_msgs/msg/accel.hpp>
32 #include <geometry_msgs/msg/point.hpp>
33 #include <geometry_msgs/msg/pose.hpp>
34 #include <geometry_msgs/msg/quaternion.hpp>
35 #include <geometry_msgs/msg/twist.hpp>
36 #include <geometry_msgs/msg/vector3.hpp>
37 #include <iostream>
38 #include <rosgraph_msgs/msg/clock.hpp>
40 #include <std_msgs/msg/header.hpp>
41 #include <string>
42 #include <traffic_simulator_msgs/msg/action_status.hpp>
43 #include <traffic_simulator_msgs/msg/axle.hpp>
44 #include <traffic_simulator_msgs/msg/axles.hpp>
45 #include <traffic_simulator_msgs/msg/bounding_box.hpp>
46 #include <traffic_simulator_msgs/msg/entity_status.hpp>
47 #include <traffic_simulator_msgs/msg/entity_type.hpp>
48 #include <traffic_simulator_msgs/msg/lanelet_pose.hpp>
49 #include <traffic_simulator_msgs/msg/misc_object_parameters.hpp>
50 #include <traffic_simulator_msgs/msg/pedestrian_parameters.hpp>
51 #include <traffic_simulator_msgs/msg/performance.hpp>
52 #include <traffic_simulator_msgs/msg/polyline_trajectory.hpp>
53 #include <traffic_simulator_msgs/msg/vehicle_parameters.hpp>
54 #include <vector>
55 #include <zmq.hpp>
56 
57 namespace zeromq
58 {
59 template <typename Proto>
60 zmq::message_t toZMQ(const Proto & proto)
61 {
62  std::string serialized_str;
63  proto.SerializeToString(&serialized_str);
64 
65  zmq::message_t msg(serialized_str.size());
66  std::memcpy(msg.data(), serialized_str.data(), serialized_str.size());
67  return msg;
68 }
69 
70 template <typename Proto>
71 Proto toProto(const zmq::message_t & msg)
72 {
73  Proto proto;
74  proto.ParseFromArray(msg.data(), static_cast<int>(msg.size()));
75  return proto;
76 }
77 } // namespace zeromq
78 
79 namespace simulation_interface
80 {
83 void toProto(const geometry_msgs::msg::Quaternion & q, geometry_msgs::Quaternion & proto);
84 void toMsg(const geometry_msgs::Quaternion & proto, geometry_msgs::msg::Quaternion & q);
86 void toMsg(const geometry_msgs::Pose & proto, geometry_msgs::msg::Pose & p);
89 void toProto(const geometry_msgs::msg::Twist & t, geometry_msgs::Twist & proto);
90 void toMsg(const geometry_msgs::Twist & proto, geometry_msgs::msg::Twist & t);
91 void toProto(const geometry_msgs::msg::Accel & a, geometry_msgs::Accel & proto);
92 void toMsg(const geometry_msgs::Accel & proto, geometry_msgs::msg::Accel & a);
93 void toProto(
96 void toMsg(
99 void toProto(
100  const traffic_simulator_msgs::msg::Performance & performance,
101  traffic_simulator_msgs::Performance & proto);
102 void toMsg(
103  const traffic_simulator_msgs::Performance & proto,
104  traffic_simulator_msgs::msg::Performance & performance);
105 void toProto(const traffic_simulator_msgs::msg::Axle & axle, traffic_simulator_msgs::Axle & proto);
106 void toMsg(const traffic_simulator_msgs::Axle & proto, traffic_simulator_msgs::msg::Axle & axle);
107 void toProto(
108  const traffic_simulator_msgs::msg::Axles & axles, traffic_simulator_msgs::Axles & proto);
109 void toMsg(const traffic_simulator_msgs::Axles & proto, traffic_simulator_msgs::msg::Axles & axles);
110 void toProto(
111  const traffic_simulator_msgs::msg::VehicleParameters & p,
112  traffic_simulator_msgs::VehicleParameters & proto);
113 void toMsg(
114  const traffic_simulator_msgs::VehicleParameters & proto,
115  traffic_simulator_msgs::msg::VehicleParameters & p);
116 void toProto(
117  const traffic_simulator_msgs::msg::PedestrianParameters & p,
118  traffic_simulator_msgs::PedestrianParameters & proto);
119 void toMsg(
120  const traffic_simulator_msgs::PedestrianParameters & proto,
121  traffic_simulator_msgs::msg::PedestrianParameters & p);
122 void toProto(
123  const traffic_simulator_msgs::msg::MiscObjectParameters & p,
124  traffic_simulator_msgs::MiscObjectParameters & proto);
125 void toMsg(
126  const traffic_simulator_msgs::MiscObjectParameters & proto,
127  traffic_simulator_msgs::msg::MiscObjectParameters & p);
128 void toProto(
129  const traffic_simulator_msgs::msg::ActionStatus & s,
130  traffic_simulator_msgs::ActionStatus & proto);
131 void toMsg(
132  const traffic_simulator_msgs::ActionStatus & proto,
133  traffic_simulator_msgs::msg::ActionStatus & s);
134 void toProto(
137 void toMsg(
140 void toProto(
142 void toMsg(
144 void toProto(
147 void toMsg(
150 void toProto(
153 void toProto(
156 void toMsg(
159 void toMsg(
162 void toProto(
163  const builtin_interfaces::msg::Duration & duration, builtin_interfaces::Duration & proto);
164 void toMsg(
165  const builtin_interfaces::Duration & proto, builtin_interfaces::msg::Duration & duration);
166 void toProto(const builtin_interfaces::msg::Time & time, builtin_interfaces::Time & proto);
167 void toMsg(const builtin_interfaces::Time & proto, builtin_interfaces::msg::Time & time);
168 void toProto(const rosgraph_msgs::msg::Clock & time, rosgraph_msgs::Clock & proto);
169 void toMsg(const rosgraph_msgs::Clock & proto, rosgraph_msgs::msg::Clock & time);
170 void toProto(const std_msgs::msg::Header & header, std_msgs::Header & proto);
171 void toMsg(const std_msgs::Header & proto, std_msgs::msg::Header & header);
172 
173 // clang-format off
174 #define DEFINE_CONVERSION(PACKAGE, TYPENAME) \
175  auto toProto(const PACKAGE::msg::TYPENAME &, PACKAGE::TYPENAME &)->void; \
176  auto toMsg(const PACKAGE::TYPENAME &, PACKAGE::msg::TYPENAME &)->void
177 
178 DEFINE_CONVERSION(autoware_control_msgs, Lateral);
179 DEFINE_CONVERSION(autoware_control_msgs, Longitudinal);
180 DEFINE_CONVERSION(autoware_control_msgs, Control);
181 DEFINE_CONVERSION(autoware_vehicle_msgs, GearCommand);
182 
183 #undef DEFINE_CONVERSION
184 
185 auto toProto(
186  const std::tuple<autoware_control_msgs::msg::Control, autoware_vehicle_msgs::msg::GearCommand> &,
187  traffic_simulator_msgs::VehicleCommand &) -> void;
188 
189 template <typename TrafficLightBulbMessageType>
190 auto toMsg(
192  TrafficLightBulbMessageType & traffic_light_bulb_state) -> void
193 {
194  using namespace simulation_api_schema;
195 
196  auto convert_color = [](auto color) constexpr
197  {
198  switch (color) {
199  case TrafficLight_Color_RED:
200  return TrafficLightBulbMessageType::RED;
201  case TrafficLight_Color_AMBER:
202  return TrafficLightBulbMessageType::AMBER;
203  case TrafficLight_Color_GREEN:
204  return TrafficLightBulbMessageType::GREEN;
205  case TrafficLight_Color_WHITE:
206  return TrafficLightBulbMessageType::WHITE;
207  case TrafficLight_Color_UNKNOWN_COLOR:
208  return TrafficLightBulbMessageType::UNKNOWN;
209  default:
210  return TrafficLightBulbMessageType::UNKNOWN;
211  }
212  };
213 
214  auto convert_shape = [](auto shape) constexpr
215  {
216  switch (shape) {
217  case TrafficLight_Shape_CIRCLE:
218  return TrafficLightBulbMessageType::CIRCLE;
219  case TrafficLight_Shape_LEFT_ARROW:
220  return TrafficLightBulbMessageType::LEFT_ARROW;
221  case TrafficLight_Shape_RIGHT_ARROW:
222  return TrafficLightBulbMessageType::RIGHT_ARROW;
223  case TrafficLight_Shape_UP_ARROW:
224  return TrafficLightBulbMessageType::UP_ARROW;
226  // case TrafficLight_Shape_UP_LEFT_ARROW:
227  // return TrafficLightBulbMessageType::UP_LEFT_ARROW;
228  // case TrafficLight_Shape_UP_RIGHT_ARROW:
229  // return TrafficLightBulbMessageType::UP_RIGHT_ARROW;
230  case TrafficLight_Shape_DOWN_ARROW:
231  return TrafficLightBulbMessageType::DOWN_ARROW;
232  case TrafficLight_Shape_DOWN_LEFT_ARROW:
233  return TrafficLightBulbMessageType::DOWN_LEFT_ARROW;
234  case TrafficLight_Shape_DOWN_RIGHT_ARROW:
235  return TrafficLightBulbMessageType::DOWN_RIGHT_ARROW;
236  case TrafficLight_Shape_CROSS:
237  return TrafficLightBulbMessageType::CROSS;
238  case TrafficLight_Shape_UNKNOWN_SHAPE:
239  return TrafficLightBulbMessageType::UNKNOWN;
240  default:
241  return TrafficLightBulbMessageType::UNKNOWN;
242  }
243  };
244 
245  auto convert_status = [](auto status) constexpr
246  {
247  switch (status) {
248  case TrafficLight_Status_SOLID_OFF:
249  return TrafficLightBulbMessageType::SOLID_OFF;
250  case TrafficLight_Status_SOLID_ON:
251  return TrafficLightBulbMessageType::SOLID_ON;
252  case TrafficLight_Status_FLASHING:
253  return TrafficLightBulbMessageType::FLASHING;
254  case TrafficLight_Status_UNKNOWN_STATUS:
255  return TrafficLightBulbMessageType::UNKNOWN;
256  default:
257  return TrafficLightBulbMessageType::UNKNOWN;
258  }
259  };
260 
261  traffic_light_bulb_state.status = convert_status(proto.status());
262  traffic_light_bulb_state.shape = convert_shape(proto.shape());
263  traffic_light_bulb_state.color = convert_color(proto.color());
264  traffic_light_bulb_state.confidence = proto.confidence();
265 }
266 // clang-format on
267 
268 auto toProtobufMessage(const traffic_simulator_msgs::msg::Vertex &)
269  -> traffic_simulator_msgs::Vertex;
270 
271 auto toROS2Message(const traffic_simulator_msgs::Vertex &) -> traffic_simulator_msgs::msg::Vertex;
272 
273 auto toProtobufMessage(const traffic_simulator_msgs::msg::Polyline &)
274  -> traffic_simulator_msgs::Polyline;
275 
276 auto toROS2Message(const traffic_simulator_msgs::Polyline &)
277  -> traffic_simulator_msgs::msg::Polyline;
278 
279 auto toProtobufMessage(const traffic_simulator_msgs::msg::PolylineTrajectory &)
280  -> traffic_simulator_msgs::PolylineTrajectory;
281 
282 auto toROS2Message(const traffic_simulator_msgs::PolylineTrajectory &)
283  -> traffic_simulator_msgs::msg::PolylineTrajectory;
284 
285 template <typename T, typename... Ts>
286 auto to(Ts &&...) -> T = delete;
287 
288 template <>
289 auto to<osi3::Timestamp>(const builtin_interfaces::msg::Time &) -> osi3::Timestamp;
290 } // namespace simulation_interface
291 
292 #endif // SIMULATION_INTERFACE__CONVERSIONS_HPP_
Definition: constants.hpp:21
auto to(Ts &&...) -> T=delete
auto toProtobufMessage(const traffic_simulator_msgs::msg::Vertex &) -> traffic_simulator_msgs::Vertex
Definition: conversions.cpp:601
void toProto(const geometry_msgs::msg::Point &p, geometry_msgs::Point &proto)
Definition: conversions.cpp:22
DEFINE_CONVERSION(autoware_control_msgs, Lateral)
void toMsg(const geometry_msgs::Point &proto, geometry_msgs::msg::Point &p)
Definition: conversions.cpp:29
auto toROS2Message(const traffic_simulator_msgs::Vertex &) -> traffic_simulator_msgs::msg::Vertex
Definition: conversions.cpp:610
geometry_msgs::msg::Pose Pose
Definition: lanelet_wrapper.hpp:70
traffic_simulator_msgs::msg::BoundingBox BoundingBox
Definition: lanelet_wrapper.hpp:65
geometry_msgs::msg::Point Point
Definition: lanelet_wrapper.hpp:69
geometry_msgs::msg::Vector3 Vector3
Definition: lanelet_wrapper.hpp:74
traffic_simulator_msgs::msg::LaneletPose LaneletPose
Definition: lanelet_pose.hpp:30
std::string string
Definition: junit5.hpp:26
Definition: conversions.hpp:58
Proto toProto(const zmq::message_t &msg)
Definition: conversions.hpp:71
zmq::message_t toZMQ(const Proto &proto)
Definition: conversions.hpp:60
traffic_simulator_msgs::EntitySubtype EntitySubtype
Definition: helper_functions.hpp:30
traffic_simulator_msgs::EntityStatus EntityStatus
Definition: helper_functions.hpp:32
traffic_simulator_msgs::EntityType EntityType
Definition: helper_functions.hpp:31
traffic_simulator::TrafficLight TrafficLight
Definition: test_traffic_light.cpp:24