Apollo 10.0
自动驾驶开放平台
apollo::localization::msf::LocalizationGnssProcess类 参考

#include <localization_gnss_process.h>

apollo::localization::msf::LocalizationGnssProcess 的协作图:

Public 成员函数

 LocalizationGnssProcess ()
 
 ~LocalizationGnssProcess ()
 
apollo::common::Status Init (const LocalizationIntegParam &param)
 
void RawObservationProcess (const drivers::gnss::EpochObservation &raw_obs)
 
void RawEphemerisProcess (const drivers::gnss::GnssEphemeris &gnss_orbit)
 
void IntegSinsPvaProcess (const InsPva &sins_pva, const double variance[9][9])
 
LocalizationMeasureState GetResult (MeasureData *gnss_measure)
 

详细描述

在文件 localization_gnss_process.h101 行定义.

构造及析构函数说明

◆ LocalizationGnssProcess()

apollo::localization::msf::LocalizationGnssProcess::LocalizationGnssProcess ( )

在文件 localization_gnss_process.cc33 行定义.

34 : gnss_solver_(new GnssSolver()),
35 enable_ins_aid_rtk_(true),
36 gnss_lever_arm_{0.0, 0.0, 0.0},
37 sins_align_finish_(false),
38 double_antenna_solver_(new GnssSolver()),
39 current_obs_time_(0.0),
41 SetDefaultOption();
42}

◆ ~LocalizationGnssProcess()

apollo::localization::msf::LocalizationGnssProcess::~LocalizationGnssProcess ( )

在文件 localization_gnss_process.cc44 行定义.

44 {
45 map_gnss_eph_.clear();
46
47 delete gnss_solver_;
48 gnss_solver_ = nullptr;
49 delete double_antenna_solver_;
50 double_antenna_solver_ = nullptr;
51}

成员函数说明

◆ GetResult()

LocalizationMeasureState apollo::localization::msf::LocalizationGnssProcess::GetResult ( MeasureData *  gnss_measure)

在文件 localization_gnss_process.cc196 行定义.

197 {
198 CHECK_NOTNULL(gnss_msg);
199
200 // convert GnssPntResult to IntegMeasure
201 // double sec_s = Clock::NowInSeconds(); //
202 // ros::Time::now().toSec();
203 const unsigned int second_per_week = 604800;
204 double sec_s = gnss_pnt_result_.gnss_week() * second_per_week +
205 gnss_pnt_result_.gnss_second_s();
206 gnss_msg->time = sec_s;
207 gnss_msg->frame_type = FrameType::ECEF;
208
209 // velocity must be in ENU frame and position in frame WGS84
210 const int dim = 9;
211 for (int i = 0; i < dim; ++i) {
212 for (int j = 0; j < dim; ++j) {
213 gnss_msg->variance[i][j] = 0.0;
214 }
215 }
216
217 bool b_pos = false;
218 if (gnss_pnt_result_.has_pos_x_m() && gnss_pnt_result_.has_pos_y_m() &&
219 gnss_pnt_result_.has_pos_z_m()) {
220 b_pos = true;
221 gnss_msg->gnss_pos.longitude = gnss_pnt_result_.pos_x_m();
222 gnss_msg->gnss_pos.latitude = gnss_pnt_result_.pos_y_m();
223 gnss_msg->gnss_pos.height = gnss_pnt_result_.pos_z_m();
224 gnss_msg->measure_type = MeasureType::GNSS_POS_ONLY;
225
226 gnss_msg->is_have_variance = true;
227 // std
228 gnss_msg->variance[0][0] =
229 gnss_pnt_result_.std_pos_x_m() * gnss_pnt_result_.std_pos_x_m();
230 gnss_msg->variance[1][1] =
231 gnss_pnt_result_.std_pos_y_m() * gnss_pnt_result_.std_pos_y_m();
232 gnss_msg->variance[2][2] =
233 gnss_pnt_result_.std_pos_z_m() * gnss_pnt_result_.std_pos_z_m();
234 }
235 bool b_vel = false;
236 if (gnss_pnt_result_.has_vel_x_m() && gnss_pnt_result_.has_vel_y_m() &&
237 gnss_pnt_result_.has_vel_z_m()) {
238 // output velocity whenever possible.
239 b_vel = true;
240 gnss_msg->gnss_vel.ve = gnss_pnt_result_.vel_x_m();
241 gnss_msg->gnss_vel.vn = gnss_pnt_result_.vel_y_m();
242 gnss_msg->gnss_vel.vu = gnss_pnt_result_.vel_z_m();
243 gnss_msg->measure_type = MeasureType::ENU_VEL_ONLY;
244 gnss_msg->is_have_variance = true;
245 // std
246 gnss_msg->variance[3][3] =
247 gnss_pnt_result_.std_vel_x_m() * gnss_pnt_result_.std_vel_x_m();
248 gnss_msg->variance[4][4] =
249 gnss_pnt_result_.std_vel_y_m() * gnss_pnt_result_.std_vel_y_m();
250 gnss_msg->variance[5][5] =
251 gnss_pnt_result_.std_vel_z_m() * gnss_pnt_result_.std_vel_z_m();
252 }
253 if (b_pos && b_vel) {
254 gnss_msg->measure_type = MeasureType::GNSS_POS_VEL;
255 }
256
257 return gnss_state_;
258}

