Skip to content

Commit f000238

Browse files
slgroboticsbkueng
authored andcommitted
SensorGps.msg: switch to double precision for lat/lon/alt
To match PX4/PX4-GPSDrivers#132 - adding high precision RTK lat/lon/alt components
1 parent f82785a commit f000238

File tree

38 files changed

+169
-166
lines changed

38 files changed

+169
-166
lines changed

msg/SensorGps.msg

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ uint64 timestamp_sample
55

66
uint32 device_id # unique device ID for the sensor that does not change between power cycles
77

8-
int32 lat # Latitude in 1E-7 degrees
9-
int32 lon # Longitude in 1E-7 degrees
10-
int32 alt # Altitude in 1E-3 meters above MSL, (millimetres)
11-
int32 alt_ellipsoid # Altitude in 1E-3 meters bove Ellipsoid, (millimetres)
8+
float64 latitude_deg # Latitude in degrees, allows centimeter level RTK precision
9+
float64 longitude_deg # Longitude in degrees, allows centimeter level RTK precision
10+
float64 altitude_msl_m # Altitude above MSL, meters
11+
float64 altitude_ellipsoid_m # Altitude above Ellipsoid, meters
1212

1313
float32 s_variance_m_s # GPS speed accuracy estimate, (metres/sec)
1414
float32 c_variance_rad # GPS course accuracy estimate, (radians)

src/drivers/cyphal/Publishers/udral/Gnss.hpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ class UavcanGnssPublisher : public UavcanPublisher
6666
size_t payload_size = reg_udral_physics_kinematics_geodetic_Point_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_;
6767

6868
reg_udral_physics_kinematics_geodetic_Point_0_1 geo {};
69-
geo.latitude = gps.lat;
70-
geo.longitude = gps.lon;
71-
geo.altitude = uavcan_si_unit_length_WideScalar_1_0 { .meter = static_cast<double>(gps.alt) };
69+
geo.latitude = (int64_t)(gps.latitude_deg / 1e7);
70+
geo.longitude = (int64_t)(gps.longitude_deg / 1e7);
71+
geo.altitude = uavcan_si_unit_length_WideScalar_1_0 { .meter = gps.altitude_msl_m };
7272

7373
uint8_t geo_payload_buffer[reg_udral_physics_kinematics_geodetic_Point_0_1_SERIALIZATION_BUFFER_SIZE_BYTES_];
7474

src/drivers/ins/vectornav/VectorNav.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,10 @@ void VectorNav::sensorCallback(VnUartPacket *packet)
320320

321321
sensor_gps.fix_type = gpsFix;
322322

323-
sensor_gps.lat = positionGpsLla.c[0] * 1e7;
324-
sensor_gps.lon = positionGpsLla.c[1] * 1e7;
325-
sensor_gps.alt = positionGpsLla.c[2] * 1e3;
326-
sensor_gps.alt_ellipsoid = sensor_gps.alt;
323+
sensor_gps.latitude_deg = positionGpsLla.c[0];
324+
sensor_gps.longitude_deg = positionGpsLla.c[1];
325+
sensor_gps.altitude_msl_m = positionGpsLla.c[2];
326+
sensor_gps.altitude_ellipsoid_m = sensor_gps.altitude_msl_m;
327327

328328
sensor_gps.vel_ned_valid = true;
329329
sensor_gps.vel_n_m_s = velocityGpsNed.c[0];

src/drivers/osd/msp_osd/msp_defines.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -386,9 +386,9 @@ struct msp_raw_gps_t {
386386
uint8_t numSat;
387387
int32_t lat; // 1 / 10000000 deg
388388
int32_t lon; // 1 / 10000000 deg
389-
int16_t alt; // meters
389+
int16_t alt; // centimeters since MSP API 1.39, meters before
390390
int16_t groundSpeed; // cm/s
391-
int16_t groundCourse; // unit: degree x 10
391+
int16_t groundCourse; // unit: degree x 100, centidegrees
392392
uint16_t hdop;
393393
} __attribute__((packed));
394394

