19#include "absl/strings/str_cat.h"
29Features FeatureOutput::features_;
30ListDataForLearning FeatureOutput::list_data_for_learning_;
31ListPredictionResult FeatureOutput::list_prediction_result_;
32ListFrameEnv FeatureOutput::list_frame_env_;
33ListDataForTuning FeatureOutput::list_data_for_tuning_;
34std::size_t FeatureOutput::idx_feature_ = 0;
35std::size_t FeatureOutput::idx_learning_ = 0;
36std::size_t FeatureOutput::idx_prediction_result_ = 0;
37std::size_t FeatureOutput::idx_frame_env_ = 0;
38std::size_t FeatureOutput::idx_tuning_ = 0;
39std::mutex FeatureOutput::mutex_feature_;
42 ADEBUG <<
"Close feature output";
43 switch (FLAGS_prediction_offline_mode) {
76 idx_prediction_result_ = 0;
80 list_data_for_learning_.Clear();
81 list_prediction_result_.Clear();
82 list_frame_env_.Clear();
83 list_data_for_tuning_.Clear();
93 features_.add_feature()->CopyFrom(feature);
97 const Feature& feature,
const std::vector<double>& feature_values,
98 const std::string& category,
const LaneSequence* lane_sequence_ptr) {
99 const std::vector<std::string> dummy_string_feature_values;
101 category, lane_sequence_ptr);
105 const Feature& feature,
const std::vector<double>& feature_values,
106 const std::vector<std::string>& string_feature_values,
107 const std::string& category,
const LaneSequence* lane_sequence_ptr) {
110 list_data_for_learning_.add_data_for_learning();
111 data_for_learning->set_id(feature.
id());
112 data_for_learning->set_timestamp(feature.
timestamp());
113 *(data_for_learning->mutable_features_for_learning()) = {
114 feature_values.begin(), feature_values.end()};
115 *(data_for_learning->mutable_string_features_for_learning()) = {
116 string_feature_values.begin(), string_feature_values.end()};
117 data_for_learning->set_category(category);
118 ADEBUG <<
"Insert [" << category
119 <<
"] data for learning with size = " << feature_values.size();
120 if (lane_sequence_ptr !=
nullptr) {
121 data_for_learning->set_lane_sequence_id(
131 list_prediction_result_.add_prediction_result();
132 prediction_result->set_id(obstacle->
id());
133 prediction_result->set_timestamp(prediction_obstacle.
timestamp());
134 for (
int i = 0; i < prediction_obstacle.trajectory_size(); ++i) {
135 prediction_result->add_trajectory()->CopyFrom(
137 prediction_result->mutable_obstacle_conf()->CopyFrom(obstacle_conf);
150 list_frame_env_.add_frame_env()->CopyFrom(frame_env);
154 const Feature& feature,
const std::vector<double>& feature_values,
155 const std::string& category,
const LaneSequence& lane_sequence,
156 const std::vector<TrajectoryPoint>& adc_trajectory) {
158 DataForTuning* data_for_tuning = list_data_for_tuning_.add_data_for_tuning();
159 data_for_tuning->set_id(feature.
id());
160 data_for_tuning->set_timestamp(feature.
timestamp());
161 *data_for_tuning->mutable_values_for_tuning() = {feature_values.begin(),
162 feature_values.end()};
163 data_for_tuning->set_category(category);
164 ADEBUG <<
"Insert [" << category
165 <<
"] data for tuning with size = " << feature_values.size();
167 for (
const auto& adc_traj_point : adc_trajectory) {
168 data_for_tuning->add_adc_trajectory_point()->CopyFrom(adc_traj_point);
174 if (features_.
feature().empty()) {
175 ADEBUG <<
"Skip writing empty feature.";
177 const std::string file_name = absl::StrCat(
178 FLAGS_prediction_data_dir,
"/feature.", idx_feature_,
".bin");
188 ADEBUG <<
"Skip writing empty data_for_learning.";
190 const std::string file_name = absl::StrCat(
191 FLAGS_prediction_data_dir,
"/datalearn.", idx_learning_,
".bin");
193 list_data_for_learning_.Clear();
201 ADEBUG <<
"Skip writing empty prediction_result.";
203 const std::string file_name =
204 absl::StrCat(FLAGS_prediction_data_dir,
"/prediction_result.",
205 idx_prediction_result_,
".bin");
207 list_prediction_result_.Clear();
208 ++idx_prediction_result_;
214 if (list_frame_env_.
frame_env().empty()) {
215 ADEBUG <<
"Skip writing empty prediction_result.";
217 const std::string file_name = absl::StrCat(
218 FLAGS_prediction_data_dir,
"/frame_env.", idx_frame_env_,
".bin");
220 list_frame_env_.Clear();
228 ADEBUG <<
"Skip writing empty data_for_tuning.";
231 const std::string file_name = absl::StrCat(
232 FLAGS_prediction_data_dir,
"/datatuning.", idx_tuning_,
".bin");
234 list_data_for_tuning_.Clear();
240 return features_.feature_size();
245 return list_data_for_learning_.data_for_learning_size();
250 return list_prediction_result_.prediction_result_size();
255 return list_frame_env_.frame_env_size();
260 return list_data_for_tuning_.data_for_tuning_size();
static void InsertFeatureProto(const Feature &feature)
Insert a feature
static void InsertDataForLearning(const Feature &feature, const std::vector< double > &feature_values, const std::string &category, const LaneSequence *lane_sequence_ptr)
Insert a data_for_learning
static void WriteDataForLearning()
Write DataForLearning features to a file
static int SizeOfPredictionResult()
Get the size of prediction results.
static bool Ready()
Check if output is ready
static int Size()
Get feature size
static int SizeOfFrameEnv()
Get the size of frame env.
static void WriteDataForTuning()
Write DataForTuning features to a file
static int SizeOfDataForLearning()
Get the size of data_for_learning features.
static void WriteFrameEnv()
Write frame env to a file
static int SizeOfDataForTuning()
Get the size of data for tuning.
static void Close()
Close the output stream
static void WriteFeatureProto()
Write features to a file
static void InsertFrameEnv(const FrameEnv &frame_env)
Insert a frame env
static void InsertPredictionResult(const Obstacle *obstacle, const PredictionObstacle &prediction_obstacle, const ObstacleConf &obstacle_conf, const Scenario &scenario)
Insert a prediction result with predicted trajectories
static void InsertDataForTuning(const Feature &feature, const std::vector< double > &feature_values, const std::string &category, const LaneSequence &lane_sequence, const std::vector< apollo::common::TrajectoryPoint > &adc_trajectory)
Insert a data_for_tuning
static void WritePredictionResult()
Write PredictionResult to a file
bool IsInJunction(const std::string &junction_id) const
Check if the obstacle is a junction.
int id() const
Get the obstacle's ID.
bool IsOnLane() const
Check if the obstacle is on any lane.
#define UNIQUE_LOCK_MULTITHREAD(mutex_type)
bool SetProtoToBinaryFile(const google::protobuf::Message &message, const std::string &file_name)
Sets the content of the file specified by the file_name to be the binary representation of the input ...
optional double timestamp
optional int32 lane_sequence_id
repeated DataForLearning data_for_learning
repeated DataForTuning data_for_tuning
repeated FrameEnv frame_env
repeated PredictionResult prediction_result
repeated Trajectory trajectory
optional double timestamp
optional string junction_id