HAL_SITL: update for GPS param changes
This commit is contained in:
parent
a6df0745a6
commit
ac604cac54
@ -181,8 +181,7 @@ void SITL_State::_fdm_input_step(void)
|
||||
_update_gps(_sitl->state.latitude, _sitl->state.longitude,
|
||||
_sitl->state.altitude,
|
||||
_sitl->state.speedN, _sitl->state.speedE, _sitl->state.speedD,
|
||||
_sitl->state.yawDeg,
|
||||
!_sitl->gps_disable);
|
||||
_sitl->state.yawDeg, true);
|
||||
_update_airspeed(_sitl->state.airspeed);
|
||||
_update_rangefinder(_sitl->state.range);
|
||||
|
||||
|
@ -87,13 +87,13 @@ int SITL_State::gps_pipe(uint8_t idx)
|
||||
*/
|
||||
void SITL_State::_gps_write(const uint8_t *p, uint16_t size, uint8_t instance)
|
||||
{
|
||||
if (instance == 1 && !_sitl->gps2_enable) {
|
||||
if (instance == 1 && _sitl->gps_disable[instance]) {
|
||||
return;
|
||||
}
|
||||
while (size--) {
|
||||
if (_sitl->gps_byteloss > 0.0f) {
|
||||
if (_sitl->gps_byteloss[instance] > 0.0f) {
|
||||
float r = ((((unsigned)random()) % 1000000)) / 1.0e4;
|
||||
if (r < _sitl->gps_byteloss) {
|
||||
if (r < _sitl->gps_byteloss[instance]) {
|
||||
// lose the byte
|
||||
p++;
|
||||
continue;
|
||||
@ -357,7 +357,7 @@ void SITL_State::_update_gps_ubx(const struct gps_data *d, uint8_t instance)
|
||||
memset(&sol, 0, sizeof(sol));
|
||||
sol.fix_type = d->have_lock?3:0;
|
||||
sol.fix_status = 221;
|
||||
sol.satellites = d->have_lock?_sitl->gps_numsats:3;
|
||||
sol.satellites = d->have_lock?_sitl->gps_numsats[instance]:3;
|
||||
sol.time = time_week_ms;
|
||||
sol.week = time_week;
|
||||
|
||||
@ -383,7 +383,7 @@ void SITL_State::_update_gps_ubx(const struct gps_data *d, uint8_t instance)
|
||||
pvt.fix_type = d->have_lock? 0x3 : 0;
|
||||
pvt.flags = 0b10000011; // carrsoln=fixed, psm = na, diffsoln and fixok
|
||||
pvt.flags2 =0;
|
||||
pvt.num_sv = d->have_lock?_sitl->gps_numsats:3;
|
||||
pvt.num_sv = d->have_lock?_sitl->gps_numsats[instance]:3;
|
||||
pvt.lon = d->longitude * 1.0e7;
|
||||
pvt.lat = d->latitude * 1.0e7;
|
||||
pvt.height = d->altitude * 1000.0f;
|
||||
@ -438,7 +438,7 @@ void SITL_State::_update_gps_ubx(const struct gps_data *d, uint8_t instance)
|
||||
for (uint8_t i = 0; i < SV_COUNT; i++) {
|
||||
svinfo.sv[i].chn = i;
|
||||
svinfo.sv[i].svid = i;
|
||||
svinfo.sv[i].flags = (i < _sitl->gps_numsats) ? 0x7 : 0x6; // sv used, diff correction data, orbit information
|
||||
svinfo.sv[i].flags = (i < _sitl->gps_numsats[instance]) ? 0x7 : 0x6; // sv used, diff correction data, orbit information
|
||||
svinfo.sv[i].quality = 7; // code and carrier lock and time synchronized
|
||||
svinfo.sv[i].cno = MAX(20, 30 - i);
|
||||
svinfo.sv[i].elev = MAX(30, 90 - i);
|
||||
@ -497,7 +497,7 @@ void SITL_State::_update_gps_mtk(const struct gps_data *d, uint8_t instance)
|
||||
if (p.ground_course < 0.0f) {
|
||||
p.ground_course += 360.0f * 1000000.0f;
|
||||
}
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats:3;
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats[instance]:3;
|
||||
p.fix_type = d->have_lock?3:1;
|
||||
|
||||
// the spec is not very clear, but the time field seems to be
|
||||
@ -552,7 +552,7 @@ void SITL_State::_update_gps_mtk16(const struct gps_data *d, uint8_t instance)
|
||||
if (p.ground_course < 0.0f) {
|
||||
p.ground_course += 360.0f * 100.0f;
|
||||
}
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats:3;
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats[instance]:3;
|
||||
p.fix_type = d->have_lock?3:1;
|
||||
|
||||
// the spec is not very clear, but the time field seems to be
|
||||
@ -610,7 +610,7 @@ void SITL_State::_update_gps_mtk19(const struct gps_data *d, uint8_t instance)
|
||||
if (p.ground_course < 0.0f) {
|
||||
p.ground_course += 360.0f * 100.0f;
|
||||
}
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats:3;
|
||||
p.satellites = d->have_lock?_sitl->gps_numsats[instance]:3;
|
||||
p.fix_type = d->have_lock?3:1;
|
||||
|
||||
// the spec is not very clear, but the time field seems to be
|
||||
@ -710,7 +710,7 @@ void SITL_State::_update_gps_nmea(const struct gps_data *d, uint8_t instance)
|
||||
lat_string,
|
||||
lng_string,
|
||||
d->have_lock?1:0,
|
||||
d->have_lock?_sitl->gps_numsats:3,
|
||||
d->have_lock?_sitl->gps_numsats[instance]:3,
|
||||
2.0,
|
||||
d->altitude);
|
||||
float speed_knots = norm(d->speedN, d->speedE) * M_PER_SEC_TO_KNOTS;
|
||||
@ -840,7 +840,7 @@ void SITL_State::_update_gps_sbp(const struct gps_data *d, uint8_t instance)
|
||||
pos.height = d->altitude;
|
||||
pos.h_accuracy = 5e3;
|
||||
pos.v_accuracy = 10e3;
|
||||
pos.n_sats = _sitl->gps_numsats;
|
||||
pos.n_sats = _sitl->gps_numsats[instance];
|
||||
|
||||
// Send single point position solution
|
||||
pos.flags = 0;
|
||||
@ -855,7 +855,7 @@ void SITL_State::_update_gps_sbp(const struct gps_data *d, uint8_t instance)
|
||||
velned.d = 1e3 * d->speedD;
|
||||
velned.h_accuracy = 5e3;
|
||||
velned.v_accuracy = 5e3;
|
||||
velned.n_sats = _sitl->gps_numsats;
|
||||
velned.n_sats = _sitl->gps_numsats[instance];
|
||||
velned.flags = 0;
|
||||
_sbp_send_message(SBP_VEL_NED_MSGTYPE, 0x2222, sizeof(velned), (uint8_t*)&velned, instance);
|
||||
|
||||
@ -957,7 +957,7 @@ void SITL_State::_update_gps_sbp2(const struct gps_data *d, uint8_t instance)
|
||||
pos.height = d->altitude;
|
||||
pos.h_accuracy = 5e3;
|
||||
pos.v_accuracy = 10e3;
|
||||
pos.n_sats = _sitl->gps_numsats;
|
||||
pos.n_sats = _sitl->gps_numsats[instance];
|
||||
|
||||
// Send single point position solution
|
||||
pos.flags = 1;
|
||||
@ -972,7 +972,7 @@ void SITL_State::_update_gps_sbp2(const struct gps_data *d, uint8_t instance)
|
||||
velned.d = 1e3 * d->speedD;
|
||||
velned.h_accuracy = 5e3;
|
||||
velned.v_accuracy = 5e3;
|
||||
velned.n_sats = _sitl->gps_numsats;
|
||||
velned.n_sats = _sitl->gps_numsats[instance];
|
||||
velned.flags = 1;
|
||||
_sbp_send_message(SBP_VEL_NED_MSGTYPE, 0x2222, sizeof(velned), (uint8_t*)&velned, instance);
|
||||
|
||||
@ -1120,7 +1120,7 @@ void SITL_State::_update_gps_nova(const struct gps_data *d, uint8_t instance)
|
||||
bestpos.lat = d->latitude;
|
||||
bestpos.lng = d->longitude;
|
||||
bestpos.hgt = d->altitude;
|
||||
bestpos.svsused = _sitl->gps_numsats;
|
||||
bestpos.svsused = _sitl->gps_numsats[instance];
|
||||
bestpos.latsdev=0.2;
|
||||
bestpos.lngsdev=0.2;
|
||||
bestpos.hgtsdev=0.2;
|
||||
@ -1205,40 +1205,33 @@ void SITL_State::_update_gps_file(uint8_t instance)
|
||||
*/
|
||||
void SITL_State::_update_gps(double latitude, double longitude, float altitude,
|
||||
double speedN, double speedE, double speedD,
|
||||
double yaw, bool have_lock)
|
||||
double yaw, bool _have_lock)
|
||||
{
|
||||
char c;
|
||||
|
||||
// simulate delayed lock times
|
||||
if (AP_HAL::millis() < _sitl->gps_lock_time*1000UL) {
|
||||
have_lock = false;
|
||||
//Capture current position as basestation location for
|
||||
if (!_gps_has_basestation_position &&
|
||||
_have_lock &&
|
||||
AP_HAL::millis() >= _sitl->gps_lock_time[0]*1000UL) {
|
||||
_gps_basestation_data.latitude = latitude;
|
||||
_gps_basestation_data.longitude = longitude;
|
||||
_gps_basestation_data.altitude = altitude;
|
||||
_gps_basestation_data.speedN = speedN;
|
||||
_gps_basestation_data.speedE = speedE;
|
||||
_gps_basestation_data.speedD = speedD;
|
||||
_gps_basestation_data.have_lock = _have_lock;
|
||||
_gps_has_basestation_position = true;
|
||||
}
|
||||
|
||||
altitude += _sitl->gps_alt_offset;
|
||||
|
||||
//Capture current position as basestation location for
|
||||
if (!_gps_has_basestation_position) {
|
||||
if (have_lock) {
|
||||
_gps_basestation_data.latitude = latitude;
|
||||
_gps_basestation_data.longitude = longitude;
|
||||
_gps_basestation_data.altitude = altitude;
|
||||
_gps_basestation_data.speedN = speedN;
|
||||
_gps_basestation_data.speedE = speedE;
|
||||
_gps_basestation_data.speedD = speedD;
|
||||
_gps_basestation_data.have_lock = have_lock;
|
||||
_gps_has_basestation_position = true;
|
||||
}
|
||||
}
|
||||
|
||||
for (uint8_t idx=0; idx<2; idx++) {
|
||||
struct gps_data d;
|
||||
|
||||
if (idx == 1 && !_sitl->gps2_enable) {
|
||||
continue;
|
||||
}
|
||||
// simulate delayed lock times
|
||||
bool have_lock = (_have_lock && !_sitl->gps_disable[idx] && AP_HAL::millis() >= _sitl->gps_lock_time[idx]*1000UL);
|
||||
|
||||
// run at configured GPS rate (default 5Hz)
|
||||
if ((AP_HAL::millis() - gps_state[idx].last_update) < (uint32_t)(1000/_sitl->gps_hertz)) {
|
||||
if ((AP_HAL::millis() - gps_state[idx].last_update) < (uint32_t)(1000/_sitl->gps_hertz[idx])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1254,7 +1247,7 @@ void SITL_State::_update_gps(double latitude, double longitude, float altitude,
|
||||
d.yaw = yaw;
|
||||
|
||||
// add an altitude error controlled by a slow sine wave
|
||||
d.altitude = altitude + _sitl->gps_noise * sinf(AP_HAL::millis() * 0.0005f);
|
||||
d.altitude = altitude + _sitl->gps_noise[idx] * sinf(AP_HAL::millis() * 0.0005f) + _sitl->gps_alt_offset[idx];
|
||||
|
||||
// Add offet to c.g. velocity to get velocity at antenna
|
||||
d.speedN = speedN;
|
||||
@ -1262,9 +1255,9 @@ void SITL_State::_update_gps(double latitude, double longitude, float altitude,
|
||||
d.speedD = speedD;
|
||||
d.have_lock = have_lock;
|
||||
|
||||
if (_sitl->gps_drift_alt > 0) {
|
||||
if (_sitl->gps_drift_alt[idx] > 0) {
|
||||
// slow altitude drift
|
||||
d.altitude += _sitl->gps_drift_alt*sinf(AP_HAL::millis()*0.001f*0.02f);
|
||||
d.altitude += _sitl->gps_drift_alt[idx]*sinf(AP_HAL::millis()*0.001f*0.02f);
|
||||
}
|
||||
|
||||
// correct the latitude, longitude, hiehgt and NED velocity for the offset between
|
||||
@ -1309,9 +1302,9 @@ void SITL_State::_update_gps(double latitude, double longitude, float altitude,
|
||||
|
||||
d = _gps_data[idx][next_index];
|
||||
|
||||
if (_sitl->gps_delay != delay) {
|
||||
if (_sitl->gps_delay[idx] != delay) {
|
||||
// cope with updates to the delay control
|
||||
delay = _sitl->gps_delay;
|
||||
delay = _sitl->gps_delay[idx];
|
||||
for (uint8_t i=0; i<delay; i++) {
|
||||
_gps_data[idx][i] = d;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user