32 #if (VTD_API_VERSION_EPOCH == 0)
33 #include <RDBHandler.hh>
35 #include <VtdToolkit/RDBHandler.hh>
93 uint16_t
base_vis_mask{RDB_OBJECT_VIS_FLAG_TRAFFIC | RDB_OBJECT_VIS_FLAG_RECORDER};
123 {cloe::Object::Class::Car, RDB_OBJECT_TYPE_PLAYER_CAR},
124 {cloe::Object::Class::Truck, RDB_OBJECT_TYPE_PLAYER_TRUCK},
125 {cloe::Object::Class::Motorbike, RDB_OBJECT_TYPE_PLAYER_MOTORBIKE},
126 {cloe::Object::Class::Trailer, RDB_OBJECT_TYPE_PLAYER_TRAILER},
143 RDB_COORD_t rdb_coord_from_vector3d(
const Eigen::Vector3d& position,
144 const Eigen::Vector3d& angle_rph) {
146 coord.x = position.x();
147 coord.y = position.y();
148 coord.z = position.z();
149 coord.r = angle_rph.x();
150 coord.p = angle_rph.y();
151 coord.h = angle_rph.z();
152 coord.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
153 coord.type = RDB_COORD_TYPE_INERTIAL;
157 RDB_COORD_t rdb_coord_from_object(
const cloe::Object& obj) {
158 Eigen::Vector3d hpr = obj.
pose.rotation().matrix().eulerAngles(2, 1, 0);
159 return rdb_coord_from_vector3d(obj.
pose.translation(),
160 Eigen::Vector3d(hpr.z(), hpr.y(), hpr.x()));
163 RDB_COORD_t rdb_coord_pos_from_vector3d(
const Eigen::Vector3d& position) {
165 coord.x = position.x();
166 coord.y = position.y();
167 coord.z = position.z();
168 coord.flags = RDB_COORD_FLAG_POINT_VALID;
169 coord.type = RDB_COORD_TYPE_INERTIAL;
210 explicit TaskControl(std::unique_ptr<RdbTransceiver>&& rdb_transceiver)
211 :
VtdOmniSensor(std::move(rdb_transceiver), UNDEFINED_OWNER_ID) {
218 void process(RDB_DRIVER_CTRL_t* driver_ctrl)
override {
220 if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_STEERING_SPEED) {
221 steering_wheel_speed_[driver_ctrl->playerId] = driver_ctrl->steeringSpeed;
223 vtd_logger()->warn(
"{}: steeringSpeed missing in RDB_DRIVER_CTRL_t", this->
get_name());
224 steering_wheel_speed_[driver_ctrl->playerId] = 0.0;
228 if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_ACCEL) {
229 driver_request_accel_[driver_ctrl->playerId] = driver_ctrl->accelTgt;
231 vtd_logger()->warn(
"{}: accelTgt missing in RDB_DRIVER_CTRL_t", this->
get_name());
232 driver_request_accel_[driver_ctrl->playerId] = 0.0;
235 if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_STEERING) {
236 driver_request_steering_angle_[driver_ctrl->playerId] = driver_ctrl->steeringTgt;
238 vtd_logger()->warn(
"{}: steeringTgt missing in RDB_DRIVER_CTRL_t", this->
get_name());
239 driver_request_steering_angle_[driver_ctrl->playerId] = 0.0;
245 steering_wheel_speed_.clear();
246 driver_request_accel_.clear();
247 driver_request_steering_angle_.clear();
254 RDB_DRIVER_CTRL_t* driverCtrl =
255 reinterpret_cast<RDB_DRIVER_CTRL_t*
>(
handler_.addPackage(0.0, 0, RDB_PKG_ID_DRIVER_CTRL));
256 if (driverCtrl ==
nullptr) {
257 vtd_logger()->error(
"TaskControl: cannot add RDB_PKG_ID_DRIVER_CTRL package");
271 handler_.addPackage(0.0, 0, RDB_PKG_ID_START_OF_FRAME);
272 RDB_OBJECT_STATE_t* objState =
reinterpret_cast<RDB_OBJECT_STATE_t*
>(
273 handler_.addPackage(0.0, 0, RDB_PKG_ID_OBJECT_STATE, 1,
275 if (objState ==
nullptr) {
276 vtd_logger()->error(
"TaskControl: cannot add RDB_OBJECT_STATE package");
279 objState->base.id = os.
base_id;
283 std::strcpy(objState->base.name, os.
base_name.c_str());
288 handler_.addPackage(0.0, 0, RDB_PKG_ID_END_OF_FRAME);
295 RDB_TRIGGER_t* trigger =
296 reinterpret_cast<RDB_TRIGGER_t*
>(
handler_.addPackage(0.0, 0, RDB_PKG_ID_TRIGGER));
297 if (trigger ==
nullptr) {
298 vtd_logger()->error(
"TaskControl: cannot add RDB_PKG_ID_DRIVER_CTRL package");
302 vtd_logger()->trace(
"TaskControl: setting trigger={} ns", delta_t.count());
303 trigger->deltaT = std::chrono::duration_cast<std::chrono::duration<float>>(delta_t).count();
304 trigger->frameNo = 0;
305 trigger->features = 0;
341 return driver_request_accel_.find(
id) != driver_request_accel_.end();
348 return driver_request_steering_angle_.at(
id);
355 return driver_request_steering_angle_.find(
id) != driver_request_steering_angle_.end();
358 friend void to_json(cloe::Json& j,
const TaskControl& tc) {
359 j = cloe::Json{{
"rdb_connection", tc.
rdb_}};
365 std::map<int, double> steering_wheel_speed_;
366 std::map<int, double> driver_request_accel_;
367 std::map<int, double> driver_request_steering_angle_;
std::unique_ptr< RdbTransceiver > rdb_
Definition: rdb_codec.hpp:157
Definition: task_control.hpp:208
void add_driver_control(const DriverControl &dc)
Definition: task_control.hpp:253
bool has_driver_request_acceleration(uint64_t id)
Definition: task_control.hpp:340
Framework::RDBHandler handler_
RDBHandler helps us conveniently construct RDB messages.
Definition: task_control.hpp:364
void reset() override
Definition: task_control.hpp:243
void send_packages()
Definition: task_control.hpp:311
void add_trigger_and_send(cloe::Duration delta_t)
Definition: task_control.hpp:322
bool has_driver_request_steering_angle(uint64_t id)
Definition: task_control.hpp:354
double get_driver_request_steering_angle(uint64_t id) const
Definition: task_control.hpp:347
double get_steering_wheel_speed(uint64_t id) const
Definition: task_control.hpp:330
double get_driver_request_acceleration(uint64_t id) const
Definition: task_control.hpp:335
void add_trigger(cloe::Duration delta_t)
Definition: task_control.hpp:294
Definition: omni_sensor_component.hpp:73
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
std::chrono::nanoseconds Duration
Definition: cloe_fwd.hpp:36
Definition: object.hpp:49
Eigen::Vector3d dimensions
Dimensions in [m].
Definition: object.hpp:70
Eigen::Vector3d cog_offset
Center of geometry offset in [m].
Definition: object.hpp:73
Eigen::Isometry3d pose
Pose in [m] and [rad].
Definition: object.hpp:67
Definition: task_control.hpp:44
float target_steering
Target steering angle in [rad].
Definition: task_control.hpp:52
float target_acceleration
Target acceleration in [m/s^2].
Definition: task_control.hpp:49
uint32_t validity_flags
Definition: task_control.hpp:69
uint32_t driver_flags
Definition: task_control.hpp:60
uint32_t player_id
VTD player ID.
Definition: task_control.hpp:46
Definition: task_control.hpp:82
uint8_t base_category
Object category (player, sensor, ...).
Definition: task_control.hpp:87
RDB_COORD_t ext_speed
Object velocity and angular velocity.
Definition: task_control.hpp:105
uint16_t base_vis_mask
Visibility mask (e.g. visible for traffic and visible for data recorder).
Definition: task_control.hpp:93
RDB_COORD_t ext_accel
Object acceleration and angular acceleration.
Definition: task_control.hpp:108
RDB_GEOMETRY_t base_geo
Object dimension and offset to cog.
Definition: task_control.hpp:99
uint8_t base_type
Object type (car, truck, ...).
Definition: task_control.hpp:90
RDB_COORD_t base_pos
Object position and orientation.
Definition: task_control.hpp:102
std::string base_name
Player name.
Definition: task_control.hpp:96
uint32_t base_id
Object id.
Definition: task_control.hpp:84
const std::map< cloe::Object::Class, uint8_t > cloe_vtd_obj_class_map
Definition: task_control.hpp:122
RDB_GEOMETRY_t rdb_geometry_from_object(const cloe::Object &obj)
Definition: task_control.hpp:132