Skip to content

Commit 2c7f356

Browse files
tobifalkcassava
authored andcommitted
vtd: Support actuation requests from driver
1 parent 11a5dfe commit 2c7f356

File tree

3 files changed

+105
-7
lines changed

3 files changed

+105
-7
lines changed

optional/vtd/src/task_control.hpp

+53-2
Original file line numberDiff line numberDiff line change
@@ -123,12 +123,35 @@ class TaskControl : public VtdOmniSensor {
123123

124124
using VtdOmniSensor::process;
125125
void process(RDB_DRIVER_CTRL_t* driver_ctrl) override {
126-
steering_wheel_speed_[driver_ctrl->playerId] = driver_ctrl->steeringSpeed;
126+
// Steering speed at the front wheels [rad/s].
127+
if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_STEERING_SPEED) {
128+
steering_wheel_speed_[driver_ctrl->playerId] = driver_ctrl->steeringSpeed;
129+
} else {
130+
vtd_logger()->warn("{}: steeringSpeed missing in RDB_DRIVER_CTRL_t", this->get_name());
131+
steering_wheel_speed_[driver_ctrl->playerId] = 0.0;
132+
}
133+
134+
// Longitudinal acceleration request [m/s2].
135+
if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_ACCEL) {
136+
driver_request_accel_[driver_ctrl->playerId] = driver_ctrl->accelTgt;
137+
} else {
138+
vtd_logger()->warn("{}: accelTgt missing in RDB_DRIVER_CTRL_t", this->get_name());
139+
driver_request_accel_[driver_ctrl->playerId] = 0.0;
140+
}
141+
// Steering request (angle at wheels) [rad].
142+
if (driver_ctrl->validityFlags & RDB_DRIVER_INPUT_VALIDITY_TGT_STEERING) {
143+
driver_request_steering_angle_[driver_ctrl->playerId] = driver_ctrl->steeringTgt;
144+
} else {
145+
vtd_logger()->warn("{}: steeringTgt missing in RDB_DRIVER_CTRL_t", this->get_name());
146+
driver_request_steering_angle_[driver_ctrl->playerId] = 0.0;
147+
}
127148
}
128149

129150
void reset() override {
130151
VtdOmniSensor::reset();
131152
steering_wheel_speed_.clear();
153+
driver_request_accel_.clear();
154+
driver_request_steering_angle_.clear();
132155
}
133156

134157
/**
@@ -186,10 +209,36 @@ class TaskControl : public VtdOmniSensor {
186209
}
187210

188211
/**
189-
* Get steering wheel speed of vehicle with given id.
212+
* Get steering speed at front wheels of vehicle with given id [rad/s].
190213
*/
191214
double get_steering_wheel_speed(uint64_t id) const { return steering_wheel_speed_.at(id); }
192215

216+
/**
217+
* Get driver-requested longitudinal acceleration of vehicle with given id [m/s2].
218+
*/
219+
double get_driver_request_acceleration(uint64_t id) const { return driver_request_accel_.at(id); }
220+
221+
/**
222+
* Check if driver-requested longitudinal acceleration has been set.
223+
*/
224+
bool has_driver_request_acceleration(uint64_t id) {
225+
return driver_request_accel_.find(id) != driver_request_accel_.end();
226+
}
227+
228+
/**
229+
* Get driver-requested steering angle (at wheels) of vehicle with given id [rad].
230+
*/
231+
double get_driver_request_steering_angle(uint64_t id) const {
232+
return driver_request_steering_angle_.at(id);
233+
}
234+
235+
/**
236+
* Check if driver-requested steering_angle has been set.
237+
*/
238+
bool has_driver_request_steering_angle(uint64_t id) {
239+
return driver_request_steering_angle_.find(id) != driver_request_steering_angle_.end();
240+
}
241+
193242
friend void to_json(cloe::Json& j, const TaskControl& tc) {
194243
j = cloe::Json{{"rdb_connection", tc.rdb_}};
195244
}
@@ -198,6 +247,8 @@ class TaskControl : public VtdOmniSensor {
198247
/// RDBHandler helps us conveniently construct RDB messages.
199248
Framework::RDBHandler handler_;
200249
std::map<int, double> steering_wheel_speed_;
250+
std::map<int, double> driver_request_accel_;
251+
std::map<int, double> driver_request_steering_angle_;
201252
};
202253

203254
} // namespace vtd

optional/vtd/src/vtd_sensor_components.hpp

+40-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@
1919
* \file vtd_sensor_components.hpp
2020
*/
2121

