48 #include <geometry_msgs/TransformStamped.h> 52 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DSystemState.h> 53 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DSatellites.h> 54 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DDetailSatellites.h> 55 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DLocalMagneticField.h> 56 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DUTMPosition.h> 57 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DECEFPos.h> 58 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DNorthSeekingInitStatus.h> 59 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DOdometerState.h> 60 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DRawGNSS.h> 61 #include <kvh_geo_fog_3d_msgs/KvhGeoFog3DRawSensors.h> 64 #include "sensor_msgs/Imu.h" 65 #include "sensor_msgs/NavSatFix.h" 66 #include "sensor_msgs/NavSatStatus.h" 67 #include "sensor_msgs/MagneticField.h" 68 #include "nav_msgs/Odometry.h" 69 #include "geometry_msgs/Quaternion.h" 70 #include "geometry_msgs/Vector3.h" 71 #include "geometry_msgs/Vector3Stamped.h" 76 double num = std::fmod(_value, (2*M_PI));
86 double num = std::fmod(_value, (2*M_PI));
97 return std::fmod(_value, (2 * M_PI));
102 return std::fmod(_value, (2 * M_PI));
123 int filterVehicleType;
124 if (_node.
getParam(
"filterVehicleType", filterVehicleType))
149 int main(
int argc,
char **argv)
151 ros::init(argc, argv,
"kvh_geo_fog_3d_driver");
161 std::map<packet_id_e, ros::Publisher> kvhPubMap{
198 typedef std::pair<packet_id_e, int> freqPair;
219 ROS_ERROR(
"Unable to get init options. Exiting.");
224 if ((errorCode = kvhDriver.
Init(initOptions.
port, packetRequest, initOptions)) < 0)
226 ROS_ERROR(
"Unable to initialize driver. Error Code %d", errorCode);
249 std_msgs::Header header;
259 ROS_DEBUG(
"System state packet has updated. Publishing...");
263 kvh_geo_fog_3d_msgs::KvhGeoFog3DSystemState sysStateMsg;
264 sysStateMsg.header = header;
270 sysStateMsg.unix_time_us = systemStatePacket.
microseconds;
272 sysStateMsg.latitude_rad = systemStatePacket.
latitude;
273 sysStateMsg.longitude_rad = systemStatePacket.
longitude;
274 sysStateMsg.height_m = systemStatePacket.
height;
276 sysStateMsg.absolute_velocity_north_mps = systemStatePacket.
velocity[0];
277 sysStateMsg.absolute_velocity_east_mps = systemStatePacket.
velocity[1];
278 sysStateMsg.absolute_velocity_down_mps = systemStatePacket.
velocity[2];
284 sysStateMsg.g_force_g = systemStatePacket.
g_force;
286 sysStateMsg.roll_rad = systemStatePacket.
orientation[0];
287 sysStateMsg.pitch_rad = systemStatePacket.
orientation[1];
288 sysStateMsg.heading_rad = systemStatePacket.
orientation[2];
290 sysStateMsg.angular_velocity_x_rad_per_s = systemStatePacket.
angular_velocity[0];
291 sysStateMsg.angular_velocity_y_rad_per_s = systemStatePacket.
angular_velocity[1];
292 sysStateMsg.angular_velocity_z_rad_per_s = systemStatePacket.
angular_velocity[2];
308 ROS_DEBUG(
"Satellites packet updated. Publishing...");
310 kvh_geo_fog_3d_msgs::KvhGeoFog3DSatellites satellitesMsg;
312 satellitesMsg.header = header;
313 satellitesMsg.hdop = satellitesPacket.
hdop;
314 satellitesMsg.vdop = satellitesPacket.
vdop;
326 ROS_DEBUG(
"Detailed satellites packet updated. Publishing...");
328 kvh_geo_fog_3d_msgs::KvhGeoFog3DDetailSatellites detailSatellitesMsg;
330 detailSatellitesMsg.header = header;
347 detailSatellitesMsg.satellite_number.push_back(satellite.
number);
348 detailSatellitesMsg.satellite_frequencies.push_back(satellite.
frequencies.
r);
349 detailSatellitesMsg.elevation_deg.push_back(satellite.
elevation);
350 detailSatellitesMsg.azimuth_deg.push_back(satellite.
azimuth);
351 detailSatellitesMsg.snr_decibal.push_back(satellite.
snr);
360 ROS_DEBUG(
"Local magnetics packet updated. Publishing...");
362 kvh_geo_fog_3d_msgs::KvhGeoFog3DLocalMagneticField localMagFieldMsg;
364 localMagFieldMsg.header = header;
365 localMagFieldMsg.loc_mag_field_x_mG = localMagPacket.
magnetic_field[0];
366 localMagFieldMsg.loc_mag_field_y_mG = localMagPacket.
magnetic_field[1];
367 localMagFieldMsg.loc_mag_field_z_mG = localMagPacket.
magnetic_field[2];
375 ROS_DEBUG(
"UTM Position packet updated. Publishing...");
377 kvh_geo_fog_3d_msgs::KvhGeoFog3DUTMPosition utmPosMsg;
379 utmPosMsg.header = header;
380 utmPosMsg.northing_m = utmPosPacket.
position[0];
381 utmPosMsg.easting_m = utmPosPacket.
position[1];
382 utmPosMsg.height_m = utmPosPacket.
position[2];
383 utmPosMsg.zone_character = utmPosPacket.
zone;
391 ROS_DEBUG(
"ECEF position packet updated. Publishing...");
393 kvh_geo_fog_3d_msgs::KvhGeoFog3DECEFPos ecefPosMsg;
395 ecefPosMsg.header = header;
396 ecefPosMsg.ecef_x_m = ecefPosPacket.
position[0];
397 ecefPosMsg.ecef_y_m = ecefPosPacket.
position[1];
398 ecefPosMsg.ecef_z_m = ecefPosPacket.
position[2];
406 ROS_DEBUG(
"North seeking status packet updated. Publishing...");
408 kvh_geo_fog_3d_msgs::KvhGeoFog3DNorthSeekingInitStatus northSeekInitStatMsg;
410 northSeekInitStatMsg.header = header;
430 ROS_DEBUG(
"Odometer stage updated. Publishing...");
432 kvh_geo_fog_3d_msgs::KvhGeoFog3DOdometerState odometerStateMsg;
434 odometerStateMsg.header = header;
435 odometerStateMsg.odometer_pulse_count = odomStatePacket.
pulse_count;
436 odometerStateMsg.odometer_distance_m = odomStatePacket.
distance;
437 odometerStateMsg.odometer_speed_mps = odomStatePacket.
speed;
438 odometerStateMsg.odometer_slip_m = odomStatePacket.
slip;
439 odometerStateMsg.odometer_active = odomStatePacket.
active;
446 ROS_DEBUG(
"Raw sensors packet updated. Publishing...");
448 kvh_geo_fog_3d_msgs::KvhGeoFog3DRawSensors rawSensorMsg;
450 rawSensorMsg.header = header;
452 rawSensorMsg.accelerometer_x_mpss = rawSensorsPacket.
accelerometers[0];
453 rawSensorMsg.accelerometer_y_mpss = rawSensorsPacket.
accelerometers[1];
454 rawSensorMsg.accelerometer_z_mpss = rawSensorsPacket.
accelerometers[2];
456 rawSensorMsg.gyro_x_rps = rawSensorsPacket.
gyroscopes[0];
457 rawSensorMsg.gyro_y_rps = rawSensorsPacket.
gyroscopes[1];
458 rawSensorMsg.gyro_z_rps = rawSensorsPacket.
gyroscopes[2];
460 rawSensorMsg.magnetometer_x_mG = rawSensorsPacket.
magnetometers[0];
461 rawSensorMsg.magnetometer_y_mG = rawSensorsPacket.
magnetometers[1];
462 rawSensorMsg.magnetometer_z_mG = rawSensorsPacket.
magnetometers[2];
465 rawSensorMsg.pressure_pa = rawSensorsPacket.
pressure;
479 ROS_DEBUG(
"Raw GNSS packet updated. Publishing...");
481 kvh_geo_fog_3d_msgs::KvhGeoFog3DRawGNSS rawGnssMsg;
483 rawGnssMsg.header = header;
487 rawGnssMsg.latitude_rad = rawGnssPacket.
position[0];
488 rawGnssMsg.longitude_rad = rawGnssPacket.
position[1];
489 rawGnssMsg.height_m = rawGnssPacket.
position[2];
495 rawGnssMsg.vel_north_m = rawGnssPacket.
velocity[0];
496 rawGnssMsg.vel_east_m = rawGnssPacket.
velocity[1];
497 rawGnssMsg.vel_down_m = rawGnssPacket.
velocity[2];
499 rawGnssMsg.tilt_rad = rawGnssPacket.
tilt;
502 rawGnssMsg.heading_rad = rawGnssPacket.
heading;
505 rawGnssMsg.gnss_fix = rawGnssPacket.
flags.
b.fix_type;
506 rawGnssMsg.doppler_velocity_valid = rawGnssPacket.
flags.
b.velocity_valid;
507 rawGnssMsg.time_valid = rawGnssPacket.
flags.
b.time_valid;
508 rawGnssMsg.external_gnss = rawGnssPacket.
flags.
b.external_gnss;
509 rawGnssMsg.tilt_valid = rawGnssPacket.
flags.
b.tilt_valid;
510 rawGnssMsg.heading_valid = rawGnssPacket.
flags.
b.heading_valid;
561 boundedBearingZero2Pi);
562 double orientCovNED[3] = {
570 double unfixedEnuBearing = (-1 * boundedBearingZero2Pi) + (M_PI / 2.0);
577 double orientCovENU[3] = {
584 sensor_msgs::Imu imuDataRaw;
585 imuDataRaw.header = header;
586 imuDataRaw.header.frame_id =
"imu_link_frd";
606 imuDataRawPub.publish(imuDataRaw);
609 sensor_msgs::Imu imuDataRawFLU;
610 imuDataRawFLU.header = header;
611 imuDataRawFLU.header.frame_id =
"imu_link_flu";
615 imuDataRawFLU.angular_velocity.y = -1 * systemStatePacket.
angular_velocity[1];
616 imuDataRawFLU.angular_velocity.z = -1 * systemStatePacket.
angular_velocity[2];
624 imuDataRawFLU.linear_acceleration.y = -1 * systemStatePacket.
body_acceleration[1];
625 imuDataRawFLU.linear_acceleration.z = -1 * systemStatePacket.
body_acceleration[2];
631 imuDataRawFLUPub.publish(imuDataRawFLU);
637 sensor_msgs::Imu imuDataNED;
638 geometry_msgs::Vector3Stamped imuDataRpyNED;
639 geometry_msgs::Vector3Stamped imuDataRpyNEDDeg;
640 imuDataNED.header = header;
641 imuDataNED.header.frame_id =
"imu_link_frd";
643 imuDataNED.orientation.x = orientQuatNED.x();
644 imuDataNED.orientation.y = orientQuatNED.y();
645 imuDataNED.orientation.z = orientQuatNED.z();
646 imuDataNED.orientation.w = orientQuatNED.w();
648 imuDataNED.orientation_covariance[0] = orientCovNED[0];
649 imuDataNED.orientation_covariance[4] = orientCovNED[1];
650 imuDataNED.orientation_covariance[8] = orientCovNED[2];
652 imuDataRpyNED.header = header;
653 imuDataRpyNED.header.frame_id =
"imu_link_frd";
654 imuDataRpyNED.vector.x = systemStatePacket.
orientation[0];
655 imuDataRpyNED.vector.y = systemStatePacket.
orientation[1];
656 imuDataRpyNED.vector.z = boundedBearingZero2Pi;
658 imuDataRpyNEDDeg.header = header;
659 imuDataRpyNEDDeg.header.frame_id =
"imu_link_frd";
660 imuDataRpyNEDDeg.vector.x = ((imuDataRpyNED.vector.x * 180.0) / M_PI);
661 imuDataRpyNEDDeg.vector.y = ((imuDataRpyNED.vector.y * 180.0) / M_PI);
662 imuDataRpyNEDDeg.vector.z = ((imuDataRpyNED.vector.z * 180.0) / M_PI);
674 imuDataNEDPub.publish(imuDataNED);
675 imuDataRpyNEDPub.publish(imuDataRpyNED);
676 imuDataRpyNEDDegPub.publish(imuDataRpyNEDDeg);
682 sensor_msgs::Imu imuDataENU;
683 geometry_msgs::Vector3Stamped imuDataRpyENU;
684 geometry_msgs::Vector3Stamped imuDataRpyENUDeg;
686 imuDataENU.header = header;
687 imuDataENU.header.frame_id =
"imu_link_flu";
689 imuDataRpyENU.header = header;
690 imuDataRpyENU.header.frame_id =
"imu_link_flu";
692 imuDataRpyENUDeg.header = header;
693 imuDataRpyENUDeg.header.frame_id =
"imu_link_flu";
697 imuDataENU.orientation.x = orientQuatENU.x();
698 imuDataENU.orientation.y = orientQuatENU.y();
699 imuDataENU.orientation.z = orientQuatENU.z();
700 imuDataENU.orientation.w = orientQuatENU.w();
702 imuDataENU.orientation_covariance[0] = orientCovENU[1];
703 imuDataENU.orientation_covariance[4] = orientCovENU[0];
704 imuDataENU.orientation_covariance[8] = orientCovENU[2];
706 imuDataRpyENU.vector.x = systemStatePacket.
orientation[1];
707 imuDataRpyENU.vector.y = systemStatePacket.
orientation[0];
708 imuDataRpyENU.vector.z = enuBearing;
710 imuDataRpyENUDeg.vector.x = ((imuDataRpyENU.vector.x * 180.0) / M_PI);
711 imuDataRpyENUDeg.vector.y = ((imuDataRpyENU.vector.y * 180.0) / M_PI);
712 imuDataRpyENUDeg.vector.z = ((imuDataRpyENU.vector.z * 180.0) / M_PI);
729 imuDataENUPub.publish(imuDataENU);
730 imuDataRpyENUPub.publish(imuDataRpyENU);
731 imuDataRpyENUDegPub.publish(imuDataRpyENUDeg);
740 sensor_msgs::NavSatFix navSatFixMsg;
741 navSatFixMsg.header = header;
742 navSatFixMsg.header.frame_id =
"gps";
749 navSatFixMsg.status.status = navSatFixMsg.status.STATUS_NO_FIX;
753 navSatFixMsg.status.status = navSatFixMsg.status.STATUS_FIX;
756 navSatFixMsg.status.status = navSatFixMsg.status.STATUS_SBAS_FIX;
759 navSatFixMsg.status.status = navSatFixMsg.status.STATUS_GBAS_FIX;
763 double latitude_deg = (systemStatePacket.
latitude * 180.0) / M_PI;
764 double longitude_deg = (systemStatePacket.
longitude * 180.0) / M_PI;
765 navSatFixMsg.latitude = latitude_deg;
766 navSatFixMsg.longitude = longitude_deg;
767 navSatFixMsg.altitude = systemStatePacket.
height;
768 navSatFixMsg.position_covariance_type = navSatFixMsg.COVARIANCE_TYPE_DIAGONAL_KNOWN;
771 navSatFixMsg.position_covariance[0] = pow(systemStatePacket.
standard_deviation[1], 2);
772 navSatFixMsg.position_covariance[4] = pow(systemStatePacket.
standard_deviation[0], 2);
773 navSatFixMsg.position_covariance[8] = pow(systemStatePacket.
standard_deviation[2], 2);
775 navSatFixPub.publish(navSatFixMsg);
796 nav_msgs::Odometry odomMsgENU;
797 nav_msgs::Odometry odomMsgNED;
801 printf(
"Error Code: %d\n", error);
805 odomMsgENU.header = header;
806 odomMsgENU.header.frame_id =
"utm_enu";
807 odomMsgENU.child_frame_id =
"imu_link_flu";
809 odomMsgNED.header = header;
810 odomMsgNED.header.frame_id =
"utm_ned";
811 odomMsgNED.child_frame_id =
"imu_link_frd";
815 odomMsgENU.pose.pose.position.x = utmPosPacket.
position[1];
816 odomMsgENU.pose.pose.position.y = utmPosPacket.
position[0];
817 odomMsgENU.pose.pose.position.z = -1 * utmPosPacket.
position[2];
823 odomMsgNED.pose.pose.position.x = utmPosPacket.
position[0];
824 odomMsgNED.pose.pose.position.y = utmPosPacket.
position[1];
825 odomMsgNED.pose.pose.position.z = utmPosPacket.
position[2];
832 odomMsgENU.pose.pose.orientation.x = orientQuatENU.x();
833 odomMsgENU.pose.pose.orientation.y = orientQuatENU.y();
834 odomMsgENU.pose.pose.orientation.z = orientQuatENU.z();
835 odomMsgENU.pose.pose.orientation.w = orientQuatENU.w();
837 odomMsgENU.pose.covariance[21] = orientCovENU[0];
838 odomMsgENU.pose.covariance[28] = orientCovENU[1];
839 odomMsgENU.pose.covariance[35] = orientCovENU[2];
842 odomMsgNED.pose.pose.orientation.x = orientQuatNED.x();
843 odomMsgNED.pose.pose.orientation.y = orientQuatNED.y();
844 odomMsgNED.pose.pose.orientation.z = orientQuatNED.z();
845 odomMsgNED.pose.pose.orientation.w = orientQuatNED.w();
847 odomMsgNED.pose.covariance[21] = orientCovNED[0];
848 odomMsgNED.pose.covariance[28] = orientCovNED[1];
849 odomMsgNED.pose.covariance[35] = orientCovNED[2];
853 odomMsgENU.twist.twist.linear.x = systemStatePacket.
velocity[0];
854 odomMsgENU.twist.twist.linear.y = (-1 * systemStatePacket.
velocity[1]);
855 odomMsgENU.twist.twist.linear.z = (-1 * systemStatePacket.
velocity[2]);
858 odomMsgENU.twist.twist.angular.y = (-1 * systemStatePacket.
angular_velocity[1]);
859 odomMsgENU.twist.twist.angular.z = (-1 * systemStatePacket.
angular_velocity[2]);
862 odomMsgNED.twist.twist.linear.x = systemStatePacket.
velocity[0];
863 odomMsgNED.twist.twist.linear.y = systemStatePacket.
velocity[1];
864 odomMsgNED.twist.twist.linear.z = systemStatePacket.
velocity[2];
870 odomPubENU.publish(odomMsgENU);
871 odomPubNED.publish(odomMsgNED);
878 nav_msgs::Odometry kvhOdomStateMsg;
880 kvhOdomStateMsg.header = header;
884 kvhOdomStateMsg.header.frame_id =
"base_link";
887 kvhOdomStateMsg.pose.pose.position.y = 0;
888 kvhOdomStateMsg.pose.pose.position.z = 0;
889 kvhOdomStateMsg.twist.twist.linear.x = odomStatePacket.
speed;
890 kvhOdomStateMsg.twist.twist.linear.y = 0;
891 kvhOdomStateMsg.twist.twist.linear.z = 0;
893 odomStatePub.publish(kvhOdomStateMsg);
899 sensor_msgs::NavSatFix rawNavSatFixMsg;
901 rawNavSatFixMsg.header = header;
902 rawNavSatFixMsg.header.frame_id =
"gps";
905 double rawGnssLatitude_deg = (rawGnssPacket.
position[0] * 180.0) / M_PI;
906 double rawGnssLongitude_deg = (rawGnssPacket.
position[1] * 180.0) / M_PI;
907 rawNavSatFixMsg.latitude = rawGnssLatitude_deg;
908 rawNavSatFixMsg.longitude = rawGnssLongitude_deg;
909 rawNavSatFixMsg.altitude = rawGnssPacket.
position[2];
915 rawNavSatFixMsg.status.status = rawNavSatFixMsg.status.STATUS_NO_FIX;
919 rawNavSatFixMsg.status.status = rawNavSatFixMsg.status.STATUS_FIX;
922 rawNavSatFixMsg.status.status = rawNavSatFixMsg.status.STATUS_SBAS_FIX;
925 rawNavSatFixMsg.status.status = rawNavSatFixMsg.status.STATUS_GBAS_FIX;
928 rawNavSatFixMsg.position_covariance_type = rawNavSatFixMsg.COVARIANCE_TYPE_DIAGONAL_KNOWN;
935 rawNavSatFixPub.publish(rawNavSatFixMsg);
944 sensor_msgs::Imu imuDataRaw;
945 imuDataRaw.header = header;
946 imuDataRaw.header.frame_id =
"imu_link_frd";
949 imuDataRaw.angular_velocity.x = rawSensorsPacket.
gyroscopes[0];
950 imuDataRaw.angular_velocity.y = rawSensorsPacket.
gyroscopes[1];
951 imuDataRaw.angular_velocity.z = rawSensorsPacket.
gyroscopes[2];
954 imuDataRaw.linear_acceleration.x = rawSensorsPacket.
accelerometers[0];
955 imuDataRaw.linear_acceleration.y = rawSensorsPacket.
accelerometers[1];
956 imuDataRaw.linear_acceleration.z = rawSensorsPacket.
accelerometers[2];
958 rawSensorImuPub.publish(imuDataRaw);
961 sensor_msgs::Imu imuDataRawFLU;
962 imuDataRawFLU.header = header;
963 imuDataRawFLU.header.frame_id =
"imu_link_flu";
966 imuDataRawFLU.angular_velocity.x = rawSensorsPacket.
gyroscopes[0];
967 imuDataRawFLU.angular_velocity.y = -1 * rawSensorsPacket.
gyroscopes[1];
968 imuDataRawFLU.angular_velocity.z = -1 * rawSensorsPacket.
gyroscopes[2];
971 imuDataRawFLU.linear_acceleration.x = rawSensorsPacket.
accelerometers[0];
972 imuDataRawFLU.linear_acceleration.y = -1 * rawSensorsPacket.
accelerometers[1];
973 imuDataRawFLU.linear_acceleration.z = -1 * rawSensorsPacket.
accelerometers[2];
975 rawSensorImuFluPub.publish(imuDataRawFLU);
977 sensor_msgs::MagneticField magFieldMsg;
979 magFieldMsg.header = header;
980 magFieldMsg.header.frame_id =
"imu_link_frd";
981 magFieldMsg.magnetic_field.x = rawSensorsPacket.
magnetometers[0];
982 magFieldMsg.magnetic_field.y = rawSensorsPacket.
magnetometers[1];
983 magFieldMsg.magnetic_field.z = rawSensorsPacket.
magnetometers[2];
985 magFieldPub.publish(magFieldMsg);
1007 ROS_DEBUG(
"----------------------------------------");
1010 diagnostics.
broadcast(diagnostic_msgs::DiagnosticStatus::WARN,
"Shutting down the KVH driver");
float angular_velocity[3]
struct raw_gnss_packet_t::@8::@9 b
void UpdateSystemStatus(diagnostic_updater::DiagnosticStatusWrapper &stat)
KVH Geo Fog 3D driver class header.
float pressure_temperature
void setRPY(const tf2Scalar &roll, const tf2Scalar &pitch, const tf2Scalar &yaw)
union system_state_packet_t::@1 filter_status
float current_rotation_angle
float current_gyroscope_bias_solution[3]
Driver worker class for the KVH Geo Fog 3D.
union satellite_t::@10 frequencies
global variables used to store packet information.
uint8_t beidou_satellites
float standard_deviation[3]
void setHardwareID(const std::string &hwid)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
double BoundFromZeroTo2Pi(const double &_value)
union north_seeking_status_packet_t::@20 north_seeking_status
void add(const std::string &name, TaskFunction f)
int Once()
Do a single data read from the device.
double BoundFromNegPiToPi(const double &_value)
float tilt_standard_deviation
uint8_t quadrant_data_collection_progress[4]
void SetupUpdater(diagnostic_updater::Updater *_diagnostics, mitre::KVH::DiagnosticsContainer *_diagContainer)
float heading_standard_deviation
uint32_t unix_time_seconds
int GetPacket(packet_id_e _packetId, T &packet)
#define MAXIMUM_DETAILED_SATELLITES
bool velocityHeadingEnabled
float standard_deviation[3]
uint32_t unix_time_seconds
bool atmosphericAltitudeEnabled
struct system_state_packet_t::@0::@2 b
satellite_t satellites[MAXIMUM_DETAILED_SATELLITES]
float position_standard_deviation[3]
std::vector< std::pair< packet_id_e, uint16_t > > KvhPacketRequest
bool motionAnalysisEnabled
Contains diagnostic information published out the ROS diagnostics topic.
int Init(const std::string &_port, KvhPacketRequest &_packetsRequested)
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
bool PacketIsUpdated(packet_id_e)
Use this function to determine if new packet data has arrived since the last time you checked...
void SetSystemStatus(uint16_t _status)
int SetPacketUpdated(packet_id_e, bool)
Use this function to set that the packet has been updated (though the driver will usually do that its...
uint8_t glonass_satellites
float current_gyroscope_bias_solution_error
union raw_gnss_packet_t::@8 flags
#define ROS_INFO_STREAM(args)
float body_acceleration[3]
uint8_t filterVehicleType
bool getParam(const std::string &key, std::string &s) const
bool reversingDetectionEnabled
void UpdateFilterStatus(diagnostic_updater::DiagnosticStatusWrapper &stat)
void broadcast(int lvl, const std::string msg)
int main(int argc, char **argv)
ROSCPP_DECL void spinOnce()
int Cleanup()
Cleanup and close our connections.
int GetInitOptions(ros::NodeHandle &_node, kvh::KvhInitOptions &_initOptions)
void SetFilterStatus(uint16_t _status)
union system_state_packet_t::@0 system_status