2 #include <gps_common/GPSFix.h>
3 #include <gps_common/GPSStatus.h>
4 #include <sensor_msgs/NavSatFix.h>
5 #include <sensor_msgs/NavSatStatus.h>
19 check_fix_by_variance(true),
23 gps_fix_pub = node.advertise<GPSFix>(
"extended_fix", 1);
24 navsat_fix_pub = node.advertise<NavSatFix>(
"fix", 1);
26 privnode.getParam(
"use_gps_time", use_gps_time);
27 privnode.getParam(
"check_fix_by_variance", check_fix_by_variance);
30 std::string host =
"localhost";
31 int port = atoi(DEFAULT_GPSD_PORT);
32 privnode.getParam(
"host", host);
33 privnode.getParam(
"port", port);
36 snprintf(port_s,
sizeof(port_s),
"%d", port);
38 gps_data_t *resp = NULL;
40 #if GPSD_API_MAJOR_VERSION >= 5
41 gps =
new gpsmm(host.c_str(), port_s);
42 resp = gps->stream(WATCH_ENABLE);
43 #elif GPSD_API_MAJOR_VERSION == 4
45 gps->open(host.c_str(), port_s);
46 resp = gps->stream(WATCH_ENABLE);
49 resp = gps->open(host.c_str(), port_s);
63 #if GPSD_API_MAJOR_VERSION >= 5
64 if (!gps->waiting(1e6))
69 while (gps->waiting(0))
74 gps_data_t *p = gps->poll();
102 #if GPSD_API_MAJOR_VERSION >= 9
103 if (!p->online.tv_sec && !p->online.tv_nsec) {
111 process_data_navsat(p);
115 #if GPSD_API_MAJOR_VERSION >= 4
116 #define SATS_VISIBLE p->satellites_visible
117 #elif GPSD_API_MAJOR_VERSION == 3
118 #define SATS_VISIBLE p->satellites
120 #error "gpsd_client only supports gpsd API versions 3+"
129 status.header.stamp = time;
130 fix.header.stamp = time;
133 status.satellites_used = p->satellites_used;
135 status.satellite_used_prn.resize(status.satellites_used);
136 for (
int i = 0; i < status.satellites_used; ++i) {
137 #if GPSD_API_MAJOR_VERSION > 5
138 status.satellite_used_prn[i] = p->skyview[i].used;
140 status.satellite_used_prn[i] = p->used[i];
144 status.satellites_visible = SATS_VISIBLE;
146 status.satellite_visible_prn.resize(status.satellites_visible);
147 status.satellite_visible_z.resize(status.satellites_visible);
148 status.satellite_visible_azimuth.resize(status.satellites_visible);
149 status.satellite_visible_snr.resize(status.satellites_visible);
151 for (
int i = 0; i < SATS_VISIBLE; ++i) {
152 #if GPSD_API_MAJOR_VERSION > 5
153 status.satellite_visible_prn[i] = p->skyview[i].PRN;
154 status.satellite_visible_z[i] = p->skyview[i].elevation;
155 status.satellite_visible_azimuth[i] = p->skyview[i].azimuth;
156 status.satellite_visible_snr[i] = p->skyview[i].ss;
158 status.satellite_visible_prn[i] = p->PRN[i];
159 status.satellite_visible_z[i] = p->elevation[i];
160 status.satellite_visible_azimuth[i] = p->azimuth[i];
161 status.satellite_visible_snr[i] = p->ss[i];
165 #if GPSD_API_MAJOR_VERSION >= 12
166 if ((p->fix.status != STATUS_NO_FIX) && !(check_fix_by_variance && std::isnan(p->fix.epx))) {
167 #elif GPSD_API_MAJOR_VERSION >= 10
168 if ((p->fix.status != STATUS_NO_FIX) && !(check_fix_by_variance && std::isnan(p->fix.epx))) {
170 if ((p->status != STATUS_NO_FIX) && !(check_fix_by_variance && std::isnan(p->fix.epx))) {
177 #if GPSD_API_MAJOR_VERSION != 6
178 #if GPSD_API_MAJOR_VERSION >= 12
179 if (p->fix.status & STATUS_DGPS)
180 #elif GPSD_API_MAJOR_VERSION >= 10
181 if (p->fix.status & STATUS_DGPS_FIX)
183 if (p->status & STATUS_DGPS_FIX)
188 #if GPSD_API_MAJOR_VERSION >= 9
189 fix.time = (double)(p->fix.time.tv_sec) + (double)(p->fix.time.tv_nsec) / 1000000.;
191 fix.time = p->fix.time;
193 fix.latitude = p->fix.latitude;
194 fix.longitude = p->fix.longitude;
195 fix.altitude = p->fix.altitude;
196 fix.track = p->fix.track;
197 fix.speed = p->fix.speed;
198 fix.climb = p->fix.climb;
200 #if GPSD_API_MAJOR_VERSION > 3
201 fix.pdop = p->dop.pdop;
202 fix.hdop = p->dop.hdop;
203 fix.vdop = p->dop.vdop;
204 fix.tdop = p->dop.tdop;
205 fix.gdop = p->dop.gdop;
214 #if GPSD_API_MAJOR_VERSION < 8
217 fix.err = p->fix.eph;
219 fix.err_vert = p->fix.epv;
220 fix.err_track = p->fix.epd;
221 fix.err_speed = p->fix.eps;
222 fix.err_climb = p->fix.epc;
223 fix.err_time = p->fix.ept;
240 #if GPSD_API_MAJOR_VERSION >= 9
241 if (use_gps_time && (p->online.tv_sec || p->online.tv_nsec)) {
242 fix.header.stamp =
ros::Time(p->fix.time.tv_sec, p->fix.time.tv_nsec);
244 if (use_gps_time && !std::isnan(p->fix.time)) {
245 fix.header.stamp =
ros::Time(p->fix.time);
258 #if GPSD_API_MAJOR_VERSION >= 10
259 switch (p->fix.status) {
263 #if GPSD_API_MAJOR_VERSION >= 12
268 fix.status.status = 0;
271 #if GPSD_API_MAJOR_VERSION != 6
272 #if GPSD_API_MAJOR_VERSION >= 12
275 case STATUS_DGPS_FIX:
277 fix.status.status = 2;
282 fix.status.service = NavSatStatus::SERVICE_GPS;
284 fix.latitude = p->fix.latitude;
285 fix.longitude = p->fix.longitude;
286 fix.altitude = p->fix.altitude;
292 if (std::isnan(p->fix.epx) && check_fix_by_variance) {
294 "GPS status was reported as OK, but variance was invalid");
298 fix.position_covariance[0] = p->fix.epx;
299 fix.position_covariance[4] = p->fix.epy;
300 fix.position_covariance[8] = p->fix.epv;
302 fix.position_covariance_type = NavSatFix::COVARIANCE_TYPE_DIAGONAL_KNOWN;
308 int main(
int argc,
char ** argv) {