22-
#include <cloe/component/ego_sensor.hpp> // for EgoSensor
23-
#include <cloe/component/lane_sensor.hpp> // for LaneBoundarySensor
24-
#include <cloe/component/object_sensor.hpp> // for ObjectSensor
22+
#include <cloe/component/driver_request.hpp> // for DriverRequest
23+
#include <cloe/component/ego_sensor.hpp> // for EgoSensor
24+
#include <cloe/component/lane_sensor.hpp> // for LaneBoundarySensor
25+
#include <cloe/component/object_sensor.hpp> // for ObjectSensor
2526

2627
#include "task_control.hpp" // for TaskControl
2728
#include "vtd_sensor_data.hpp" // for VtdSensorData
@@ -78,4 +79,40 @@ class VtdLaneBoundarySensor : public cloe::LaneBoundarySensor {
7879
std::shared_ptr<TaskControl> task_control_;
7980
};
8081

82+
class VtdDriverRequest : public cloe::DriverRequest {
83+
public:
84+
explicit VtdDriverRequest(uint64_t id, std::shared_ptr<TaskControl> task_control)
85+
: DriverRequest("vtd/driver_request"), id_(id), task_control_{task_control} {}
86+
87+
virtual ~VtdDriverRequest() = default;
88+
89+
bool has_acceleration() const override {
90+
return task_control_->has_driver_request_acceleration(id_);
91+
}
92+
93+
boost::optional<double> acceleration() const override {
94+
boost::optional<double> accel;
95+
if (this->has_acceleration()) {
96+
accel = task_control_->get_driver_request_acceleration(id_);
97+
}
98+
return accel;
99+
}
100+
101+
bool has_steering_angle() const override {
102+
return task_control_->has_driver_request_steering_angle(id_);
103+
}
104+
105+
boost::optional<double> steering_angle() const override {
106+
boost::optional<double> angle;
107+
if (this->has_steering_angle()) {
108+
angle = task_control_->get_driver_request_steering_angle(id_);
109+
}
110+
return angle;
111+
}
112+
113+
private:
114+
uint64_t id_;
115+
std::shared_ptr<TaskControl> task_control_;
116+
};
117+
81118
} // namespace vtd

optional/vtd/src/vtd_vehicle.hpp

+12-2
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,10 @@ class VtdVehicle : public cloe::Vehicle {
8484
*/
8585
VtdVehicle(uint64_t id, const std::string& name, std::unique_ptr<RdbTransceiverTcp>&& rdb_client,
8686
std::shared_ptr<TaskControl> task_control)
87-
: Vehicle(id, fmt::format("vtd_vehicle_{}", id)), vtd_name_(name) {
87+
: Vehicle(id, fmt::format("vtd_vehicle_{}", id))
88+
, vtd_name_(name)
89+
, id_(id)
90+
, task_control_(task_control) {
8891
// clang-format off
8992
sensor_port_ = rdb_client->tcp_port();
9093
vehicle_label_.tethered_to_player = name;
@@ -228,7 +231,10 @@ class VtdVehicle : public cloe::Vehicle {
228231
if (!sensors_.count(cfg.from)) {
229232
throw cloe::ModelError("reference to unknown sensor '{}'", cfg.from);
230233
}
231-
auto sensor = this->sensors_.at(cfg.from);
234+
std::shared_ptr<VtdSensorData> sensor;
235+
if (cfg.from != "task_control") {
236+
sensor = this->sensors_.at(cfg.from);
237+
}
232238
auto new_or_override_component = [this](cloe::Component* c, std::string name, bool override) {
233239
if (override) {
234240
this->emplace_component(std::shared_ptr<cloe::Component>(c), name);
@@ -240,6 +246,8 @@ class VtdVehicle : public cloe::Vehicle {
240246
new_or_override_component(new VtdLaneBoundarySensor{sensor}, name, cfg.override);
241247
} else if (cfg.type == "object_sensor") {
242248
new_or_override_component(new VtdWorldSensor{sensor}, name, cfg.override);
249+
} else if (cfg.type == "driver_request") {
250+
new_or_override_component(new VtdDriverRequest{id_, task_control_}, name, cfg.override);
243251
} else {
244252
throw cloe::ModelError("unknown component type '{}'", cfg.type);
245253
}
@@ -250,6 +258,8 @@ class VtdVehicle : public cloe::Vehicle {
250258
const std::string DEFAULT_SENSOR_NAME = "cloe::vtd::sensor::default";
251259
std::string vtd_name_{};
252260
uint16_t sensor_port_{0};
261+
uint16_t id_{0};
262+
std::shared_ptr<TaskControl> task_control_{nullptr};
253263
std::map<std::string, std::shared_ptr<VtdSensorData>> sensors_;
254264
std::shared_ptr<VtdLatLongActuator> actuator_{nullptr};
255265
scp::LabelVehicle vehicle_label_;

0 commit comments

Comments
 (0)