$darkmode
omni_sensor_component.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  */
23 #pragma once
24 
25 #include <limits> // for numeric_limits<>
26 #include <map> // for map<>
27 #include <memory> // for shared_ptr<>, unique_ptr<>
28 #include <string> // for string, to_string
29 
30 #include "vtd_version.hpp"
31 #if (VTD_API_VERSION_EPOCH == 0)
32  #include <viRDBIcd.h> // for RDB_OBJECT_STATE_t, ...
33 #else
34  #include <VtdToolkit/viRDBIcd.h>
35 #endif
36 
37 #include "rdb_codec.hpp" // for RdbCodec, RdbTransceiver
38 #include "vtd_logger.hpp" // for vtd_logger
39 #include "vtd_sensor_data.hpp" // for VtdSensorData
40 
41 namespace vtd {
42 
46 Eigen::Isometry3d from_vtd_pose(const RDB_COORD_t& x);
47 
55 void from_vtd_object_state(const RDB_OBJECT_STATE_t* rdb_os, bool ext, cloe::Object& obj);
56 
57 void from_vtd_roadmark(const RDB_ROADMARK_t* rdb_rm, cloe::LaneBoundary& lb);
58 
59 const uint64_t UNDEFINED_OWNER_ID = std::numeric_limits<uint64_t>::max();
60 
73 class VtdOmniSensor : public RdbCodec, public VtdSensorData {
74  public:
75  virtual ~VtdOmniSensor() = default;
76 
77  VtdOmniSensor(std::unique_ptr<RdbTransceiver>&& rdb_transceiver, uint64_t owner_id)
78  : RdbCodec(std::move(rdb_transceiver)), VtdSensorData("rdb_sensor"), owner_id_(owner_id) {
79  ego_object_ = std::make_shared<cloe::Object>(); // NOLINT
80  }
81 
82  void step(const cloe::Sync& s) override { RdbCodec::step(s.step(), restart_, simulation_time_); }
83 
84  using RdbCodec::process;
85 
86  void process(RDB_START_OF_FRAME_t* /*nullptr*/) override {
87  vtd_logger()->trace("VtdOmniSensor: start-of-frame");
88  this->clear_cache();
89  }
90 
91  void process(RDB_END_OF_FRAME_t* /*nullptr*/) override {
92  vtd_logger()->trace("VtdOmniSensor: end-of-frame");
93  assert(ego_object_ || owner_id_ == UNDEFINED_OWNER_ID);
94  }
95 
96  void process(RDB_WHEEL_t* rdb_w, bool /*extended*/) override {
97  auto wheel_player_id = static_cast<int>(rdb_w->base.playerId);
98  if (ego_object_ && ego_object_->id == wheel_player_id && rdb_w->base.id == 0) {
99  ego_steering_angle_ = rdb_w->base.steeringAngle;
100  }
101  }
102 
103  void process(RDB_SENSOR_STATE_t* s) override {
104  frustum_.fov_h = s->fovHV[0];
105  frustum_.fov_v = s->fovHV[1];
106  frustum_.offset_h = s->fovOffHV[0];
107  frustum_.offset_v = s->fovOffHV[1];
108  frustum_.clip_near = s->clipNF[0];
109  frustum_.clip_far = s->clipNF[1];
110  mount_ = from_vtd_pose(s->pos);
111  }
112 
113  void process(RDB_OBJECT_STATE_t* rdb_os, bool extended) override {
114  // Pick ego from objects and put all other objects to object list.
115  switch (rdb_os->base.category) {
116  case RDB_OBJECT_CATEGORY_PLAYER: {
117  auto obj = std::make_shared<cloe::Object>();
118  from_vtd_object_state(rdb_os, extended, *obj);
119  if (rdb_os->base.id == owner_id_) {
120  // Convert ego velocity and acceleration into vehicle frame coordinates
121  obj->velocity = obj->pose.rotation().inverse() * obj->velocity;
122  obj->acceleration = obj->pose.rotation().inverse() * obj->acceleration;
123  ego_object_ = obj;
124  } else {
125  // All other drivers:
126  world_objects_.push_back(obj);
127  }
128  break;
129  }
130 
131  case RDB_OBJECT_CATEGORY_COMMON: {
132  auto obj = std::make_shared<cloe::Object>();
133  from_vtd_object_state(rdb_os, extended, *obj);
134  world_objects_.push_back(obj);
135  break;
136  }
137 
138  case RDB_OBJECT_CATEGORY_SENSOR:
139  case RDB_OBJECT_CATEGORY_CAMERA:
140  case RDB_OBJECT_CATEGORY_LIGHT_POINT:
141  case RDB_OBJECT_CATEGORY_NONE:
142  case RDB_OBJECT_CATEGORY_OPENDRIVE: {
143  vtd_logger()->trace("Discarding object with category {}.", rdb_os->base.category);
144  break;
145  }
146 
147  default: {
148  auto category_str = std::to_string(rdb_os->base.category);
149  throw std::logic_error("unknown RDB base category " + category_str);
150  }
151  }
152  }
153 
154  void process(RDB_ROADMARK_t* rdb_rm) override {
155  if (rdb_rm->playerId == owner_id_) {
156  auto& lb = lanes_[rdb_rm->id];
157  from_vtd_roadmark(rdb_rm, lb);
158  }
159  }
160 
161  const std::string& get_name() const override { return name_; }
162 
163  // As defined in `cloe/component.hpp`
164  void reset() override {
165  clear_cache();
166  this->set_reset_state();
167  }
168 
169  friend void to_json(cloe::Json& j, const VtdOmniSensor& s) {
170  to_json(j, static_cast<const VtdSensorData&>(s));
171  j = cloe::Json{
172  {"frame_number", s.frame_number()},
173  {"rdb_connection", s.rdb_},
174  };
175  }
176 
177  protected:
179  uint64_t owner_id_;
180 };
181 
182 } // namespace vtd
Definition: lane_boundary.hpp:36
Definition: sync.hpp:34
virtual uint64_t step() const =0
Definition: rdb_codec.hpp:46
virtual void step(uint64_t frame_number, bool &restart, cloe::Duration &sim_time)
Definition: rdb_codec.cpp:290
std::unique_ptr< RdbTransceiver > rdb_
Definition: rdb_codec.hpp:157
virtual void process(RDB_MSG_t *msg, bool &restart, cloe::Duration &sim_time)
Definition: rdb_codec.cpp:249
virtual uint64_t frame_number() const
Definition: rdb_codec.hpp:74
Definition: omni_sensor_component.hpp:73
uint64_t owner_id_
Id of the sensor's owner (ego).
Definition: omni_sensor_component.hpp:179
void reset() override
Definition: omni_sensor_component.hpp:164
virtual void process(RDB_MSG_t *msg, bool &restart, cloe::Duration &sim_time)
Definition: rdb_codec.cpp:249
const std::string & get_name() const override
Definition: omni_sensor_component.hpp:161
void process(RDB_START_OF_FRAME_t *) override
Definition: omni_sensor_component.hpp:86
void step(const cloe::Sync &s) override
Definition: omni_sensor_component.hpp:82
Definition: vtd_sensor_data.hpp:39
Eigen::Isometry3d mount_
Sensor mounting position and orientation.
Definition: vtd_sensor_data.hpp:121
std::shared_ptr< cloe::Object > ego_object_
ego object information from last processed frame.
Definition: vtd_sensor_data.hpp:130
bool restart_
Indicates whether reset has been requested.
Definition: vtd_sensor_data.hpp:115
virtual void set_reset_state()
Definition: vtd_sensor_data.hpp:79
double ego_steering_angle_
Ego front left wheel steering angle from last processed frame.
Definition: vtd_sensor_data.hpp:133
cloe::Duration simulation_time_
Simulation time from last processed sensor message.
Definition: vtd_sensor_data.hpp:118
cloe::Objects world_objects_
World objects from last processed frame.
Definition: vtd_sensor_data.hpp:127
cloe::Frustum frustum_
Sensor frustum information.
Definition: vtd_sensor_data.hpp:124
cloe::LaneBoundaries lanes_
Lane id-to-boundary-map.
Definition: vtd_sensor_data.hpp:136
std::string name_
Human readable name.
Definition: vtd_sensor_data.hpp:112
Eigen::Isometry3d from_vtd_pose(const RDB_COORD_t &x)
Definition: omni_sensor_component.cpp:109
void from_vtd_object_state(const RDB_OBJECT_STATE_t *rdb_os, bool ext, cloe::Object &object)
Definition: omni_sensor_component.cpp:115
Definition: object.hpp:51