mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-05 07:28:29 -04:00
AP_GPS: Send RTK baseline data from SBF
This commit is contained in:
parent
93bcfc4c3e
commit
6a8680d31d
@ -35,7 +35,7 @@ public:
|
|||||||
|
|
||||||
AP_GPS::GPS_Status highest_supported_status(void) override { return AP_GPS::GPS_OK_FIX_3D_RTK_FIXED; }
|
AP_GPS::GPS_Status highest_supported_status(void) override { return AP_GPS::GPS_OK_FIX_3D_RTK_FIXED; }
|
||||||
|
|
||||||
bool supports_mavlink_gps_rtk_message() override { return true; }
|
bool supports_mavlink_gps_rtk_message() const override { return true; }
|
||||||
|
|
||||||
static bool _detect(struct ERB_detect_state &state, uint8_t data);
|
static bool _detect(struct ERB_detect_state &state, uint8_t data);
|
||||||
|
|
||||||
|
@ -62,6 +62,9 @@ AP_GPS_SBF::AP_GPS_SBF(AP_GPS &_gps, AP_GPS::GPS_State &_state,
|
|||||||
|
|
||||||
port->write((const uint8_t*)_port_enable, strlen(_port_enable));
|
port->write((const uint8_t*)_port_enable, strlen(_port_enable));
|
||||||
_config_last_ack_time = AP_HAL::millis();
|
_config_last_ack_time = AP_HAL::millis();
|
||||||
|
|
||||||
|
// if we ever parse RTK observations it will always be of type NED, so set it once
|
||||||
|
state.rtk_baseline_coords_type = RTK_BASELINE_COORDINATE_SYSTEM_NED;
|
||||||
}
|
}
|
||||||
|
|
||||||
AP_GPS_SBF::~AP_GPS_SBF (void) {
|
AP_GPS_SBF::~AP_GPS_SBF (void) {
|
||||||
@ -411,6 +414,37 @@ AP_GPS_SBF::process_message(void)
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case BaseVectorGeod:
|
||||||
|
{
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wfloat-equal" // suppress -Wfloat-equal as it's false positive when testing for DNU values
|
||||||
|
const msg4028 &temp = sbf_msg.data.msg4028u;
|
||||||
|
|
||||||
|
// just breakout any consts we need for Do Not Use (DNU) reasons
|
||||||
|
constexpr double doubleDNU = -2e-10;
|
||||||
|
|
||||||
|
check_new_itow(temp.TOW, sbf_msg.length);
|
||||||
|
|
||||||
|
if (temp.N == 0) { // no sub blocks so just bail, we can't do anything useful here
|
||||||
|
state.rtk_num_sats = 0;
|
||||||
|
state.rtk_age_ms = 0;
|
||||||
|
state.rtk_baseline_y_mm = 0;
|
||||||
|
state.rtk_baseline_x_mm = 0;
|
||||||
|
state.rtk_baseline_z_mm = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
state.rtk_num_sats = temp.info.NrSV;
|
||||||
|
|
||||||
|
state.rtk_age_ms = (temp.info.CorrAge != 65535) ? ((uint32_t)temp.info.CorrAge) * 10 : 0;
|
||||||
|
|
||||||
|
// copy the position as long as the data isn't DNU
|
||||||
|
state.rtk_baseline_y_mm = (temp.info.DeltaEast != doubleDNU) ? temp.info.DeltaEast * 1e3 : 0;
|
||||||
|
state.rtk_baseline_x_mm = (temp.info.DeltaNorth != doubleDNU) ? temp.info.DeltaNorth * 1e3 : 0;
|
||||||
|
state.rtk_baseline_z_mm = (temp.info.DeltaUp != doubleDNU) ? temp.info.DeltaUp * -1e3 : 0;
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -43,6 +43,8 @@ public:
|
|||||||
|
|
||||||
void broadcast_configuration_failure_reason(void) const override;
|
void broadcast_configuration_failure_reason(void) const override;
|
||||||
|
|
||||||
|
bool supports_mavlink_gps_rtk_message(void) const override { return true; };
|
||||||
|
|
||||||
// get the velocity lag, returns true if the driver is confident in the returned value
|
// get the velocity lag, returns true if the driver is confident in the returned value
|
||||||
bool get_lag(float &lag_sec) const override { lag_sec = 0.08f; return true; } ;
|
bool get_lag(float &lag_sec) const override { lag_sec = 0.08f; return true; } ;
|
||||||
|
|
||||||
@ -65,7 +67,7 @@ private:
|
|||||||
uint8_t _init_blob_index;
|
uint8_t _init_blob_index;
|
||||||
uint32_t _init_blob_time;
|
uint32_t _init_blob_time;
|
||||||
char *_initial_sso;
|
char *_initial_sso;
|
||||||
const char* _sso_normal = ", PVTGeodetic+DOP+ReceiverStatus+VelCovGeodetic, msec100\n";
|
const char* _sso_normal = ", PVTGeodetic+DOP+ReceiverStatus+VelCovGeodetic+BaseVectorGeod, msec100\n";
|
||||||
const char* _initialisation_blob[4] = {
|
const char* _initialisation_blob[4] = {
|
||||||
"srd, Moderate, UAV\n",
|
"srd, Moderate, UAV\n",
|
||||||
"sem, PVT, 5\n",
|
"sem, PVT, 5\n",
|
||||||
@ -87,6 +89,7 @@ private:
|
|||||||
DOP = 4001,
|
DOP = 4001,
|
||||||
PVTGeodetic = 4007,
|
PVTGeodetic = 4007,
|
||||||
ReceiverStatus = 4014,
|
ReceiverStatus = 4014,
|
||||||
|
BaseVectorGeod = 4028,
|
||||||
VelCovGeodetic = 5908
|
VelCovGeodetic = 5908
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -150,6 +153,33 @@ private:
|
|||||||
// remaining data is AGCData, which we don't have a use for, don't extract the data
|
// remaining data is AGCData, which we don't have a use for, don't extract the data
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct PACKED VectorInfoGeod {
|
||||||
|
uint8_t NrSV;
|
||||||
|
uint8_t Error;
|
||||||
|
uint8_t Mode;
|
||||||
|
uint8_t Misc;
|
||||||
|
double DeltaEast;
|
||||||
|
double DeltaNorth;
|
||||||
|
double DeltaUp;
|
||||||
|
float DeltaVe;
|
||||||
|
float DeltaVn;
|
||||||
|
float DeltaVu;
|
||||||
|
uint16_t Azimuth;
|
||||||
|
int16_t Elevation;
|
||||||
|
uint8_t ReferenceID;
|
||||||
|
uint16_t CorrAge;
|
||||||
|
uint32_t SignalInfo;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PACKED msg4028 // BaseVectorGeod
|
||||||
|
{
|
||||||
|
uint32_t TOW;
|
||||||
|
uint16_t WNc;
|
||||||
|
uint8_t N; // number of baselines
|
||||||
|
uint8_t SBLength;
|
||||||
|
VectorInfoGeod info; // there can be multiple baselines here, but we will only consume the first one, so don't worry about anything after
|
||||||
|
};
|
||||||
|
|
||||||
struct PACKED msg5908 // VelCovGeodetic
|
struct PACKED msg5908 // VelCovGeodetic
|
||||||
{
|
{
|
||||||
uint32_t TOW;
|
uint32_t TOW;
|
||||||
@ -172,6 +202,7 @@ private:
|
|||||||
msg4007 msg4007u;
|
msg4007 msg4007u;
|
||||||
msg4001 msg4001u;
|
msg4001 msg4001u;
|
||||||
msg4014 msg4014u;
|
msg4014 msg4014u;
|
||||||
|
msg4028 msg4028u;
|
||||||
msg5908 msg5908u;
|
msg5908 msg5908u;
|
||||||
uint8_t bytes[256];
|
uint8_t bytes[256];
|
||||||
};
|
};
|
||||||
|
@ -31,7 +31,7 @@ public:
|
|||||||
|
|
||||||
AP_GPS::GPS_Status highest_supported_status(void) override { return AP_GPS::GPS_OK_FIX_3D_RTK_FIXED; }
|
AP_GPS::GPS_Status highest_supported_status(void) override { return AP_GPS::GPS_OK_FIX_3D_RTK_FIXED; }
|
||||||
|
|
||||||
bool supports_mavlink_gps_rtk_message() override { return true; }
|
bool supports_mavlink_gps_rtk_message() const override { return true; }
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
bool read() override;
|
bool read() override;
|
||||||
|
@ -45,7 +45,7 @@ public:
|
|||||||
virtual void inject_data(const uint8_t *data, uint16_t len);
|
virtual void inject_data(const uint8_t *data, uint16_t len);
|
||||||
|
|
||||||
//MAVLink methods
|
//MAVLink methods
|
||||||
virtual bool supports_mavlink_gps_rtk_message() { return false; }
|
virtual bool supports_mavlink_gps_rtk_message() const { return false; }
|
||||||
virtual void send_mavlink_gps_rtk(mavlink_channel_t chan);
|
virtual void send_mavlink_gps_rtk(mavlink_channel_t chan);
|
||||||
|
|
||||||
virtual void broadcast_configuration_failure_reason(void) const { return ; }
|
virtual void broadcast_configuration_failure_reason(void) const { return ; }
|
||||||
|
Loading…
Reference in New Issue
Block a user