32 #include <linux/serial.h> 35 #include <boost/regex.hpp> 44 #define ANGLE_MIN -180 48 #define THETA_Y_MAX 90 52 #define THETA_Y_MIN -90 56 #define LEVER_ARM_MAX 100 60 #define LEVER_ARM_MIN -100 64 #define HEADING_MAX 360 68 #define HEADING_MIN -360 79 #ifndef ATTSTD_DEV_MIN 80 #define ATTSTD_DEV_MIN 0 83 #ifndef ATTSTD_DEV_MAX 84 #define ATTSTD_DEV_MAX 5 87 #ifndef POSSTD_DEV_MIN 88 #define POSSTD_DEV_MIN 0 91 #ifndef POSSTD_DEV_MAX 92 #define POSSTD_DEV_MAX 100 123 node_(node), handlers_(node, settings), settings_(settings), stopping_(false)
135 std::string
cmd(
"\x0DSSSSSSSSSSSSSSSSSSS\x0D\x0D");
140 if (!ntrip.id.empty() && !ntrip.keep_open)
142 send(
"snts, " + ntrip.id +
", off \x0D");
147 if (!ip_server.id.empty() && !ip_server.keep_open)
149 send(
"sdio, " + ip_server.id +
", auto, none\x0D");
150 send(
"siss, " + ip_server.id +
", 0\x0D");
155 if (!serial.port.empty() && !serial.keep_open)
157 send(
"sdio, " + serial.port +
", auto, none\x0D");
158 if (serial.port.rfind(
"COM", 0) == 0)
159 send(
"scs, " + serial.port +
160 ", baud115200, bits8, No, bit1, none\x0D");
178 ", baud115200, bits8, No, bit1, none\x0D");
195 boost::mutex::scoped_lock lock_cd(
g_cd_mutex);
198 std::string
cmd(
"\x0DSSSSSSSSSSSSSSSSSSS\x0D\x0D");
212 boost::regex(
"(tcp)://(.+):(\\d+)")))
230 boost::regex(
"(file_name):(/|(?:/[\\w-]+)+.sbf)")))
238 }
else if (boost::regex_match(
240 boost::regex(
"(file_name):(/|(?:/[\\w-]+)+.pcap)")))
249 boost::regex(
"(serial):(.+)")))
252 std::string proto(match[2]);
253 std::stringstream ss;
254 ss <<
"Searching for serial port" << proto;
261 std::stringstream ss;
262 ss <<
"Device is unsupported. Perhaps you meant 'tcp://host:port' or 'file_name:xxx.sbf' or 'serial:/path/to/device'?";
272 std::stringstream ss;
273 ss <<
"Setting up everything needed to read from" << file_name;
276 }
catch (std::runtime_error& e)
278 std::stringstream ss;
279 ss <<
"Comm_IO::initializeSBFFileReading() failed for SBF File" << file_name
280 <<
" due to: " << e.what();
289 std::stringstream ss;
290 ss <<
"Setting up everything needed to read from " << file_name;
293 }
catch (std::runtime_error& e)
295 std::stringstream ss;
296 ss <<
"CommIO::initializePCAPFileReading() failed for SBF File " << file_name
297 <<
" due to: " << e.what();
307 "Started timer for calling reconnect() method until connection succeeds");
309 boost::asio::io_service io;
310 boost::posix_time::millisec wait_ms(
314 boost::asio::deadline_timer
t(io, wait_ms);
329 bool initialize_serial_return =
false;
338 }
catch (std::runtime_error& e)
341 std::stringstream ss;
343 <<
" due to: " << e.what();
347 if (initialize_serial_return)
356 bool initialize_tcp_return =
false;
362 }
catch (std::runtime_error& e)
365 std::stringstream ss;
366 ss <<
"initializeTCP() failed for host " <<
tcp_host_ <<
" on port " 371 if (initialize_tcp_return)
402 boost::regex(
"(tcp)://(.+):(\\d+)"));
403 std::string proto(match[1]);
414 send(
"lif, Identification \x0D");
435 send(
"sso, all, none, none, off \x0D");
436 send(
"sno, all, none, none, off \x0D");
440 send(
"sntp, on \x0D");
446 std::stringstream ss;
456 std::stringstream blocks;
459 blocks <<
" +ReceiverTime";
463 blocks <<
" +PVTCartesian";
473 blocks <<
" +PVTGeodetic";
477 blocks <<
" +BaseVectorCart";
481 blocks <<
" +BaseVectorGeod";
485 blocks <<
" +PosCovCartesian";
495 blocks <<
" +PosCovGeodetic";
501 blocks <<
" +VelCovGeodetic";
509 blocks <<
" +AttEuler";
517 blocks <<
" +AttCovEuler";
521 blocks <<
" +MeasEpoch";
525 blocks <<
" +ChannelStatus +DOP";
533 blocks <<
" +INSNavCart";
540 blocks <<
" +INSNavGeod";
544 blocks <<
" +ExtEventINSNavGeod";
548 blocks <<
" +ExtEventINSNavCart";
552 blocks <<
" +ExtSensorMeas";
555 std::stringstream ss;
556 ss <<
"sso, Stream" << std::to_string(stream) <<
", " <<
mainPort_ <<
"," 557 << blocks.str() <<
", " << pvt_interval <<
"\x0D";
563 std::stringstream blocks;
568 blocks <<
" +IMUSetup";
572 blocks <<
" +VelSensorSetup";
577 blocks <<
" +ReceiverStatus +QualityInd";
580 blocks <<
" +ReceiverSetup";
582 std::stringstream ss;
583 ss <<
"sso, Stream" << std::to_string(stream) <<
", " <<
mainPort_ <<
"," 584 << blocks.str() <<
", " << rest_interval <<
"\x0D";
591 send(
"snti, GP\x0D");
593 std::stringstream blocks;
611 std::stringstream ss;
612 ss <<
"sno, Stream" << std::to_string(stream) <<
", " <<
mainPort_ <<
"," 613 << blocks.str() <<
", " << pvt_interval <<
"\x0D";
622 std::stringstream ss;
630 std::stringstream ss;
641 std::stringstream ss;
653 std::stringstream ss;
666 if (!ntrip.id.empty())
669 send(
"snts, " + ntrip.id +
", off \x0D");
671 std::stringstream ss;
672 ss <<
"snts, " << ntrip.id <<
", Client, " << ntrip.caster <<
", " 673 << std::to_string(ntrip.caster_port) <<
", " << ntrip.username
674 <<
", " << ntrip.password <<
", " << ntrip.mountpoint <<
", " 675 << ntrip.version <<
", " << ntrip.send_gga <<
" \x0D";
680 std::stringstream ss;
681 ss <<
"sntt, " << ntrip.id <<
", on, \"" << ntrip.fingerprint
686 std::stringstream ss;
687 ss <<
"sntt, " << ntrip.id <<
", off \x0D";
695 if (!ip_server.id.empty())
701 std::stringstream ss;
704 ss <<
"siss, " << ip_server.id <<
", " 705 << std::to_string(ip_server.port) <<
", TCP2Way \x0D";
709 std::stringstream ss;
710 ss <<
"sdio, " << ip_server.id <<
", " << ip_server.rtk_standard
711 <<
", +SBF+NMEA \x0D";
714 if (ip_server.send_gga !=
"off")
716 std::string rate = ip_server.send_gga;
717 if (ip_server.send_gga ==
"auto")
719 std::stringstream ss;
720 ss <<
"sno, Stream" << std::to_string(stream) <<
", " << ip_server.id
721 <<
", GGA, " << rate <<
" \x0D";
730 if (!serial.port.empty())
732 if (serial.port.rfind(
"COM", 0) == 0)
733 send(
"scs, " + serial.port +
", baud" +
734 std::to_string(serial.baud_rate) +
735 ", bits8, No, bit1, none\x0D");
737 std::stringstream ss;
738 ss <<
"sdio, " << serial.port <<
", " << serial.rtk_standard
739 <<
", +SBF+NMEA \x0D";
741 if (serial.send_gga !=
"off")
743 std::string rate = serial.send_gga;
744 if (serial.send_gga ==
"auto")
746 std::stringstream ss;
747 ss <<
"sno, Stream" << std::to_string(stream) <<
", " << serial.port
748 <<
", GGA, " << rate <<
" \x0D";
758 send(
"sga, MultiAntenna \x0D");
761 send(
"sga, none \x0D");
771 std::stringstream ss;
781 "Please specify a valid parameter for heading and pitch");
790 std::stringstream ss;
807 "Please specify a correct value for IMU orientation angles");
820 std::stringstream ss;
833 "Please specify a correct value for x, y and z in the config file under ant_lever_arm");
846 std::stringstream ss;
857 "Please specify a correct value for poi_x, poi_y and poi_z in the config file under poi_lever_arm");
870 std::stringstream ss;
881 "Please specify a correct value for vsm_x, vsm_y and vsm_z in the config file under vsm_lever_arm");
888 std::stringstream ss;
889 ss <<
"sinc, off, all, MainAnt \x0D";
895 std::stringstream ss;
898 ss <<
"sinc, on, all, " 904 ss <<
"sinc, on, all, " 913 std::stringstream ss;
925 "Invalid mode specified for ins_initial_heading.");
936 std::stringstream ss;
946 "Please specify a valid AttStsDev and PosStdDev");
958 send(
"sdio, IPS2, NMEA, none\x0D");
965 ", bits8, No, bit1, none\x0D");
972 s =
"sdio, " +
mainPort_ +
", NMEA, +NMEA +SBF\x0D";
1158 "PoseWithCovarianceStamped");
1166 "INSPoseWithCovarianceStamped");
1217 new boost::asio::io_service);
1218 boost::asio::ip::tcp::resolver::iterator endpoint;
1222 boost::asio::ip::tcp::resolver resolver(*io_service);
1229 endpoint = resolver.resolve(boost::asio::ip::tcp::resolver::query(
1231 }
catch (std::runtime_error& e)
1233 throw std::runtime_error(
"Could not resolve " + host +
" on port " + port +
1239 new boost::asio::ip::tcp::socket(*io_service));
1247 socket->connect(*endpoint);
1248 socket->set_option(boost::asio::ip::tcp::no_delay(
true));
1249 }
catch (std::runtime_error& e)
1251 throw std::runtime_error(
"Could not connect to " + endpoint->host_name() +
1252 ": " + endpoint->service_name() +
": " + e.what());
1257 endpoint->service_name() +
".");
1263 "You have called the InitializeTCP() method though an AsyncManager object is already available! Start all anew..");
1275 std::size_t buffer_size = 8192;
1276 uint8_t* to_be_parsed;
1277 to_be_parsed =
new uint8_t[buffer_size];
1278 std::ifstream bin_file(file_name, std::ios::binary);
1279 std::vector<uint8_t> vec_buf;
1280 if (bin_file.good())
1284 std::vector<uint8_t> v_buf((std::istreambuf_iterator<char>(bin_file)),
1285 (std::istreambuf_iterator<char>()));
1290 throw std::runtime_error(
"I could not find your file. Or it is corrupted.");
1293 to_be_parsed = vec_buf.data();
1294 std::stringstream ss;
1295 ss <<
"Opened and copied over from " << file_name;
1304 "Calling read_callback_() method, with number of bytes to be parsed being " +
1307 }
catch (std::size_t& parsing_failed_here)
1309 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1313 to_be_parsed = to_be_parsed + parsing_failed_here;
1315 "Parsing_failed_here is " + parsing_failed_here);
1318 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1322 to_be_parsed = to_be_parsed + buffer_size;
1333 if (!device.
connect(file_name.c_str()))
1345 uint8_t* to_be_parsed =
new uint8_t[buffer_size];
1346 to_be_parsed = vec_buf.data();
1354 "Calling read_callback_() method, with number of bytes to be parsed being " +
1357 }
catch (std::size_t& parsing_failed_here)
1359 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1363 if (!parsing_failed_here)
1364 parsing_failed_here = 1;
1366 to_be_parsed = to_be_parsed + parsing_failed_here;
1368 "Parsing_failed_here is " + parsing_failed_here);
1371 if (to_be_parsed - vec_buf.data() >= vec_buf.size() *
sizeof(uint8_t))
1375 to_be_parsed = to_be_parsed + buffer_size;
1381 std::string flowcontrol)
1389 new boost::asio::io_service);
1392 new boost::asio::serial_port(*io_service));
1398 }
catch (std::runtime_error& e)
1401 throw std::runtime_error(
"Could not open serial port : " +
serial_port_ +
1408 "Our boost version is " + std::to_string(BOOST_VERSION) +
".");
1409 if (BOOST_VERSION < 106600)
1417 int fd = serial->native_handle();
1421 tcgetattr(fd, &tio);
1424 if (flowcontrol ==
"RTS|CTS")
1426 tio.c_iflag &= ~(IXOFF | IXON);
1427 tio.c_cflag |= CRTSCTS;
1430 tio.c_iflag &= ~(IXOFF | IXON);
1431 tio.c_cflag &= ~CRTSCTS;
1439 tcsetattr(fd, TCSANOW, &tio);
1442 struct serial_struct serialInfo;
1444 ioctl(fd, TIOCGSERIAL, &serialInfo);
1445 serialInfo.flags |= ASYNC_LOW_LATENCY;
1446 ioctl(fd, TIOCSSERIAL, &serialInfo);
1454 "You have called the initializeSerial() method though an AsyncManager object is already available! Start all anew..");
1463 "Gradually increasing the baudrate to the desired value...");
1464 boost::asio::serial_port_base::baud_rate current_baudrate;
1473 }
catch (boost::system::system_error& e)
1477 "get_option failed due to " + std::string(e.what()));
1479 boost::diagnostic_information(e));
1493 "Current baudrate is " + std::to_string(current_baudrate.value()));
1496 if (current_baudrate.value() ==
baudrate_)
1508 boost::asio::serial_port_base::baud_rate(
BAUDRATES[i]));
1509 }
catch (boost::system::system_error& e)
1513 "set_option failed due to " + std::string(e.what()));
1515 boost::diagnostic_information(e));
1524 serial->get_option(current_baudrate);
1525 }
catch (boost::system::system_error& e)
1529 "get_option failed due to " + std::string(e.what()));
1531 boost::diagnostic_information(e));
1542 std::to_string(current_baudrate.value()));
1545 std::to_string(current_baudrate.value()) +
1546 ", leaving InitializeSerial() method");
1552 namespace bp = boost::placeholders;
1559 bp::_1, bp::_2, bp::_3));
double theta_z
IMU orientation z-angle.
septentrio_gnss_driver::VelCovGeodetic VelCovGeodeticMsg
bool connected_
Whether connecting to Rx was successful.
nmea_msgs::Gpgsa GpgsaMsg
uint32_t polling_period_rest
Polling period for all other SBF blocks and NMEA messages.
ReadResult read()
Attempt to read a packet and store data to buffer.
boost::mutex connection_mutex_
uint32_t ins_vsm_serial_baud_rate
VSM serial baud rate.
uint32_t ins_vsm_ip_server_port
VSM tcp port.
boost::shared_ptr< Manager > manager_
septentrio_gnss_driver::AttCovEuler AttCovEulerMsg
bool ins_in_gnss_mode
Handle the case when an INS is used in GNSS mode.
uint32_t baudrate_
Baudrate at the moment, unless InitializeSerial or ResetSerial fail.
bool publish_basevectorgeod
Whether or not to publish the BaseVectorGeodMsg message.
bool publish_insnavcart
Whether or not to publish the INSNavCartMsg message.
bool publish_attcoveuler
Whether or not to publish the AttCovEulerMsg message.
float delta_e
Marker-to-ARP offset in the eastward direction.
bool publish_tf
Whether or not to publish the tf of the localization.
std::string ins_vsm_ip_server_id
VSM IP server id.
void send(const std::string &)
Hands over to the send() method of manager_.
bool read_from_sbf_log
Whether or not we are reading from an SBF file.
std::string hw_flow_control
HW flow control.
void readCallback(Timestamp recvTimestamp, const uint8_t *data, std::size_t &size)
Searches for Rx messages that could potentially be decoded/parsed/published.
bool publish_poscovgeodetic
std::string ins_vsm_serial_port
VSM serial port.
std::vector< uint8_t > buffer_t
Settings * settings_
Settings.
void prepareSBFFileReading(std::string file_name)
Sets up the stage for SBF file reading.
double poi_x
INS POI offset in x-dimension.
Comm_IO(ROSaicNodeBase *node, Settings *settings)
Constructor of the class Comm_IO.
void defineMessages()
Defines which Rx messages to read and which ROS messages to publish.
bool serial_
Whether yet-to-be-established connection to Rx will be serial or TCP.
static const unsigned int SET_BAUDRATE_SLEEP_
std::string ant_serial_nr
Serial number of your particular Main antenna.
bool g_response_received
Determines whether a command reply was received from the Rx.
septentrio_gnss_driver::PVTGeodetic PVTGeodeticMsg
bool containsSpace(const std::string str)
Checks if a string contains spaces.
septentrio_gnss_driver::VelSensorSetup VelSensorSetupMsg
void disconnect()
Close connected file.
bool isConnected() const
Check if file is open and healthy.
septentrio_gnss_driver::INSNavCart INSNavCartMsg
bool initializeSerial(std::string port, uint32_t baudrate=115200, std::string flowcontrol="None")
Initializes the serial port.
void initializeIO()
Initializes the I/O handling.
void initializeSBFFileReading(std::string file_name)
Initializes SBF file reading and reads SBF file by repeatedly calling read_callback_() ...
RtkSettings rtk_settings
RTK corrections settings.
std::unique_ptr< boost::thread > connectionThread_
Connection or reading thread.
Highest-Level view on communication services.
bool ins_use_poi
INS solution reference point.
void reconnect()
Attempts to (re)connect every reconnect_delay_s_ seconds.
std::string login_user
Username for login.
septentrio_gnss_driver::ExtSensorMeas ExtSensorMeasMsg
std::vector< RtkNtrip > ntrip
std::string ins_vsm_ros_source
VSM source for INS.
double vsm_x
INS velocity sensor lever arm x-offset.
double vsm_y
INS velocity sensor lever arm y-offset.
void log(LogLevel logLevel, const std::string &s)
Log function to provide abstraction of ROS loggers.
bool connect(const char *device)
Try to open a pcap file.
std::string convertUserPeriodToRxCommand(uint32_t period_user)
Transforms the input polling period [milliseconds] into a std::string number that can be appended to ...
septentrio_gnss_driver::AttEuler AttEulerMsg
geometry_msgs::TransformStamped t
septentrio_gnss_driver::IMUSetup IMUSetupMsg
boost::mutex g_cd_mutex
Mutex to control changes of global variable "g_cd_received".
bool publish_twist
Whether or not to publish the TwistWithCovarianceStampedMsg message.
std::string serial_port_
Saves the port description.
nmea_msgs::Gpgsv GpgsvMsg
std::string rx_serial_port
nmea_msgs::Gprmc GprmcMsg
bool publish_gpst
Whether or not to publish the TimeReferenceMsg message with GPST.
double poi_y
INS POI offset in y-dimension.
ROSaicNodeBase * node_
Pointer to Node.
static const size_t BUFFSIZE
double ant_lever_x
INS antenna lever arm x-offset.
nmea_msgs::Gpgga GpggaMsg
uint32_t polling_period_pvt
Polling period for PVT-related SBF blocks.
std::string port_
Port over which TCP/IP connection is currently established.
bool publish_insnavgeod
Whether or not to publish the INSNavGeodMsg message.
bool publish_gprmc
Whether or not to publish the RMC message.
septentrio_gnss_driver::BaseVectorCart BaseVectorCartMsg
double poi_z
INS POI offset in z-dimension.
bool publish_gpgsa
Whether or not to publish the GSA message.
bool initializeTCP(std::string host, std::string port)
Initializes the TCP I/O.
void resetMainPort()
Reset main port so it can receive commands.
septentrio_gnss_driver::ReceiverTime ReceiverTimeMsg
bool ins_vsm_serial_keep_open
Wether VSM shall be kept open om shutdown.
float delta_n
Marker-to-ARP offset in the northward direction.
std::string login_password
Password for login.
bool publish_poscovcartesian
bool publish_measepoch
Whether or not to publish the MeasEpoch message.
bool publish_basevectorcart
std::string trimDecimalPlaces(double num)
Trims decimal places to two.
CallbackMap insert(std::string message_key)
Adds a pair to the multimap "callbackmap_", with the message_key being the key.
bool publish_extsensormeas
Whether or not to publish the ExtSensorMeasMsg message.
double heading_offset
Attitude offset determination in longitudinal direction.
bool publish_gpgga
Whether or not to publish the GGA message.
boost::condition_variable g_response_condition
Condition variable complementing "g_response_mutex".
bool publish_localization
Whether or not to publish the LocalizationMsg message.
septentrio_gnss_driver::INSNavGeod INSNavGeodMsg
std::string ant_aux1_serial_nr
Serial number of your particular Aux1 antenna.
std::string septentrio_receiver_type
Septentrio receiver type, either "gnss" or "ins".
static const uint32_t BAUDRATES[]
Possible baudrates for the Rx.
std::string g_rx_tcp_port
Rx TCP port, e.g. IP10 or IP11, to which ROSaic is connected to.
~Comm_IO()
Default destructor of the class Comm_IO.
Class for handling a pcap file.
bool publish_pvtcartesian
uint32_t baudrate
Baudrate.
bool read_from_pcap
Whether or not we are reading from a PCAP file.
bool publish_velcovgeodetic
double theta_x
IMU orientation x-angle.
bool publish_velsensorsetup
Whether or not to publish the VelSensorSetupMsg message.
void preparePCAPFileReading(std::string file_name)
Sets up the stage for PCAP file reading.
std::string device
Device port.
std::string mainPort_
Communication ports.
void sendVelocity(const std::string &velNmea)
Hands over NMEA velocity message over to the send() method of manager_.
septentrio_gnss_driver::PosCovGeodetic PosCovGeodeticMsg
bool publish_pvtgeodetic
Whether or not to publish the PVTGeodeticMsg message.
bool publish_exteventinsnavcart
Whether or not to publish the ExtEventINSNavCartMsg message.
bool publish_gpsfix
Whether or not to publish the GPSFixMsg message.
septentrio_gnss_driver::PosCovCartesian PosCovCartesianMsg
void configureRx()
Configures Rx: Which SBF/NMEA messages it should output and later correction settings.
bool g_cd_received
Determines whether the connection descriptor was received from the Rx.
std::string tcp_port_
TCP port number.
boost::condition_variable connection_condition_
bool ins_vsm_ip_server_keep_open
Wether VSM shall be kept open om shutdown.
std::atomic< bool > stopping_
Indicator for threads to exit.
bool publish_imu
Whether or not to publish the ImuMsg message.
bool publish_imusetup
Whether or not to publish the IMUSetupMsg message.
double ant_lever_y
INS antenna lever arm y-offset.
boost::condition_variable g_cd_condition
Condition variable complementing "g_cd_mutex".
diagnostic_msgs::DiagnosticArray DiagnosticArrayMsg
Declares a class for handling pcap files.
float att_std_dev
Attitude deviation mask.
void setManager(const boost::shared_ptr< Manager > &manager)
Set the I/O manager.
float pos_std_dev
Position deviation mask.
This is the central interface between ROSaic and the Rx(s), managing I/O operations such as reading m...
std::string ant_aux1_type
bool publish_exteventinsnavgeod
Whether or not to publish the ExtEventINSNavGeodMsg message.
std::vector< RtkSerial > serial
Timestamp getTime()
Gets current timestamp.
nav_msgs::Odometry LocalizationUtmMsg
CallbackHandlers handlers_
Callback handlers for the inwards streaming messages.
double vsm_z
INS velocity sensor lever arm z-offset.
double pitch_offset
Attitude offset determination in latitudinal direction.
bool publish_atteuler
Whether or not to publish the AttEulerMsg message.
std::string datum
Datum to be used.
This class is the base class for abstraction.
double theta_y
IMU orientation y-angle.
void initializePCAPFileReading(std::string file_name)
Initializes PCAP file reading and reads PCAP file by repeatedly calling read_callback_() ...
boost::mutex g_response_mutex
Mutex to control changes of global variable "g_response_received".
bool publish_gpgsv
Whether or not to publish the GSV message.
bool publish_diagnostics
Whether or not to publish the DiagnosticArrayMsg message.
std::vector< RtkIpServer > ip_server
bool publish_pose
Whether or not to publish the PoseWithCovarianceStampedMsg message.
std::string ins_initial_heading
For heading computation when unit is powered-cycled.
septentrio_gnss_driver::PVTCartesian PVTCartesianMsg
void connect()
Calls the reconnect() method.
sensor_msgs::NavSatFix NavSatFixMsg
septentrio_gnss_driver::BaseVectorGeod BaseVectorGeodMsg
std::string tcp_host_
Host name of TCP server.
gps_common::GPSFix GPSFixMsg
geometry_msgs::PoseWithCovarianceStamped PoseWithCovarianceStampedMsg
bool multi_antenna
INS multiantenna.
bool publish_navsatfix
Whether or not to publish the NavSatFixMsg message.
std::string host_
Host currently connected to.
float delta_u
Marker-to-ARP offset in the upward direction.
double ant_lever_z
INS antenna lever arm z-offset.