◆ Init()

Status apollo::localization::msf::LocalizationGnssProcess::Init ( const LocalizationIntegParam param)

在文件 localization_gnss_process.cc53 行定义.

53 {
54 // set launch parameter
55 enable_ins_aid_rtk_ = param.enable_ins_aid_rtk;
56 gnss_solver_->set_enable_external_prediction(enable_ins_aid_rtk_);
57
58 gnss_lever_arm_.arm_x = param.imu_to_ant_offset.offset_x;
59 gnss_lever_arm_.arm_y = param.imu_to_ant_offset.offset_y;
60 gnss_lever_arm_.arm_z = param.imu_to_ant_offset.offset_z;
61
62 map_gnss_eph_.clear();
63 sins_align_finish_ = false;
64
65 return Status::OK();
66}
static Status OK()
generate a success status.
Definition status.h:60

◆ IntegSinsPvaProcess()

void apollo::localization::msf::LocalizationGnssProcess::IntegSinsPvaProcess ( const InsPva &  sins_pva,
const double  variance[9][9] 
)

在文件 localization_gnss_process.cc163 行定义.

164 {
165 if (!sins_pva_msg.init_and_alignment) {
166 return;
167 }
168
169 sins_align_finish_ = true;
170
171 // feed into GNSS-RTK Engine
172 double sec_s = sins_pva_msg.time;
173 double llh[3] = {sins_pva_msg.pos.longitude, sins_pva_msg.pos.latitude,
174 sins_pva_msg.pos.height};
175 double velocity[3] = {sins_pva_msg.vel.ve, sins_pva_msg.vel.vn,
176 sins_pva_msg.vel.vu};
177 double lever_arm[3] = {gnss_lever_arm_.arm_x, gnss_lever_arm_.arm_y,
178 gnss_lever_arm_.arm_z};
179 double euler[3] = {sins_pva_msg.att.pitch, sins_pva_msg.att.roll,
180 sins_pva_msg.att.yaw};
181
182 double std_pos[3][3] = {0.0};
183 double std_vel[3][3] = {0.0};
184 // const unsigned int dim = 9;
185 for (unsigned int i = 0; i < 3; ++i) {
186 for (unsigned int j = 0; j < 3; ++j) {
187 std_pos[i][j] = variance[i][j];
188 std_vel[i][j] = variance[i + 3][j + 3];
189 }
190 }
191
192 gnss_solver_->motion_update(sec_s, llh, std_pos, velocity, std_vel, euler,
193 lever_arm);
194}

◆ RawEphemerisProcess()

void apollo::localization::msf::LocalizationGnssProcess::RawEphemerisProcess ( const drivers::gnss::GnssEphemeris gnss_orbit)

在文件 localization_gnss_process.cc132 行定义.