src/drivers/osd/msp_osd/uorb_to_msp.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,9 +314,9 @@ msp_raw_gps_t construct_RAW_GPS(const sensor_gps_s &vehicle_gps_position,
314314
msp_raw_gps_t raw_gps {0};
315315

316316
if (vehicle_gps_position.fix_type >= 2) {
317-
raw_gps.lat = vehicle_gps_position.lat;
318-
raw_gps.lon = vehicle_gps_position.lon;
319-
raw_gps.alt = vehicle_gps_position.alt / 10;
317+
raw_gps.lat = static_cast<int32_t>(vehicle_gps_position.latitude_deg * 1e7);
318+
raw_gps.lon = static_cast<int32_t>(vehicle_gps_position.longitude_deg * 1e7);
319+
raw_gps.alt = static_cast<int16_t>(vehicle_gps_position.altitude_msl_m * 100.0);
320320

321321
float course = math::degrees(vehicle_gps_position.cog_rad);
322322

@@ -432,14 +432,14 @@ msp_altitude_t construct_ALTITUDE(const sensor_gps_s &vehicle_gps_position,
432432
msp_altitude_t altitude {0};
433433

434434
if (vehicle_gps_position.fix_type >= 2) {
435-
altitude.estimatedActualPosition = vehicle_gps_position.alt / 10;
435+
altitude.estimatedActualPosition = static_cast<int32_t>(vehicle_gps_position.altitude_msl_m * 100.0); // cm
436436

437437
} else {
438438
altitude.estimatedActualPosition = 0;
439439
}
440440

441441
if (estimator_status.solution_status_flags & (1 << 5)) {
442-
altitude.estimatedActualVelocity = -vehicle_local_position.vz * 10; //m/s to cm/s
442+
altitude.estimatedActualVelocity = -vehicle_local_position.vz * 100; //m/s to cm/s
443443

444444
} else {
445445
altitude.estimatedActualVelocity = 0;

src/drivers/rc/crsf_rc/CrsfRc.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,11 @@ void CrsfRc::Run()
241241
sensor_gps_s sensor_gps;
242242

243243
if (_vehicle_gps_position_sub.update(&sensor_gps)) {
244-
int32_t latitude = sensor_gps.lat;
245-
int32_t longitude = sensor_gps.lon;
244+
int32_t latitude = static_cast<int32_t>(round(sensor_gps.latitude_deg * 1e7));
245+
int32_t longitude = static_cast<int32_t>(round(sensor_gps.longitude_deg * 1e7));
246246
uint16_t groundspeed = sensor_gps.vel_d_m_s / 3.6f * 10.f;
247247
uint16_t gps_heading = math::degrees(sensor_gps.cog_rad) * 100.f;
248-
uint16_t altitude = sensor_gps.alt + 1000;
248+
uint16_t altitude = static_cast<int16_t>(sensor_gps.altitude_msl_m * 1e3) + 1000;
249249
uint8_t num_satellites = sensor_gps.satellites_used;
250250
this->SendTelemetryGps(latitude, longitude, groundspeed, gps_heading, altitude, num_satellites);
251251
}

src/drivers/rc_input/crsf_telemetry.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,11 @@ bool CRSFTelemetry::send_gps()
9696
return false;
9797
}
9898

99-
int32_t latitude = vehicle_gps_position.lat;
100-
int32_t longitude = vehicle_gps_position.lon;
99+
int32_t latitude = static_cast<int32_t>(round(vehicle_gps_position.latitude_deg * 1e7));
100+
int32_t longitude = static_cast<int32_t>(round(vehicle_gps_position.longitude_deg * 1e7));
101101
uint16_t groundspeed = vehicle_gps_position.vel_d_m_s / 3.6f * 10.f;
102102
uint16_t gps_heading = math::degrees(vehicle_gps_position.cog_rad) * 100.f;
103-
uint16_t altitude = vehicle_gps_position.alt + 1000;
103+
uint16_t altitude = static_cast<int16_t>(round(vehicle_gps_position.altitude_msl_m + 1.0));
104104
uint8_t num_satellites = vehicle_gps_position.satellites_used;
105105

106106
return crsf_send_telemetry_gps(_uart_fd, latitude, longitude, groundspeed,

src/drivers/rc_input/ghst_telemetry.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,9 +110,9 @@ bool GHSTTelemetry::send_gps1_status()
110110
return false;
111111
}
112112

113-
int32_t latitude = vehicle_gps_position.lat; // 1e-7 degrees
114-
int32_t longitude = vehicle_gps_position.lon; // 1e-7 degrees
115-
uint16_t altitude = vehicle_gps_position.alt / 1000; // mm -> m
113+
int32_t latitude = static_cast<int32_t>(round(vehicle_gps_position.latitude_deg * 1e7)); // 1e-7 degrees
114+
int32_t longitude = static_cast<int32_t>(round(vehicle_gps_position.longitude_deg * 1e7)); // 1e-7 degrees
115+
uint16_t altitude = static_cast<int16_t>(round(vehicle_gps_position.altitude_msl_m)); // meters
116116

117117
return ghst_send_telemetry_gps1_status(_uart_fd, latitude, longitude, altitude);
118118
}

src/drivers/telemetry/bst/bst.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ void BST::RunImpl()
268268
if (gps.fix_type >= 3 && gps.eph < 50.0f) {
269269
BSTPacket<BSTGPSPosition> bst_gps = {};
270270
bst_gps.type = 0x02;
271-
bst_gps.payload.lat = swap_int32(gps.lat);
272-
bst_gps.payload.lon = swap_int32(gps.lon);
273-
bst_gps.payload.alt = swap_int16(gps.alt / 1000 + 1000);
271+
bst_gps.payload.lat = swap_int32(static_cast<int32_t>(round(gps.latitude_deg * 1e7)));
272+
bst_gps.payload.lon = swap_int32(static_cast<int32_t>(round(gps.longitude_deg * 1e7)));
273+
bst_gps.payload.alt = swap_int16(static_cast<int16_t>(round(gps.altitude_msl_m)) + 1000);
274274
bst_gps.payload.gs = swap_int16(gps.vel_m_s * 360.0f);
275275
bst_gps.payload.heading = swap_int16(gps.cog_rad * 18000.0f / M_PI_F);
276276
bst_gps.payload.sats = gps.satellites_used;

0 commit comments

Comments
 (0)