$darkmode
task_control.hpp
Go to the documentation of this file.
1 /*
2  * Copyright 2020 Robert Bosch GmbH
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  * SPDX-License-Identifier: Apache-2.0
17  */
22 #pragma once
23 
24 #include <memory> // for unique_ptr<>
25 #include <string> // for string
26 #include <utility> // for move
27 
28 #ifdef VTD_API_2_2_0
29  #include <RDBHandler.hh>
30 #else
31  #include <VtdToolkit/RDBHandler.hh>
32 #endif
33 
34 #include <cloe/component/object.hpp> // for Object
35 #include <cloe/core.hpp> // for Json
36 
37 #include "omni_sensor_component.hpp" // for VtdOmniSensor
38 #include "rdb_codec.hpp" // for RdbCodec
39 #include "vtd_logger.hpp" // for vtd_logger
40 
41 namespace vtd {
42 
43 struct DriverControl {
45  uint32_t player_id{0};
46 
49 
51  float target_steering{0};
52 
59  uint32_t driver_flags{0};
60 
68  uint32_t validity_flags{0};
69 
70  friend void to_json(cloe::Json& j, const DriverControl& dc) {
71  j = cloe::Json{
72  {"player_id", dc.player_id},
73  {"target_acceleration", dc.target_acceleration},
74  {"target_steering", dc.target_steering},
75  {"driver_flags", dc.driver_flags},
76  {"validity_flags", dc.validity_flags},
77  };
78  }
79 };
80 
83  uint32_t base_id{0};
84 
86  uint8_t base_category{RDB_OBJECT_CATEGORY_PLAYER};
87 
89  uint8_t base_type{RDB_OBJECT_TYPE_NONE};
90 
92  uint16_t base_vis_mask{RDB_OBJECT_VIS_FLAG_TRAFFIC | RDB_OBJECT_VIS_FLAG_RECORDER};
93 
95  std::string base_name;
96 
98  RDB_GEOMETRY_t base_geo;
99 
101  RDB_COORD_t base_pos;
102 
104  RDB_COORD_t ext_speed;
105 
107  RDB_COORD_t ext_accel;
108 
109  friend void to_json(cloe::Json& j, const DynObjectState& os) {
110  j = cloe::Json{
111  {"base_id", os.base_id}, {"base_category", os.base_category},
112  {"base_type", os.base_type}, {"base_vis_mask", os.base_vis_mask},
113  {"base_name", os.base_name},
114  };
115  }
116 };
117 
121 const std::map<cloe::Object::Class, uint8_t> cloe_vtd_obj_class_map = {
122  {cloe::Object::Class::Car, RDB_OBJECT_TYPE_PLAYER_CAR},
123  {cloe::Object::Class::Truck, RDB_OBJECT_TYPE_PLAYER_TRUCK},
124  {cloe::Object::Class::Motorbike, RDB_OBJECT_TYPE_PLAYER_MOTORBIKE},
125  {cloe::Object::Class::Trailer, RDB_OBJECT_TYPE_PLAYER_TRAILER},
126 };
127 
131 RDB_GEOMETRY_t rdb_geometry_from_object(const cloe::Object& obj) {
132  RDB_GEOMETRY_t geo;
133  geo.dimX = obj.dimensions.x();
134  geo.dimY = obj.dimensions.y();
135  geo.dimZ = obj.dimensions.z();
136  geo.offX = obj.cog_offset.x();
137  geo.offY = obj.cog_offset.y();
138  geo.offZ = obj.cog_offset.z();
139  return geo;
140 }
141 
142 RDB_COORD_t rdb_coord_from_vector3d(const Eigen::Vector3d& position,
143  const Eigen::Vector3d& angle_rph) {
144  RDB_COORD_t coord;
145  coord.x = position.x();
146  coord.y = position.y();
147  coord.z = position.z();
148  coord.r = angle_rph.x();
149  coord.p = angle_rph.y();
150  coord.h = angle_rph.z();
151  coord.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
152  coord.type = RDB_COORD_TYPE_INERTIAL;
153  return coord;
154 }
155 
156 RDB_COORD_t rdb_coord_from_object(const cloe::Object& obj) {
157  Eigen::Vector3d hpr = obj.pose.rotation().matrix().eulerAngles(2, 1, 0);
158  return rdb_coord_from_vector3d(obj.pose.translation(),
159  Eigen::Vector3d(hpr.z(), hpr.y(), hpr.x()));
160 }
161 
162 RDB_COORD_t rdb_coord_pos_from_vector3d(const Eigen::Vector3d& position) {
163  RDB_COORD_t coord;
164  coord.x = position.x();
165  coord.y = position.y();
166  coord.z = position.z();
167  coord.flags = RDB_COORD_FLAG_POINT_VALID;
168  coord.type = RDB_COORD_TYPE_INERTIAL;
169  return coord;
170 }
171 
207 class TaskControl : public VtdOmniSensor {
208  public:
209  explicit TaskControl(std::unique_ptr<RdbTransceiver>&& rdb_transceiver)
210  : VtdOmniSensor(std::move(rdb_transceiver), UNDEFINED_OWNER_ID) {
211  handler_.initMsg();
212  }
213 
214  virtual ~TaskControl() = default;
215 
217  void process(RDB_DRIVER_CTRL_t* driver_ctrl) override {
218  // Steering speed at the front wheels [rad/s].
219  if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_STEERING_SPEED) {
220  steering_wheel_speed_[driver_ctrl->playerId] = driver_ctrl->steeringSpeed;
221  } else {
222  vtd_logger()->warn("{}: steeringSpeed missing in RDB_DRIVER_CTRL_t", this->get_name());
223  steering_wheel_speed_[driver_ctrl->playerId] = 0.0;
224  }
225 
226  // Longitudinal acceleration request [m/s2].
227  if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_ACCEL) {
228  driver_request_accel_[driver_ctrl->playerId] = driver_ctrl->accelTgt;
229  } else {
230  vtd_logger()->warn("{}: accelTgt missing in RDB_DRIVER_CTRL_t", this->get_name());
231  driver_request_accel_[driver_ctrl->playerId] = 0.0;
232  }
233  // Steering request (angle at wheels) [rad].
234  if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_STEERING) {
235  driver_request_steering_angle_[driver_ctrl->playerId] = driver_ctrl->steeringTgt;
236  } else {
237  vtd_logger()->warn("{}: steeringTgt missing in RDB_DRIVER_CTRL_t", this->get_name());
238  driver_request_steering_angle_[driver_ctrl->playerId] = 0.0;
239  }
240  }
241 
242  void reset() override {
244  steering_wheel_speed_.clear();
245  driver_request_accel_.clear();
246  driver_request_steering_angle_.clear();
247  }
248 
253  RDB_DRIVER_CTRL_t* driverCtrl =
254  reinterpret_cast<RDB_DRIVER_CTRL_t*>(handler_.addPackage(0.0, 0, RDB_PKG_ID_DRIVER_CTRL));
255  if (driverCtrl == nullptr) {
256  vtd_logger()->error("TaskControl: cannot add RDB_PKG_ID_DRIVER_CTRL package");
257  return;
258  }
259 
260  driverCtrl->playerId = dc.player_id;
261  driverCtrl->accelTgt = dc.target_acceleration;
262  driverCtrl->steeringTgt = dc.target_steering;
263  driverCtrl->flags = dc.driver_flags;
264  driverCtrl->validityFlags = dc.validity_flags;
265  }
266 
267  void add_dyn_object_state(const DynObjectState& os) {
268  // TODO(tobias): From the implementation of `add_driver_control`, it seems
269  // that the actual sim time and frame no. are not needed..
270  handler_.addPackage(0.0, 0, RDB_PKG_ID_START_OF_FRAME);
271  RDB_OBJECT_STATE_t* objState = reinterpret_cast<RDB_OBJECT_STATE_t*>(
272  handler_.addPackage(0.0, 0, RDB_PKG_ID_OBJECT_STATE, /*noElements=*/1,
273  /*extended=*/true));
274  if (objState == nullptr) {
275  vtd_logger()->error("TaskControl: cannot add RDB_OBJECT_STATE package");
276  return;
277  }
278  objState->base.id = os.base_id;
279  objState->base.category = os.base_category;
280  objState->base.type = os.base_type;
281  objState->base.visMask = os.base_vis_mask;
282  std::strcpy(objState->base.name, os.base_name.c_str());
283  objState->base.geo = os.base_geo;
284  objState->base.pos = os.base_pos;
285  objState->ext.speed = os.ext_speed;
286  objState->ext.accel = os.ext_accel;
287  handler_.addPackage(0.0, 0, RDB_PKG_ID_END_OF_FRAME);
288  }
289 
293  void add_trigger(cloe::Duration delta_t) {
294  RDB_TRIGGER_t* trigger =
295  reinterpret_cast<RDB_TRIGGER_t*>(handler_.addPackage(0.0, 0, RDB_PKG_ID_TRIGGER));
296  if (trigger == nullptr) {
297  vtd_logger()->error("TaskControl: cannot add RDB_PKG_ID_DRIVER_CTRL package");
298  return;
299  }
300 
301  vtd_logger()->trace("TaskControl: setting trigger={} ns", delta_t.count());
302  trigger->deltaT = std::chrono::duration_cast<std::chrono::duration<float>>(delta_t).count();
303  trigger->frameNo = 0;
304  trigger->features = 0;
305  }
306 
310  void send_packages() {
311  rdb_->send(handler_.getMsg(), handler_.getMsgTotalSize());
312  handler_.initMsg();
313  }
314 
322  this->add_trigger(delta_t);
323  this->send_packages();
324  }
325 
329  double get_steering_wheel_speed(uint64_t id) const { return steering_wheel_speed_.at(id); }
330 
334  double get_driver_request_acceleration(uint64_t id) const { return driver_request_accel_.at(id); }
335 
340  return driver_request_accel_.find(id) != driver_request_accel_.end();
341  }
342 
346  double get_driver_request_steering_angle(uint64_t id) const {
347  return driver_request_steering_angle_.at(id);
348  }
349 
354  return driver_request_steering_angle_.find(id) != driver_request_steering_angle_.end();
355  }
356 
357  friend void to_json(cloe::Json& j, const TaskControl& tc) {
358  j = cloe::Json{{"rdb_connection", tc.rdb_}};
359  }
360 
361  protected:
363  Framework::RDBHandler handler_;
364  std::map<int, double> steering_wheel_speed_;
365  std::map<int, double> driver_request_accel_;
366  std::map<int, double> driver_request_steering_angle_;
367 };
368 
369 } // namespace vtd
void reset() override
Definition: omni_sensor_component.hpp:163
uint32_t validity_flags
Definition: task_control.hpp:68
uint32_t driver_flags
Definition: task_control.hpp:59
RDB_COORD_t ext_accel
Object acceleration and angular acceleration.
Definition: task_control.hpp:107
Definition: task_control.hpp:43
Eigen::Vector3d cog_offset
Center of geometry offset in [m].
Definition: object.hpp:75
Eigen::Isometry3d pose
Pose in [m] and [rad].
Definition: object.hpp:69
Framework::RDBHandler handler_
RDBHandler helps us conveniently construct RDB messages.
Definition: task_control.hpp:363
uint16_t base_vis_mask
Visibility mask (e.g. visible for traffic and visible for data recorder).
Definition: task_control.hpp:92
float target_acceleration
Target acceleration in [m/s^2].
Definition: task_control.hpp:48
void process(RDB_START_OF_FRAME_t *) override
Definition: omni_sensor_component.hpp:85
RDB_COORD_t base_pos
Object position and orientation.
Definition: task_control.hpp:101
Definition: task_control.hpp:81
double get_driver_request_acceleration(uint64_t id) const
Definition: task_control.hpp:334
Definition: actuator_component.hpp:35
void add_trigger(cloe::Duration delta_t)
Definition: task_control.hpp:293
Definition: omni_sensor_component.hpp:72
Definition: object.hpp:51
Definition: task_control.hpp:207
uint8_t base_type
Object type (car, truck, ...).
Definition: task_control.hpp:89
const std::map< cloe::Object::Class, uint8_t > cloe_vtd_obj_class_map
Definition: task_control.hpp:121
void send_packages()
Definition: task_control.hpp:310
void add_trigger_and_send(cloe::Duration delta_t)
Definition: task_control.hpp:321
std::string base_name
Player name.
Definition: task_control.hpp:95
std::chrono::nanoseconds Duration
Definition: duration.hpp:45
bool has_driver_request_steering_angle(uint64_t id)
Definition: task_control.hpp:353
double get_driver_request_steering_angle(uint64_t id) const
Definition: task_control.hpp:346
void reset() override
Definition: task_control.hpp:242
uint32_t player_id
VTD player ID.
Definition: task_control.hpp:45
RDB_GEOMETRY_t rdb_geometry_from_object(const cloe::Object &obj)
Definition: task_control.hpp:131
Eigen::Vector3d dimensions
Dimensions in [m].
Definition: object.hpp:72
RDB_COORD_t ext_speed
Object velocity and angular velocity.
Definition: task_control.hpp:104
std::unique_ptr< RdbTransceiver > rdb_
Definition: rdb_codec.hpp:156
void add_driver_control(const DriverControl &dc)
Definition: task_control.hpp:252
uint8_t base_category
Object category (player, sensor, ...).
Definition: task_control.hpp:86
float target_steering
Target steering angle in [rad].
Definition: task_control.hpp:51
double get_steering_wheel_speed(uint64_t id) const
Definition: task_control.hpp:329
uint32_t base_id
Object id.
Definition: task_control.hpp:83
RDB_GEOMETRY_t base_geo
Object dimension and offset to cog.
Definition: task_control.hpp:98
bool has_driver_request_acceleration(uint64_t id)
Definition: task_control.hpp:339