46 #include "vtd_conf.hpp"
85 VtdVehicle(uint64_t
id,
const std::string&
name, std::unique_ptr<RdbTransceiverTcp>&& rdb_client,
86 std::shared_ptr<TaskControl> task_control)
87 : Vehicle(id, fmt::format(
"vtd_vehicle_{}", id))
90 , task_control_(task_control) {
92 sensor_port_ = rdb_client->tcp_port();
93 vehicle_label_.tethered_to_player =
name;
94 vehicle_label_.text =
"!";
95 auto sensor = std::make_shared<VtdOmniSensor>(std::move(rdb_client),
id);
96 sensors_[DEFAULT_SENSOR_NAME] = sensor;
97 sensor->set_name(
name +
"_omni_sensor");
98 auto actuator = std::make_shared<VtdLatLongActuator>(task_control,
id);
99 ego_control_ = actuator;
101 this->new_component(
new VtdEgoSensor{id, sensor, task_control},
102 cloe::CloeComponent::GROUNDTRUTH_EGO_SENSOR,
103 cloe::CloeComponent::DEFAULT_EGO_SENSOR);
107 cloe::CloeComponent::DEFAULT_WORLD_SENSOR);
111 this->emplace_component(
112 std::make_shared<cloe::ObjectSensorFilter>(
113 this->get<cloe::ObjectSensor>(cloe::CloeComponent::DEFAULT_WORLD_SENSOR),
114 [](
const cloe::Object& obj) {
return obj.
type == cloe::Object::Type::Dynamic; }),
115 cloe::CloeComponent::DEFAULT_WORLD_SENSOR);
119 cloe::CloeComponent::GROUNDTRUTH_WORLD_SENSOR);
121 this->emplace_component(
122 std::make_shared<cloe::ObjectSensorFilter>(
123 this->get<cloe::ObjectSensor>(cloe::CloeComponent::GROUNDTRUTH_WORLD_SENSOR),
124 [](
const cloe::Object& obj) {
return obj.
type == cloe::Object::Type::Dynamic; }),
125 cloe::CloeComponent::GROUNDTRUTH_WORLD_SENSOR);
129 cloe::CloeComponent::GROUNDTRUTH_LANE_SENSOR,
130 cloe::CloeComponent::DEFAULT_LANE_SENSOR);
133 this->add_component(actuator,
134 cloe::CloeComponent::GROUNDTRUTH_LATLONG_ACTUATOR,
135 cloe::CloeComponent::DEFAULT_LATLONG_ACTUATOR);
142 const std::string&
vtd_name()
const {
return vtd_name_; }
150 LabelConfiguration lbl) {
152 this->ego_control_->step_begin(sync);
153 if (lbl != LabelConfiguration::Off) {
156 this->ego_control_->step_end(sync);
164 for (
auto kv : sensors_) {
165 auto sensor = kv.second;
167 d = std::min(sensor->simulation_time(), d);
169 return this->sensors_[DEFAULT_SENSOR_NAME]->simulation_time();
180 if (ego_control_->update_vehicle_label()) {
181 auto level = ego_control_->get_actuation_level();
183 case LabelConfiguration::Text:
184 vehicle_label_.text = level.to_loud_cstr();
186 case LabelConfiguration::Human:
187 vehicle_label_.text = level.to_human_cstr();
189 case LabelConfiguration::Symbol:
190 vehicle_label_.text = level.to_symbol_cstr();
192 case LabelConfiguration::Unicode:
193 vehicle_label_.text = level.to_unicode_cstr();
196 throw std::runtime_error(
"VtdVehicle: unknown label state");
211 for (
auto kv : sensors_) {
212 auto sensor = kv.second;
215 this->ego_control_->reset();
216 vehicle_label_.text =
"!";
224 j[
"vtd_name"] = v.vtd_name_;
225 j[
"sensors"] = v.sensors_;
226 j[
"actuator"] = v.ego_control_;
229 void configure_components(
const std::map<std::string, VtdComponentConfig>& components) {
230 for (
const auto& comp : components) {
231 auto name = comp.first;
232 auto cfg = comp.second;
233 if (cfg.from.empty()) {
235 if (cfg.type ==
"ego_state_model") {
236 auto ego_model = std::make_shared<VtdExternalEgoModel>(task_control_, id_, vtd_name_);
238 this->add_component(ego_model,
name);
239 ego_control_ = ego_model;
245 std::shared_ptr<VtdSensorData> sensor;
246 if (cfg.from !=
"task_control") {
247 if (!sensors_.count(cfg.from)) {
250 sensor = this->sensors_.at(cfg.from);
255 this->emplace_component(std::shared_ptr<cloe::Component>(c),
name);
257 this->add_component(std::shared_ptr<cloe::Component>(c),
name);
260 if (cfg.type ==
"lane_sensor") {
261 new_or_override_component(
new VtdLaneBoundarySensor{sensor},
name, cfg.override);
262 }
else if (cfg.type ==
"object_sensor") {
263 new_or_override_component(
new VtdWorldSensor{sensor},
name, cfg.override);
264 }
else if (cfg.type ==
"driver_request") {
265 new_or_override_component(
new VtdDriverRequest{id_, task_control_},
name, cfg.override);
274 const std::string DEFAULT_SENSOR_NAME =
"cloe::vtd::sensor::default";
275 std::string vtd_name_{};
276 uint16_t sensor_port_{0};
278 std::shared_ptr<TaskControl> task_control_{
nullptr};
279 std::map<std::string, std::shared_ptr<VtdSensorData>> sensors_;
280 std::shared_ptr<VtdVehicleControl> ego_control_{
nullptr};
281 scp::LabelVehicle vehicle_label_;
296 uint16_t initial_port,
const std::map<std::string, VtdVehicleConfig>& vehicles)
299 , sensor_host_(std::move(host))
300 , sensor_port_(initial_port)
301 , vehicles_(vehicles) {
303 remaining_vehicles_.resize(vehicles.size());
304 std::transform(vehicles.begin(), vehicles.end(), remaining_vehicles_.begin(),
305 [](
auto kv) { return kv.first; });
308 void set_task_control(std::shared_ptr<TaskControl> tc) { task_control_ = tc; }
310 std::shared_ptr<VtdVehicle> create_or_throw(
ScpTransceiver& tx,
int id,
const std::string& name,
312 assert(task_control_);
313 assert(sensor_port_ != 0);
314 remaining_vehicles_.erase(
315 std::remove(remaining_vehicles_.begin(), remaining_vehicles_.end(), name),
316 remaining_vehicles_.end());
320 auto port = sensor_port_++;
321 this->send_sensor_configuration(tx, port,
id);
324 std::this_thread::sleep_for(cloe::Milliseconds{100});
327 std::unique_ptr<RdbTransceiverTcp> rdb_client{
331 std::shared_ptr<VtdVehicle> veh =
332 std::make_shared<VtdVehicle>(
id, name, std::move(rdb_client), task_control_);
335 if (vehicles_.count(name)) {
337 for (
auto sens : vcfg.
sensors) {
338 auto name = sens.first;
339 auto cfg = sens.second;
340 auto port = sensor_port_++;
342 {
"sensor_id", port}, {
"sensor_name", name}, {
"sensor_port", port}, {
"player_id",
id}};
343 send_sensor_configuration(tx, cfg.xml, j);
344 std::this_thread::sleep_for(cloe::Milliseconds(100));
345 switch (cfg.protocol) {
346 case ProtocolConfiguration::Rdb: {
347 sensors_logger()->debug(
"Opening RDB channel {} for sensor {}", port, name);
348 std::shared_ptr<VtdOmniSensor> omni(
350 veh->sensors_[name] = omni;
353 case ProtocolConfiguration::Osi: {
354 sensors_logger()->debug(
"Opening TCP channel {} for OSI sensor {}", port, name);
355 std::shared_ptr<VtdOsiSensor> osi(
358 veh->sensors_[name] = osi;
362 throw cloe::Error(
"VtdVehicle: unknown sensor protocol");
372 std::vector<std::string> unregistered_vehicles() {
return remaining_vehicles_; }
378 void send_sensor_configuration(
ScpTransceiver& tx, uint16_t sensor_port,
int player_id)
const {
380 cfg.port = sensor_port;
381 cfg.player_id = player_id;
382 cfg.sensor_id = sensor_port;
389 void send_sensor_configuration(
ScpTransceiver& tx,
const std::string& xml,
390 const cloe::Json& params)
const {
391 tx.send(cloe::utility::inja_env().render(xml, params));
395 std::vector<std::string> remaining_vehicles_;
396 std::shared_ptr<TaskControl> task_control_{
nullptr};
399 std::string sensor_host_{
"localhost"};
400 uint16_t sensor_port_{0};
401 std::map<std::string, VtdVehicleConfig> vehicles_;
std::atomic_bool AbortFlag
Definition: abort.hpp:40
Definition: component.hpp:144
const std::string & name() const
Definition: entity.hpp:67
virtual Duration time() const =0
Definition: vehicle.hpp:106
std::unique_ptr< T > create_or_throw(const std::string &host, uint16_t port) const
Definition: tcp_transceiver.hpp:180
Definition: osi_transceiver_tcp.hpp:86
Definition: rdb_transceiver_tcp.hpp:95
Definition: scp_transceiver.hpp:81
Definition: vtd_sensor_components.hpp:32
Definition: vtd_sensor_components.hpp:65
Definition: omni_sensor_component.hpp:73
Definition: osi_sensor_component.hpp:48
Definition: vtd_vehicle.hpp:293
Definition: vtd_vehicle.hpp:57
cloe::Duration vtd_step_sensors(const cloe::Sync &s)
Definition: vtd_vehicle.hpp:162
friend void to_json(cloe::Json &j, const VtdVehicle &v)
Definition: vtd_vehicle.hpp:222
void reset()
Definition: vtd_vehicle.hpp:210
void update_label(ScpTransceiver &tx, LabelConfiguration lbl)
Definition: vtd_vehicle.hpp:179
VtdVehicle(uint64_t id, const std::string &name, std::unique_ptr< RdbTransceiverTcp > &&rdb_client, std::shared_ptr< TaskControl > task_control)
Definition: vtd_vehicle.hpp:85
const std::string & vtd_name() const
Definition: vtd_vehicle.hpp:142
void vtd_step_vehicle_control(const cloe::Sync &sync, ScpTransceiver &tx, LabelConfiguration lbl)
Definition: vtd_vehicle.hpp:149
void send_label(ScpTransceiver &tx) const
Definition: vtd_vehicle.hpp:205
Definition: vtd_sensor_components.hpp:51
std::chrono::nanoseconds Duration
Definition: cloe_fwd.hpp:36
Definition: object.hpp:51
Type type
Type of object.
Definition: object.hpp:63
Definition: tcp_transceiver_config.hpp:38
Definition: vtd_conf.hpp:163
std::map< std::string, VtdComponentConfig > components
Definition: vtd_conf.hpp:172
std::map< std::string, VtdSensorConfig > sensors
Definition: vtd_conf.hpp:167
Definition: scp_messages.hpp:65