{"action":"created","comment":{"url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/comments/180569869","pull_request_review_id":111013573,"id":180569869,"diff_hunk":"@@ -0,0 +1,437 @@\n+/******************************************************************************\n+ * Copyright 2017 The Apollo Authors. All Rights Reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ * http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ *****************************************************************************/\n+\n+#include \"modules/localization/msf/local_integ/localization_gnss_process.h\"\n+#include <yaml-cpp/yaml.h>\n+#include <string>\n+#include \"modules/common/log.h\"\n+#include \"modules/common/time/time.h\"\n+#include \"modules/localization/msf/common/util/sleep.h\"\n+#include \"modules/localization/msf/local_integ/gnss_msg_transfer.h\"\n+\n+namespace apollo {\n+namespace localization {\n+namespace msf {\n+\n+using apollo::common::Status;\n+\n+LocalizationGnssProcess::LocalizationGnssProcess() {\n+  fp_eph_ = NULL;\n+  gnss_solver_ = new GnssSolver();\n+  double_antenna_solver_ = new GnssSolver();\n+\n+  current_obs_time_ = 0.0;\n+  gnss_state_ = LocalizationMeasureState::NOT_VALID;\n+  SetDefaultOption();\n+}\n+\n+LocalizationGnssProcess::~LocalizationGnssProcess() {\n+  map_gnss_eph_.clear();\n+  if (fp_eph_ != NULL) {\n+    fflush(fp_eph_);\n+    fclose(fp_eph_);\n+    fp_eph_ = NULL;\n+  }\n+\n+  delete gnss_solver_;\n+  gnss_solver_ = NULL;\n+  delete double_antenna_solver_;\n+  double_antenna_solver_ = NULL;\n+}\n+\n+Status LocalizationGnssProcess::Init(\n+    const LocalizationIntegParam &param) {\n+  // set launch parameter\n+  enable_ins_aid_rtk_ = param.enable_ins_aid_rtk;\n+  gnss_solver_->set_enable_external_prediction(enable_ins_aid_rtk_);\n+  enable_auto_save_eph_file_ = param.enable_auto_save_eph_file;\n+  eph_buffer_path_ = param.eph_buffer_path;\n+\n+  gnss_lever_arm_.arm_x = param.imu_to_ant_offset.offset_x;\n+  gnss_lever_arm_.arm_y = param.imu_to_ant_offset.offset_y;\n+  gnss_lever_arm_.arm_z = param.imu_to_ant_offset.offset_z;\n+\n+  // load buffer\n+  eph_header_writed_ = false;\n+  map_gnss_eph_.clear();\n+  sins_align_finish_ = false;\n+  std::string eph_full_path = eph_buffer_path_ + history_eph_file_;\n+  LOG(INFO) << \"Eph File path: \" << eph_full_path;\n+  bool b_exist = LoadHistoryEph(eph_full_path);\n+  if (enable_auto_save_eph_file_) {\n+    LOG(INFO) << \"Begin to write eph file!\";\n+    fp_eph_ = fopen(static_cast<const char *>(eph_full_path.data()), \"a+\");\n+    if (!b_exist) {\n+      // no existing file\n+      if (fp_eph_ != NULL) {\n+        fprintf(fp_eph_, \"END OF HEADER\\n\");\n+        fflush(fp_eph_);\n+        eph_header_writed_ = true;\n+      }\n+    } else {\n+      eph_header_writed_ = true;\n+    }\n+  } else {\n+    fp_eph_ = NULL;\n+  }\n+#ifdef _ENABLE_SAVE_PURE_RTK_\n+  std::string pos_full_path = eph_buffer_path_ + \"pos.txt\";\n+  gnss_solver_->set_rtk_result_file(static_cast<char *>(pos_full_path.data()));\n+  std::string amb_full_path = eph_buffer_path_ + \"amb.txt\";\n+  gnss_solver_->set_ambiguity_file(static_cast<char *>(amb_full_path.data()));\n+#endif\n+  return Status::OK();\n+}\n+\n+void LocalizationGnssProcess::RawObservationProcess(\n+    const drivers::gnss::EpochObservation &raw_obs) {\n+  if (!raw_obs.has_receiver_id()) {\n+    LOG(INFO) << \"Obs data being invalid if without receiver id!\";\n+    return;\n+  }\n+  double leap_second_s = 18.0;\n+  const double unix_to_gps = 315964800;\n+  const double sec_per_week = 604800;\n+  leap_second_s = gnss_solver_->get_leap_second(raw_obs.gnss_week(),\n+                                               raw_obs.gnss_second_s());\n+\n+  // double sys_secs_to_gnss = ros::Time::now().toSec()\n+  //    - unix_to_gps + leap_second_s;\n+  double sys_secs_to_gnss = common::time::Clock::NowInSeconds()\n+      - unix_to_gps + leap_second_s;\n+  double obs_secs =\n+      raw_obs.gnss_second_s() + raw_obs.gnss_week() * sec_per_week;\n+  double obs_delay = sys_secs_to_gnss - obs_secs;\n+\n+  double obs_xyz[3] = {0.0};\n+  if (raw_obs.has_position_x() && raw_obs.has_position_y() &&\n+      raw_obs.has_position_z()) {\n+    obs_xyz[0] = raw_obs.position_x();\n+    obs_xyz[1] = raw_obs.position_y();\n+    obs_xyz[2] = raw_obs.position_z();\n+  }\n+  const unsigned int max_msg_size = 256;\n+  char message[max_msg_size] = {'\\0'};\n+  snprintf(\n+      message, max_msg_size,\n+      \"user %u time:%12.3f sat_num:%d obs_delay:%12.3f%16.3f%16.3f%16.3f\\n\",\n+      raw_obs.receiver_id(), raw_obs.gnss_second_s(), raw_obs.sat_obs_num(),\n+      obs_delay, obs_xyz[0], obs_xyz[1], obs_xyz[2]);\n+  LOG(INFO) << message;\n+\n+  EpochObservationMsg raw_obs_msg;\n+  GnssMagTransfer::Transfer(raw_obs, &raw_obs_msg);\n+  if (raw_obs.receiver_id() != 0) {\n+    // Notice: the baser coordinate should be binded with obs together anytime.\n+    gnss_solver_->save_baser_observation(raw_obs_msg);\n+    // id - 0x80000000 = station_id from gnss_driver\n+    return;\n+  }\n+\n+  const unsigned int second_per_week = 604800;\n+  double new_obs_time =\n+      raw_obs.gnss_second_s() + raw_obs.gnss_week() * second_per_week;\n+  if (new_obs_time <= current_obs_time_) {\n+    return;\n+  }\n+  current_obs_time_ = new_obs_time;\n+  GnssPosition(&raw_obs_msg);\n+}\n+\n+void LocalizationGnssProcess::RawEphemerisProcess(\n+    const drivers::gnss::GnssEphemeris &msg) {\n+  auto gnss_orbit = msg;\n+  // GnssEphemeris gnss_orbit(gnss_orbit_msg);\n+  if (!gnss_orbit.has_gnss_type()) {\n+    return;\n+  }\n+  if (gnss_orbit.gnss_type() == drivers::gnss::GnssType::GLO_SYS) {\n+    /* caros driver (derived from rtklib src) set glonass eph toe as the GPST,\n+     * and here convert it back to UTC(+0), so leap seconds shoudl be in\n+     * accordance with the GNSS-Driver\n+     */\n+    double leap_sec = 18.0;\n+    leap_sec =\n+        gnss_solver_->get_leap_second(gnss_orbit.glonass_orbit().week_num(),\n+                                     gnss_orbit.glonass_orbit().toe());\n+    double toe = gnss_orbit.glonass_orbit().toe() - leap_sec;\n+    gnss_orbit.mutable_glonass_orbit()->set_toe(toe);\n+    gnss_orbit.mutable_glonass_orbit()->set_week_second_s(toe);\n+  }\n+  static int eph_counter = 0;\n+  ++eph_counter;\n+  // printf(\"received a gnss ephemeris: %d!\\n\", eph_counter);\n+  if (DuplicateEph(gnss_orbit)) {\n+    LOG(INFO) << \"received an existed gnss ephemeris!\";\n+    return;\n+  }\n+\n+  GnssEphemerisMsg gnss_orbit_msg;\n+  GnssMagTransfer::Transfer(gnss_orbit, &gnss_orbit_msg);\n+  if (gnss_solver_->save_gnss_ephemris(gnss_orbit_msg)) {\n+    // save to file only when new arriving eph is truely NEW!\n+    if (enable_auto_save_eph_file_ && fp_eph_ != NULL) {\n+      // TODO(zhouyao): add write_eph\n+      // apollo::localization::msf::RinexNav::write_eph(\n+      //     false, fp_eph_, gnss_orbit);\n+      // fflush(fp_eph_);\n+    }\n+  }\n+}\n+\n+void LocalizationGnssProcess::IntegSinsPvaProcess(\n+    const InsPva &sins_pva_msg, const double variance[9][9]) {\n+  if (!sins_pva_msg.init_and_alignment) {\n+    return;\n+  }\n+\n+  sins_align_finish_ = true;\n+\n+  // feed into GNSS-RTK Engine\n+  double sec_s = sins_pva_msg.time;\n+  double llh[3] = {sins_pva_msg.pos.longitude,\n+                   sins_pva_msg.pos.latitude,\n+                   sins_pva_msg.pos.height};\n+  double velocity[3] = {sins_pva_msg.vel.ve, sins_pva_msg.vel.vn,\n+                        sins_pva_msg.vel.vu};\n+  double lever_arm[3] = {gnss_lever_arm_.arm_x,\n+                         gnss_lever_arm_.arm_y,\n+                         gnss_lever_arm_.arm_z};\n+  double euler[3] = {sins_pva_msg.att.pitch,\n+                     sins_pva_msg.att.roll,\n+                     sins_pva_msg.att.yaw};\n+\n+  double std_pos[3][3] = {0.0};\n+  double std_vel[3][3] = {0.0};\n+  // const unsigned int dim = 9;\n+  for (unsigned int i = 0; i < 3; ++i) {\n+    for (unsigned int j = 0; j < 3; ++j) {\n+      std_pos[i][j] = variance[i][j];\n+      std_vel[i][j] = variance[i + 3][j + 3];\n+    }\n+  }\n+\n+  gnss_solver_->motion_update(sec_s, llh, std_pos,\n+                              velocity, std_vel,\n+                              euler, lever_arm);\n+  return;\n+}\n+\n+LocalizationMeasureState LocalizationGnssProcess::GetResult(\n+    MeasureData *gnss_msg) {\n+  // convert GnssPntResult to IntegMeasure\n+  // double sec_s = Clock::NowInSeconds(); // ros::Time::now().toSec();\n+  const unsigned int second_per_week = 604800;\n+  double sec_s = gnss_pnt_result_.gnss_week() * second_per_week +\n+          gnss_pnt_result_.gnss_second_s();\n+  gnss_msg->time = sec_s;\n+  gnss_msg->frame_type = FrameType::ECEF;\n+\n+  // velocity must be in ENU frame and position in frame WGS84\n+  const int dim = 9;\n+  for (int i = 0; i < dim; ++i) {\n+    for (int j = 0; j < dim; ++j) {\n+      gnss_msg->variance[i][j] = 0.0;\n+    }\n+  }\n+\n+  bool b_pos = false;\n+  unsigned int index = 0;\n+  if (gnss_pnt_result_.has_pos_x_m() && gnss_pnt_result_.has_pos_y_m() &&\n+      gnss_pnt_result_.has_pos_z_m()) {\n+    b_pos = true;\n+    gnss_msg->gnss_pos.longitude = gnss_pnt_result_.pos_x_m();\n+    gnss_msg->gnss_pos.latitude = gnss_pnt_result_.pos_y_m();\n+    gnss_msg->gnss_pos.height = gnss_pnt_result_.pos_z_m();\n+    gnss_msg->measure_type = MeasureType::GNSS_POS_ONLY;\n+\n+    gnss_msg->is_have_variance = true;\n+    // std\n+    gnss_msg->variance[0][0] =\n+        gnss_pnt_result_.std_pos_x_m() * gnss_pnt_result_.std_pos_x_m();\n+    gnss_msg->variance[1][1] =\n+        gnss_pnt_result_.std_pos_y_m() * gnss_pnt_result_.std_pos_y_m();\n+    gnss_msg->variance[2][2] =\n+        gnss_pnt_result_.std_pos_z_m() * gnss_pnt_result_.std_pos_z_m();\n+  }\n+  bool b_vel = false;\n+  if (gnss_pnt_result_.has_vel_x_m() && gnss_pnt_result_.has_vel_y_m() &&\n+      gnss_pnt_result_.has_vel_z_m()) {\n+    // output velocity whenever possible.\n+    b_vel = true;\n+    gnss_msg->gnss_vel.ve = gnss_pnt_result_.vel_x_m();\n+    gnss_msg->gnss_vel.vn = gnss_pnt_result_.vel_y_m();\n+    gnss_msg->gnss_vel.vu = gnss_pnt_result_.vel_z_m();\n+    gnss_msg->measure_type = MeasureType::ENU_VEL_ONLY;\n+    gnss_msg->is_have_variance = true;\n+    // std\n+    gnss_msg->variance[3][3] =\n+        gnss_pnt_result_.std_vel_x_m() * gnss_pnt_result_.std_vel_x_m();\n+    gnss_msg->variance[4][4] =\n+        gnss_pnt_result_.std_vel_y_m() * gnss_pnt_result_.std_vel_y_m();\n+    gnss_msg->variance[5][5] =\n+        gnss_pnt_result_.std_vel_z_m() * gnss_pnt_result_.std_vel_z_m();\n+  }\n+  if (b_pos && b_vel) {\n+    gnss_msg->measure_type = MeasureType::GNSS_POS_VEL;\n+  }\n+\n+  return gnss_state_;\n+}\n+\n+void LocalizationGnssProcess::SetDefaultOption() {\n+  // set default process modes\n+  gnss_solver_->set_position_option(3);\n+  gnss_solver_->set_tropsphere_option(0);\n+  gnss_solver_->enable_cycle_slip_fix();\n+  enable_ins_aid_rtk_ = false;\n+  enable_auto_save_eph_file_ = true;\n+  eph_buffer_path_ = std::string(\"/home/idl/test_ros/params/\");\n+\n+  gnss_lever_arm_.arm_x = -0.030;\n+  gnss_lever_arm_.arm_y = 0.338;\n+  gnss_lever_arm_.arm_z = 1.291;\n+  const int time_based = 1;\n+  if (!time_based) {\n+    history_eph_file_ = \"brdm.17p\";\n+  } else {\n+    time_t time_p;\n+    time(&time_p);\n+    struct tm now_time;\n+    struct tm *p_tm = &now_time;\n+    // struct tm *p_tm = localtime(&time_p);\n+    localtime_r(&time_p, p_tm);\n+    unsigned int day_of_year = p_tm->tm_yday;\n+    unsigned int year = 1900 + p_tm->tm_year;\n+    unsigned int year_2000 = year - 2000;\n+\n+    const unsigned int len = 64;\n+    char eph_file[len] = {'\\0'};\n+    snprintf(eph_file, len, \"brdx%03d%1d.%2dp\", day_of_year, 0, year_2000);\n+    history_eph_file_ = eph_file;\n+  }\n+}\n+\n+bool LocalizationGnssProcess::LoadHistoryEph(const std::string &nav_file) {\n+  return false;\n+\n+  // char *file = (char *)(std::string(nav_file).data());\n+  // if (file == NULL) {\n+  //   return false;\n+  // }\n+  // apollo::localization::msf::RinexNav mix_v_302(file,\n+  // apollo::localization::msf::VERSION_3);\n+  // if (mix_v_302.is_file_open() == false) {\n+  //   Print(\"fail to load ephemeris!\\n\", 1);\n+  //   return false;\n+  // }\n+\n+  // return true;\n+}\n+\n+bool LocalizationGnssProcess::DuplicateEph(\n+    const drivers::gnss::GnssEphemeris &raw_eph) {\n+  drivers::gnss::GnssType t_type = raw_eph.gnss_type();\n+  if (t_type != drivers::gnss::GnssType::GPS_SYS &&\n+      t_type != drivers::gnss::GnssType::BDS_SYS &&\n+      t_type != drivers::gnss::GnssType::GLO_SYS) {\n+    return true;\n+  }\n+  unsigned int sat_prn = 0;\n+  unsigned int week_num = 0;\n+  double toe = -0.1;\n+  if (t_type == drivers::gnss::GnssType::GLO_SYS) {\n+    sat_prn = raw_eph.glonass_orbit().slot_prn();\n+    week_num = raw_eph.glonass_orbit().week_num();\n+    toe = raw_eph.glonass_orbit().toe();\n+  } else {\n+    sat_prn = raw_eph.keppler_orbit().sat_prn();\n+    week_num = raw_eph.keppler_orbit().week_num();\n+    toe = raw_eph.keppler_orbit().toe();\n+  }\n+  const EphKey temp(drivers::gnss::GnssType(t_type), sat_prn, week_num, toe);\n+  if (map_gnss_eph_.find(temp) != map_gnss_eph_.end()) {\n+    return true;\n+  }\n+  map_gnss_eph_.insert(\n+      std::map<EphKey, drivers::gnss::GnssEphemeris>::\n+      value_type(temp, raw_eph));\n+  return false;\n+}\n+\n+inline void LocalizationGnssProcess::LogPnt(const GnssPntResultMsg &rover_pnt,\n+                                            double ratio) {\n+  char print_infor[256] = {'\\0'};\n+  snprintf(print_infor, sizeof(print_infor),\n+           \"%6d%12.3f%4d%16.3f%16.3f%16.3f%4d%4.1f%6.1f%8.3f%8.3f%8.3f%8.3f%8.\"\n+           \"3f%8.3f\\n\",\n+           rover_pnt.gnss_week(), rover_pnt.gnss_second_s(),\n+           static_cast<int>(rover_pnt.pnt_type()),\n+           rover_pnt.pos_x_m(), rover_pnt.pos_y_m(),\n+           rover_pnt.pos_z_m(), rover_pnt.sovled_sat_num(), rover_pnt.pdop(),\n+           ratio, rover_pnt.vel_x_m(), rover_pnt.vel_y_m(),\n+           rover_pnt.vel_z_m(), rover_pnt.std_pos_x_m(),\n+           rover_pnt.std_pos_y_m(), rover_pnt.std_pos_z_m());\n+  LOG(INFO) << print_infor;\n+}\n+\n+bool LocalizationGnssProcess::GnssPosition(\n+    EpochObservationMsg *raw_rover_obs) {\n+  gnss_state_ = LocalizationMeasureState::NOT_VALID;\n+  if (raw_rover_obs->receiver_id() != 0) {\n+    LOG(INFO) << \"Wrong Rover Obs Data!\";\n+    return false;\n+  }\n+  // debug\n+  int b_solved = gnss_solver_->solve(raw_rover_obs, &gnss_pnt_result_);\n+  if (b_solved < 0) {\n+    return false;\n+  }\n+  LogPnt(gnss_pnt_result_, gnss_solver_->get_ratio());\n+  if (!sins_align_finish_) {\n+    LOG(INFO) << \"Sins-ekf has not converged or finished its aligment!\";\n+  }\n+  if (gnss_pnt_result_.has_std_pos_x_m() &&\n+      gnss_pnt_result_.has_std_pos_y_m() &&\n+      gnss_pnt_result_.has_std_pos_z_m()) {\n+    double sigma =\n+        gnss_pnt_result_.std_pos_x_m() * gnss_pnt_result_.std_pos_x_m() +\n+        gnss_pnt_result_.std_pos_y_m() * gnss_pnt_result_.std_pos_y_m() +\n+        gnss_pnt_result_.std_pos_z_m() * gnss_pnt_result_.std_pos_z_m();\n+    sigma = std::sqrt(fabs(sigma));\n+    if (fabs(sigma) > 10.0) {\n+      LOG(INFO) << \"Position std exceeds the threshold 10.0!\";","path":"modules/localization/msf/local_integ/localization_gnss_process.cc","position":null,"original_position":416,"commit_id":"fc0f72a64649145a96b051f5920386a05787b952","original_commit_id":"9d19de785d7386b0e130cc6d7bd938b47f04ad3c","user":{"login":"zhouyao4321","id":31580760,"avatar_url":"https://avatars3.githubusercontent.com/u/31580760?v=4","gravatar_id":"","url":"https://api.github.com/users/zhouyao4321","html_url":"https://github.com/zhouyao4321","followers_url":"https://api.github.com/users/zhouyao4321/followers","following_url":"https://api.github.com/users/zhouyao4321/following{/other_user}","gists_url":"https://api.github.com/users/zhouyao4321/gists{/gist_id}","starred_url":"https://api.github.com/users/zhouyao4321/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhouyao4321/subscriptions","organizations_url":"https://api.github.com/users/zhouyao4321/orgs","repos_url":"https://api.github.com/users/zhouyao4321/repos","events_url":"https://api.github.com/users/zhouyao4321/events{/privacy}","received_events_url":"https://api.github.com/users/zhouyao4321/received_events","type":"User","site_admin":false},"body":"Use AINFO, AWARN, AERROR in all pull request files","created_at":"2018-04-10T21:14:23Z","updated_at":"2018-04-10T21:14:23Z","html_url":"https://github.com/ApolloAuto/apollo/pull/3773#discussion_r180569869","pull_request_url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/comments/180569869"},"html":{"href":"https://github.com/ApolloAuto/apollo/pull/3773#discussion_r180569869"},"pull_request":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773"}},"in_reply_to_id":180235089},"pull_request":{"url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773","id":180419133,"html_url":"https://github.com/ApolloAuto/apollo/pull/3773","diff_url":"https://github.com/ApolloAuto/apollo/pull/3773.diff","patch_url":"https://github.com/ApolloAuto/apollo/pull/3773.patch","issue_url":"https://api.github.com/repos/ApolloAuto/apollo/issues/3773","number":3773,"state":"open","locked":false,"title":"Localization: msf localization module update","user":{"login":"zhouyao4321","id":31580760,"avatar_url":"https://avatars3.githubusercontent.com/u/31580760?v=4","gravatar_id":"","url":"https://api.github.com/users/zhouyao4321","html_url":"https://github.com/zhouyao4321","followers_url":"https://api.github.com/users/zhouyao4321/followers","following_url":"https://api.github.com/users/zhouyao4321/following{/other_user}","gists_url":"https://api.github.com/users/zhouyao4321/gists{/gist_id}","starred_url":"https://api.github.com/users/zhouyao4321/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhouyao4321/subscriptions","organizations_url":"https://api.github.com/users/zhouyao4321/orgs","repos_url":"https://api.github.com/users/zhouyao4321/repos","events_url":"https://api.github.com/users/zhouyao4321/events{/privacy}","received_events_url":"https://api.github.com/users/zhouyao4321/received_events","type":"User","site_admin":false},"body":"","created_at":"2018-04-09T20:32:11Z","updated_at":"2018-04-10T21:14:23Z","closed_at":null,"merged_at":null,"merge_commit_sha":"76c2b4980cc09e3fd148a4c9ca82ba9ab1b9f6c4","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773/commits","review_comments_url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773/comments","review_comment_url":"https://api.github.com/repos/ApolloAuto/apollo/pulls/comments{/number}","comments_url":"https://api.github.com/repos/ApolloAuto/apollo/issues/3773/comments","statuses_url":"https://api.github.com/repos/ApolloAuto/apollo/statuses/fc0f72a64649145a96b051f5920386a05787b952","head":{"label":"zhouyao4321:msf_localization_v0.1","ref":"msf_localization_v0.1","sha":"fc0f72a64649145a96b051f5920386a05787b952","user":{"login":"zhouyao4321","id":31580760,"avatar_url":"https://avatars3.githubusercontent.com/u/31580760?v=4","gravatar_id":"","url":"https://api.github.com/users/zhouyao4321","html_url":"https://github.com/zhouyao4321","followers_url":"https://api.github.com/users/zhouyao4321/followers","following_url":"https://api.github.com/users/zhouyao4321/following{/other_user}","gists_url":"https://api.github.com/users/zhouyao4321/gists{/gist_id}","starred_url":"https://api.github.com/users/zhouyao4321/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhouyao4321/subscriptions","organizations_url":"https://api.github.com/users/zhouyao4321/orgs","repos_url":"https://api.github.com/users/zhouyao4321/repos","events_url":"https://api.github.com/users/zhouyao4321/events{/privacy}","received_events_url":"https://api.github.com/users/zhouyao4321/received_events","type":"User","site_admin":false},"repo":{"id":118217408,"name":"apollo","full_name":"zhouyao4321/apollo","owner":{"login":"zhouyao4321","id":31580760,"avatar_url":"https://avatars3.githubusercontent.com/u/31580760?v=4","gravatar_id":"","url":"https://api.github.com/users/zhouyao4321","html_url":"https://github.com/zhouyao4321","followers_url":"https://api.github.com/users/zhouyao4321/followers","following_url":"https://api.github.com/users/zhouyao4321/following{/other_user}","gists_url":"https://api.github.com/users/zhouyao4321/gists{/gist_id}","starred_url":"https://api.github.com/users/zhouyao4321/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zhouyao4321/subscriptions","organizations_url":"https://api.github.com/users/zhouyao4321/orgs","repos_url":"https://api.github.com/users/zhouyao4321/repos","events_url":"https://api.github.com/users/zhouyao4321/events{/privacy}","received_events_url":"https://api.github.com/users/zhouyao4321/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/zhouyao4321/apollo","description":"An open autonomous driving platform","fork":true,"url":"https://api.github.com/repos/zhouyao4321/apollo","forks_url":"https://api.github.com/repos/zhouyao4321/apollo/forks","keys_url":"https://api.github.com/repos/zhouyao4321/apollo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zhouyao4321/apollo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zhouyao4321/apollo/teams","hooks_url":"https://api.github.com/repos/zhouyao4321/apollo/hooks","issue_events_url":"https://api.github.com/repos/zhouyao4321/apollo/issues/events{/number}","events_url":"https://api.github.com/repos/zhouyao4321/apollo/events","assignees_url":"https://api.github.com/repos/zhouyao4321/apollo/assignees{/user}","branches_url":"https://api.github.com/repos/zhouyao4321/apollo/branches{/branch}","tags_url":"https://api.github.com/repos/zhouyao4321/apollo/tags","blobs_url":"https://api.github.com/repos/zhouyao4321/apollo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zhouyao4321/apollo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zhouyao4321/apollo/git/refs{/sha}","trees_url":"https://api.github.com/repos/zhouyao4321/apollo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zhouyao4321/apollo/statuses/{sha}","languages_url":"https://api.github.com/repos/zhouyao4321/apollo/languages","stargazers_url":"https://api.github.com/repos/zhouyao4321/apollo/stargazers","contributors_url":"https://api.github.com/repos/zhouyao4321/apollo/contributors","subscribers_url":"https://api.github.com/repos/zhouyao4321/apollo/subscribers","subscription_url":"https://api.github.com/repos/zhouyao4321/apollo/subscription","commits_url":"https://api.github.com/repos/zhouyao4321/apollo/commits{/sha}","git_commits_url":"https://api.github.com/repos/zhouyao4321/apollo/git/commits{/sha}","comments_url":"https://api.github.com/repos/zhouyao4321/apollo/comments{/number}","issue_comment_url":"https://api.github.com/repos/zhouyao4321/apollo/issues/comments{/number}","contents_url":"https://api.github.com/repos/zhouyao4321/apollo/contents/{+path}","compare_url":"https://api.github.com/repos/zhouyao4321/apollo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zhouyao4321/apollo/merges","archive_url":"https://api.github.com/repos/zhouyao4321/apollo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zhouyao4321/apollo/downloads","issues_url":"https://api.github.com/repos/zhouyao4321/apollo/issues{/number}","pulls_url":"https://api.github.com/repos/zhouyao4321/apollo/pulls{/number}","milestones_url":"https://api.github.com/repos/zhouyao4321/apollo/milestones{/number}","notifications_url":"https://api.github.com/repos/zhouyao4321/apollo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zhouyao4321/apollo/labels{/name}","releases_url":"https://api.github.com/repos/zhouyao4321/apollo/releases{/id}","deployments_url":"https://api.github.com/repos/zhouyao4321/apollo/deployments","created_at":"2018-01-20T06:50:37Z","updated_at":"2018-04-08T07:44:58Z","pushed_at":"2018-04-10T20:05:14Z","git_url":"git://github.com/zhouyao4321/apollo.git","ssh_url":"git@github.com:zhouyao4321/apollo.git","clone_url":"https://github.com/zhouyao4321/apollo.git","svn_url":"https://github.com/zhouyao4321/apollo","homepage":null,"size":379698,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"ApolloAuto:master","ref":"master","sha":"1798098e1cd70db0e368add7683f30f0bcb09e07","user":{"login":"ApolloAuto","id":28768304,"avatar_url":"https://avatars1.githubusercontent.com/u/28768304?v=4","gravatar_id":"","url":"https://api.github.com/users/ApolloAuto","html_url":"https://github.com/ApolloAuto","followers_url":"https://api.github.com/users/ApolloAuto/followers","following_url":"https://api.github.com/users/ApolloAuto/following{/other_user}","gists_url":"https://api.github.com/users/ApolloAuto/gists{/gist_id}","starred_url":"https://api.github.com/users/ApolloAuto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ApolloAuto/subscriptions","organizations_url":"https://api.github.com/users/ApolloAuto/orgs","repos_url":"https://api.github.com/users/ApolloAuto/repos","events_url":"https://api.github.com/users/ApolloAuto/events{/privacy}","received_events_url":"https://api.github.com/users/ApolloAuto/received_events","type":"Organization","site_admin":false},"repo":{"id":96246170,"name":"apollo","full_name":"ApolloAuto/apollo","owner":{"login":"ApolloAuto","id":28768304,"avatar_url":"https://avatars1.githubusercontent.com/u/28768304?v=4","gravatar_id":"","url":"https://api.github.com/users/ApolloAuto","html_url":"https://github.com/ApolloAuto","followers_url":"https://api.github.com/users/ApolloAuto/followers","following_url":"https://api.github.com/users/ApolloAuto/following{/other_user}","gists_url":"https://api.github.com/users/ApolloAuto/gists{/gist_id}","starred_url":"https://api.github.com/users/ApolloAuto/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ApolloAuto/subscriptions","organizations_url":"https://api.github.com/users/ApolloAuto/orgs","repos_url":"https://api.github.com/users/ApolloAuto/repos","events_url":"https://api.github.com/users/ApolloAuto/events{/privacy}","received_events_url":"https://api.github.com/users/ApolloAuto/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/ApolloAuto/apollo","description":"An open autonomous driving platform","fork":false,"url":"https://api.github.com/repos/ApolloAuto/apollo","forks_url":"https://api.github.com/repos/ApolloAuto/apollo/forks","keys_url":"https://api.github.com/repos/ApolloAuto/apollo/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ApolloAuto/apollo/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ApolloAuto/apollo/teams","hooks_url":"https://api.github.com/repos/ApolloAuto/apollo/hooks","issue_events_url":"https://api.github.com/repos/ApolloAuto/apollo/issues/events{/number}","events_url":"https://api.github.com/repos/ApolloAuto/apollo/events","assignees_url":"https://api.github.com/repos/ApolloAuto/apollo/assignees{/user}","branches_url":"https://api.github.com/repos/ApolloAuto/apollo/branches{/branch}","tags_url":"https://api.github.com/repos/ApolloAuto/apollo/tags","blobs_url":"https://api.github.com/repos/ApolloAuto/apollo/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ApolloAuto/apollo/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ApolloAuto/apollo/git/refs{/sha}","trees_url":"https://api.github.com/repos/ApolloAuto/apollo/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ApolloAuto/apollo/statuses/{sha}","languages_url":"https://api.github.com/repos/ApolloAuto/apollo/languages","stargazers_url":"https://api.github.com/repos/ApolloAuto/apollo/stargazers","contributors_url":"https://api.github.com/repos/ApolloAuto/apollo/contributors","subscribers_url":"https://api.github.com/repos/ApolloAuto/apollo/subscribers","subscription_url":"https://api.github.com/repos/ApolloAuto/apollo/subscription","commits_url":"https://api.github.com/repos/ApolloAuto/apollo/commits{/sha}","git_commits_url":"https://api.github.com/repos/ApolloAuto/apollo/git/commits{/sha}","comments_url":"https://api.github.com/repos/ApolloAuto/apollo/comments{/number}","issue_comment_url":"https://api.github.com/repos/ApolloAuto/apollo/issues/comments{/number}","contents_url":"https://api.github.com/repos/ApolloAuto/apollo/contents/{+path}","compare_url":"https://api.github.com/repos/ApolloAuto/apollo/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ApolloAuto/apollo/merges","archive_url":"https://api.github.com/repos/ApolloAuto/apollo/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ApolloAuto/apollo/downloads","issues_url":"https://api.github.com/repos/ApolloAuto/apollo/issues{/number}","pulls_url":"https://api.github.com/repos/ApolloAuto/apollo/pulls{/number}","milestones_url":"https://api.github.com/repos/ApolloAuto/apollo/milestones{/number}","notifications_url":"https://api.github.com/repos/ApolloAuto/apollo/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ApolloAuto/apollo/labels{/name}","releases_url":"https://api.github.com/repos/ApolloAuto/apollo/releases{/id}","deployments_url":"https://api.github.com/repos/ApolloAuto/apollo/deployments","created_at":"2017-07-04T19:03:31Z","updated_at":"2018-04-10T20:51:03Z","pushed_at":"2018-04-10T20:53:01Z","git_url":"git://github.com/ApolloAuto/apollo.git","ssh_url":"git@github.com:ApolloAuto/apollo.git","clone_url":"https://github.com/ApolloAuto/apollo.git","svn_url":"https://github.com/ApolloAuto/apollo","homepage":null,"size":379095,"stargazers_count":8563,"watchers_count":8563,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2134,"mirror_url":null,"archived":false,"open_issues_count":186,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0"},"forks":2134,"open_issues":186,"watchers":8563,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773"},"html":{"href":"https://github.com/ApolloAuto/apollo/pull/3773"},"issue":{"href":"https://api.github.com/repos/ApolloAuto/apollo/issues/3773"},"comments":{"href":"https://api.github.com/repos/ApolloAuto/apollo/issues/3773/comments"},"review_comments":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773/comments"},"review_comment":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/ApolloAuto/apollo/pulls/3773/commits"},"statuses":{"href":"https://api.github.com/repos/ApolloAuto/apollo/statuses/fc0f72a64649145a96b051f5920386a05787b952"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"zhouyao4321"}}