27 #include <unordered_map> 31 #include <boost/thread/locks.hpp> 32 #include <boost/thread/shared_mutex.hpp> 34 #include "gtest/gtest_prod.h" 36 #include "nlohmann/json.hpp" 38 #include "modules/audio/proto/audio.pb.h" 39 #include "modules/audio/proto/audio_event.pb.h" 40 #include "modules/common/proto/drive_event.pb.h" 41 #include "modules/common/proto/pnc_point.pb.h" 42 #include "modules/control/proto/control_cmd.pb.h" 43 #include "modules/dreamview/proto/simulation_world.pb.h" 44 #include "modules/localization/proto/gps.pb.h" 45 #include "modules/localization/proto/localization.pb.h" 46 #include "modules/perception/proto/traffic_light_detection.pb.h" 47 #include "modules/planning/proto/planning.pb.h" 48 #include "modules/planning/proto/planning_internal.pb.h" 49 #include "modules/prediction/proto/prediction_obstacle.pb.h" 50 #include "modules/storytelling/proto/story.pb.h" 51 #include "modules/task_manager/proto/task_manager.pb.h" 84 bool routing_from_file =
false);
90 inline const SimulationWorld &
world()
const {
return world_; }
108 std::string *sim_world_with_planning_data);
144 apollo::common::monitor::MonitorMessageItem::LogLevel log_level,
145 const std::string &msg);
148 const std::shared_ptr<apollo::relative_map::NavigationInfo> &);
150 const std::shared_ptr<apollo::routing::RoutingRequest> &);
152 void PublishTask(
const std::shared_ptr<apollo::task_manager::Task> &);
170 template <
typename DataType>
171 void UpdateSimulationWorld(
const DataType &data);
173 void UpdateMonitorMessages();
175 Object &CreateWorldObjectIfAbsent(
176 const apollo::perception::PerceptionObstacle &obstacle);
177 void CreateWorldObjectFromSensorMeasurement(
178 const apollo::perception::SensorMeasurement &sensor,
179 Object *world_object);
180 void SetObstacleInfo(
const apollo::perception::PerceptionObstacle &obstacle,
181 Object *world_object);
182 void SetObstaclePolygon(
183 const apollo::perception::PerceptionObstacle &obstacle,
184 Object *world_object);
185 void SetObstacleSensorMeasurements(
186 const apollo::perception::PerceptionObstacle &obstacle,
187 Object *world_object);
188 void SetObstacleSource(
const apollo::perception::PerceptionObstacle &obstacle,
189 Object *world_object);
190 void UpdatePlanningTrajectory(
191 const apollo::planning::ADCTrajectory &trajectory);
192 void UpdateRSSInfo(
const apollo::planning::ADCTrajectory &trajectory);
193 bool LocateMarker(
const apollo::planning::ObjectDecisionType &decision,
194 Decision *world_decision);
195 void FindNudgeRegion(
const apollo::planning::ObjectDecisionType &decision,
196 const Object &world_obj, Decision *world_decision);
197 void UpdateDecision(
const apollo::planning::DecisionResult &decision_res,
199 void UpdateMainStopDecision(
200 const apollo::planning::MainDecision &main_decision,
201 double update_timestamp_sec, Object *world_main_stop);
203 template <
typename MainDecision>
204 void UpdateMainChangeLaneDecision(
const MainDecision &decision,
205 Object *world_main_decision) {
206 if (decision.has_change_lane_type() &&
207 (decision.change_lane_type() == apollo::routing::ChangeLaneType::LEFT ||
208 decision.change_lane_type() ==
209 apollo::routing::ChangeLaneType::RIGHT)) {
210 auto *change_lane_decision = world_main_decision->add_decision();
211 change_lane_decision->set_change_lane_type(decision.change_lane_type());
213 const auto &adc = world_.auto_driving_car();
214 change_lane_decision->set_position_x(adc.position_x());
215 change_lane_decision->set_position_y(adc.position_y());
216 change_lane_decision->set_heading(adc.heading());
220 void CreatePredictionTrajectory(
221 const apollo::prediction::PredictionObstacle &obstacle,
222 Object *world_object);
224 void DownsamplePath(
const apollo::common::Path &paths,
225 apollo::common::Path *downsampled_path);
227 void UpdatePlanningData(
const apollo::planning_internal::PlanningData &data);
229 void PopulateMapInfo(
double radius);
235 template <
typename MessageT>
237 bool logging =
true) {
238 if (reader->
Empty()) {
240 AINFO_EVERY(100) <<
"Has not received any data from " 247 UpdateSimulationWorld(*msg);
254 template <
typename MessageT>
256 if (reader->
Empty()) {
258 <<
". Cannot dump message!";
265 void ReadRoutingFromFile(
const std::string &routing_response_file);
267 template <
typename MessageT>
268 void UpdateLatency(
const std::string &module_name,
270 if (reader->
Empty()) {
275 const double publish_time_sec = header.timestamp_sec();
276 const double sensor_time_sec =
278 std::max({header.lidar_timestamp(), header.camera_timestamp(),
279 header.radar_timestamp()}))
283 latency.set_timestamp_sec(publish_time_sec);
284 latency.set_total_time_ms((publish_time_sec - sensor_time_sec) * 1.0e3);
285 (*world_.mutable_latency())[module_name] = latency;
302 void UpdateLatencies();
304 template <
typename Po
ints>
305 void DownsampleSpeedPointsByInterval(
const Points &points,
306 size_t downsampleInterval,
307 Points *downsampled_points) {
308 if (points.empty()) {
312 for (
int i = 0; i + 1 < points.size(); i += downsampleInterval) {
313 *downsampled_points->Add() = points[i];
317 *downsampled_points->Add() = *points.rbegin();
320 std::unique_ptr<cyber::Node> node_;
324 SimulationWorld world_;
327 mutable boost::shared_mutex route_paths_mutex_;
328 std::vector<RoutePath> route_paths_;
334 std::unordered_map<std::string, Object> obj_map_;
337 std::mutex monitor_msgs_mutex_;
338 std::list<std::shared_ptr<common::monitor::MonitorMessage>> monitor_msgs_;
345 bool to_clear_ =
false;
348 apollo::hdmap::Map relative_map_;
351 std::atomic<bool> ready_to_push_;
354 double current_real_dist_ = 0.0;
355 double current_rss_safe_dist_ = 0.0;
358 apollo::canbus::Chassis_GearPosition gear_location_;
361 std::shared_ptr<cyber::Reader<apollo::canbus::Chassis>> chassis_reader_;
362 std::shared_ptr<cyber::Reader<apollo::localization::Gps>> gps_reader_;
363 std::shared_ptr<cyber::Reader<apollo::localization::LocalizationEstimate>>
364 localization_reader_;
365 std::shared_ptr<cyber::Reader<apollo::perception::PerceptionObstacles>>
366 perception_obstacle_reader_;
367 std::shared_ptr<cyber::Reader<apollo::perception::TrafficLightDetection>>
368 perception_traffic_light_reader_;
369 std::shared_ptr<cyber::Reader<apollo::prediction::PredictionObstacles>>
370 prediction_obstacle_reader_;
371 std::shared_ptr<cyber::Reader<apollo::planning::ADCTrajectory>>
373 std::shared_ptr<cyber::Reader<apollo::control::ControlCommand>>
374 control_command_reader_;
375 std::shared_ptr<cyber::Reader<apollo::relative_map::NavigationInfo>>
377 std::shared_ptr<cyber::Reader<apollo::relative_map::MapMsg>>
378 relative_map_reader_;
379 std::shared_ptr<cyber::Reader<apollo::audio::AudioEvent>> audio_event_reader_;
380 std::shared_ptr<cyber::Reader<apollo::common::DriveEvent>>
382 std::shared_ptr<cyber::Reader<apollo::common::monitor::MonitorMessage>>
384 std::shared_ptr<cyber::Reader<apollo::routing::RoutingRequest>>
385 routing_request_reader_;
386 std::shared_ptr<cyber::Reader<apollo::routing::RoutingResponse>>
387 routing_response_reader_;
388 std::shared_ptr<cyber::Reader<apollo::storytelling::Stories>>
389 storytelling_reader_;
390 std::shared_ptr<cyber::Reader<apollo::audio::AudioDetection>>
391 audio_detection_reader_;
392 std::shared_ptr<cyber::Reader<apollo::task_manager::Task>> task_reader_;
395 std::shared_ptr<cyber::Writer<apollo::relative_map::NavigationInfo>>
397 std::shared_ptr<cyber::Writer<apollo::routing::RoutingRequest>>
398 routing_request_writer_;
399 std::shared_ptr<cyber::Writer<apollo::routing::RoutingResponse>>
400 routing_response_writer_;
401 std::shared_ptr<cyber::Writer<apollo::task_manager::Task>> task_writer_;
403 FRIEND_TEST(SimulationWorldServiceTest, UpdateMonitorSuccess);
404 FRIEND_TEST(SimulationWorldServiceTest, UpdateMonitorRemove);
405 FRIEND_TEST(SimulationWorldServiceTest, UpdateMonitorTruncate);
406 FRIEND_TEST(SimulationWorldServiceTest, UpdateChassisInfo);
407 FRIEND_TEST(SimulationWorldServiceTest, UpdateLatency);
408 FRIEND_TEST(SimulationWorldServiceTest, UpdateLocalization);
409 FRIEND_TEST(SimulationWorldServiceTest, UpdatePerceptionObstacles);
410 FRIEND_TEST(SimulationWorldServiceTest, UpdatePlanningTrajectory);
411 FRIEND_TEST(SimulationWorldServiceTest, UpdateDecision);
412 FRIEND_TEST(SimulationWorldServiceTest, UpdatePrediction);
413 FRIEND_TEST(SimulationWorldServiceTest, UpdateRouting);
414 FRIEND_TEST(SimulationWorldServiceTest, UpdateGps);
415 FRIEND_TEST(SimulationWorldServiceTest, UpdateControlCommandWithSimpleLonLat);
416 FRIEND_TEST(SimulationWorldServiceTest, UpdateControlCommandWithSimpleMpc);
417 FRIEND_TEST(SimulationWorldServiceTest, DownsampleSpeedPointsByInterval);
void PublishNavigationInfo(const std::shared_ptr< apollo::relative_map::NavigationInfo > &)
::apollo::cyber::Time Time
Definition: racobit_radar_message_manager.h:41
void PublishRoutingRequest(const std::shared_ptr< apollo::routing::RoutingRequest > &)
bool ReadyToPush() const
Check whether the SimulationWorld object has enough information. The backend won't push the Simulatio...
Definition: simulation_world_service.h:135
static constexpr int kMaxMonitorItems
Definition: simulation_world_service.h:76
nlohmann::json GetMapElements(double radius) const
Returns the json representation of the map element Ids and hash within the given radius from the car...
const SimulationWorld & world() const
Get a read-only view of the SimulationWorld.
Definition: simulation_world_service.h:90
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
void GetMapElementIds(double radius, MapElementIds *ids) const
nlohmann::json GetUpdateAsJson(double radius) const
Returns the json representation of the SimulationWorld object. This is a public API used by offline d...
nlohmann::json GetRoutePathAsJson() const
Reader subscribes a channel, it has two main functions:
Definition: reader.h:68
Definition: map_service.h:40
This is a major component of the Simulation backend, which maintains a SimulationWorld object and kee...
Definition: simulation_world_service.h:72
const apollo::hdmap::Map & GetRelativeMap() const
bool DumpMessage(const std::shared_ptr< T > &msg, const std::string &dump_dir="/tmp")
Definition: message_util.h:57
void PublishMonitorMessage(apollo::common::monitor::MonitorMessageItem::LogLevel log_level, const std::string &msg)
Publish message to the monitor.
const std::string & GetChannelName() const
Get Reader's Channel name.
Definition: reader_base.h:125
void Update()
The function Update() is periodically called to check for updates from the external messages...
bool Empty() const override
Query whether the Reader has data to be handled.
Definition: reader.h:355
void SetToClear()
Sets the flag to clear the owned simulation world object.
Definition: simulation_world_service.h:128
virtual std::shared_ptr< MessageT > GetLatestObserved() const
Get the latest message we Observe
Definition: reader.h:377
void PublishTask(const std::shared_ptr< apollo::task_manager::Task > &)
SimulationWorldService(const MapService *map_service, bool routing_from_file=false)
Constructor of SimulationWorldService.
The class of MonitorLogBuffer.
double ToSecond() const
convert time to second.
#define AWARN
Definition: log.h:43
void GetWireFormatString(double radius, std::string *sim_world, std::string *sim_world_with_planning_data)
Returns the binary representation of the SimulationWorld object.
#define AINFO_EVERY(freq)
Definition: log.h:82
This class help collect MonitorMessage pb to monitor topic. The messages can be published automatical...
Definition: monitor_log_buffer.h:60