133 {
134 if (!msg.has_gnss_type()) {
135 return;
136 }
137 auto gnss_orbit = msg;
138 if (gnss_orbit.gnss_type() == drivers::gnss::GnssType::GLO_SYS) {
139 /* caros driver (derived from rtklib src) set glonass eph toe as the GPST,
140 * and here convert it back to UTC(+0), so leap seconds should be in
141 * accordance with the GNSS-Driver
142 */
143 double leap_sec =
144 gnss_solver_->get_leap_second(gnss_orbit.glonass_orbit().week_num(),
145 gnss_orbit.glonass_orbit().toe());
146 double toe = gnss_orbit.glonass_orbit().toe() - leap_sec;
147 gnss_orbit.mutable_glonass_orbit()->set_toe(toe);
148 gnss_orbit.mutable_glonass_orbit()->set_week_second_s(toe);
149 }
150 static int eph_counter = 0;
151 ++eph_counter;
152 // printf("received a gnss ephemeris: %d!\n", eph_counter);
153 if (DuplicateEph(gnss_orbit)) {
154 AINFO << "received an existed gnss ephemeris!";
155 return;
156 }
157
158 GnssEphemerisMsg gnss_orbit_msg;
159 GnssMagTransfer::Transfer(gnss_orbit, &gnss_orbit_msg);
160 gnss_solver_->save_gnss_ephemris(gnss_orbit_msg);
161}
static void Transfer(const apollo::drivers::gnss::BandObservation &in, BandObservationMsg *out)
#define AINFO
Definition log.h:42

◆ RawObservationProcess()

void apollo::localization::msf::LocalizationGnssProcess::RawObservationProcess ( const drivers::gnss::EpochObservation raw_obs)

在文件 localization_gnss_process.cc80 行定义.

81 {
82 if (!raw_obs.has_receiver_id()) {
83 AERROR << "Obs data being invalid if without receiver id!";
84 return;
85 }
86 const double unix_to_gps = 315964800;
87 const double sec_per_week = 604800;
88 double leap_second_s = gnss_solver_->get_leap_second(raw_obs.gnss_week(),
89 raw_obs.gnss_second_s());
90
91 double sys_secs_to_gnss =
92 Clock::NowInSeconds() - unix_to_gps + leap_second_s;
93 double obs_secs =
94 raw_obs.gnss_second_s() + raw_obs.gnss_week() * sec_per_week;
95 double obs_delay = sys_secs_to_gnss - obs_secs;
96
97 double obs_xyz[3] = {0.0};
98 if (raw_obs.has_position_x() && raw_obs.has_position_y() &&
99 raw_obs.has_position_z()) {
100 obs_xyz[0] = raw_obs.position_x();
101 obs_xyz[1] = raw_obs.position_y();
102 obs_xyz[2] = raw_obs.position_z();
103 }
104 const unsigned int max_msg_size = 256;
105 char message[max_msg_size] = {'\0'};
106 snprintf(
107 message, max_msg_size,
108 "user %u time:%12.3f sat_num:%d obs_delay:%12.3f%16.3f%16.3f%16.3f\n",
109 raw_obs.receiver_id(), raw_obs.gnss_second_s(), raw_obs.sat_obs_num(),
110 obs_delay, obs_xyz[0], obs_xyz[1], obs_xyz[2]);
111 AINFO << message;
112
113 EpochObservationMsg raw_obs_msg;
114 GnssMagTransfer::Transfer(raw_obs, &raw_obs_msg);
115 if (raw_obs.receiver_id() != 0) {
116 // Notice: the baser coordinate should be binded with obs together anytime.
117 gnss_solver_->save_baser_observation(raw_obs_msg);
118 // id - 0x80000000 = station_id from gnss_driver
119 return;
120 }
121
122 const unsigned int second_per_week = 604800;
123 double new_obs_time =
124 raw_obs.gnss_second_s() + raw_obs.gnss_week() * second_per_week;
125 if (new_obs_time <= current_obs_time_) {
126 return;
127 }
128 current_obs_time_ = new_obs_time;
129 GnssPosition(&raw_obs_msg);
130}
static double NowInSeconds()
gets the current time in second.
Definition clock.cc:56
#define AERROR
Definition log.h:44

该类的文档由以下文件生成: