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