This repository hosts a ROS Melodic and Noetic driver (i.e. for Linux only) - written in C++ - that works with mosaic - one of Septentrio's cutting-edge GNSS receiver families - and beyond. Since Noetic will only be supported until 2025, we plan to make ROSaic compatible with ROS2.
Please let the maintainers know of your success or failure in using the driver with other devices so we can update this page appropriately.
master branch for this driver functions on both ROS Melodic (Ubuntu 18.04) and Noetic (Ubuntu 20.04). It is thus necessary to install the ROS version that has been designed for your Linux distro.
The serial and TCP/IP communication interface of the ROS driver is established by means of the Boost C++ library. In the unlikely event that the below installation instructions fail to install Boost on the fly, please install the Boost libraries via<br>
sudo apt install libboost-all-dev.
Compatiblity with PCAP captures are incorporated through pcap libraries. Install the necessary headers via<br>
sudo apt install libpcap-dev.
The binary release is now available for Melodic, yet will take another few days for Noetic. To install the binary package on Melodic, simply run<br>
sudo apt-get install ros-melodic-septentrio-gnss-driver.
Alternatively, the package can also be built from source using
catkin_tools, where the latter can be installed using the command<br>
sudo apt-get install python-catkin-tools for Melodic or
sudo apt-get install python3-catkin-tools for Noetic.
catkin_tools workflow should suffice:
User, not just
true. Note that
gpsfixaccounts for 4 additional streams (
config/rover.yamlfile according to your needs (the
launch/rover.launchneed not necessarily be modified). Specify the communication parameters, the ROS messages to be published, the frequency at which the latter should happen etc.:
In order to launch ROSaic, one must specify all
arg fields of the
rover.launch file which have no associated default values, i.e. for now only the
param_file_name field. In practice, the launch command thus reads
roslaunch septentrio_gnss_driver rover.launch param_file_name:=rover.
The following is a list of ROSaic parameters found in the
device: location of device connection
serial:xxxformat for serial connections, where
xxxis the device node, e.g.
file_name:path/to/file.sbfformat for publishing from an SBF log
file_name:path/to/file.pcapformat for publishing from PCAP capture.
roslaunch septentrio...might be useful to specify that the node should be started using the executable's directory as its working-directory.
tcp://host:portformat for TCP/IP connections
28784should be used as the default (command) port for TCP/IP connections. If another port is specified, the receiver needs to be (re-)configured via the Web Interface before ROSaic can be used.
serial: specifications for serial communication
serial/baudrate: serial baud rate to be used in a serial connection
serial/rx_serial_port: determines to which (virtual) serial port of the Rx we want to get connected to, e.g. USB1 or COM1
hw_flow_control: specifies whether the serial (the Rx's COM ports, not USB1 or USB2) connection to the Rx should have UART HW flow control enabled or not
offto disable UART HW flow control,
RTS|CTSto enable it
frame_id: name of the ROS tf frame for the Rx, placed in the header of all published messages
tf_prefixif defined. If a ROS message has a header (all of those we publish do), the frame ID can be found via
rostopic echo /topic, where
/topicis the topic into which the message is being published.
datum: datum that (ellipsoidal) height should be referenced to in all published ROS messages
marker_to_arp: offsets of the antenna reference point (ARP) with respect to the marker
delta_uare the offsets in the East, North and Up (ENU) directions respectively, expressed in meters.
ant_type: type of your antenna
lstAntennaInfo, Overview. This is the list of antennas for which the receiver can compensate for phase center variation.
ant_typedoes not match any entry in the list returned by
lstAntennaInfo, Overview, the receiver will assume that the phase center variation is zero at all elevations and frequency bands, and the position will not be as accurate.
ant_serial_nr: serial number of your antenna
leap_seconds: number of leap seconds that have been inserted up until the point of ROSaic usage
use_GNSS_timeto true and uncomment a paragraph in the
UTCtoUnix()function definition found in the file
septentrio_gnss_driver/src/septentrio_gnss_driver/parsers/parsing_utilities.cppand enter the year, month and date to be simulated.
polling_period/pvt: desired period in milliseconds between the polling of two consecutive
PosCovCartesianblocks and - if published - between the publishing of two of the corresponding ROS messages (e.g.
polling_period/rest: desired period in milliseconds between the polling of all other SBF blocks and NMEA sentences not addressed by the previous parameter, and - if published - between the publishing of all other ROS messages
reconnect_delay_s: delay in seconds between reconnection attempts to the connection specified in the parameter
trueif the ROS message headers' unix epoch time field shall be constructed from the TOW (in the SBF case) and UTC (in the NMEA case) data,
falseif those times shall be constructed by the driver via the time(NULL) function found in the
ntrip_settings: determines NTRIP connection parameters
rx_has_internetto true, and
rx_has_internetto false, but
Data Linkfrom Septentrio's RxTools is installed on the computer.
ntrip_settings/mode, specifies the type of the NTRIP connection and must be one of
Clientmode, the receiver receives data from the NTRIP caster. When selecting the
Client-Sapcordamode, the receiver receives data from the Sapcorda NTRIP service and no further settings are required, i.e. all other nested parameters are ignored. Note that the latter mode only works in Europe and North America. Set mode to
offto disable all correction services.
ntrip_settings/casteris the hostname or IP address of the NTRIP caster to connect to. To send data to the built-in NTRIP caster, use "localhost" for this parameter.
ntrip_settings/mountpointare the IP port number, the user name, the password and the mount point, respectively, to be used when connecting to the NTRIP caster. The receiver encrypts the password so that it cannot be read back with the command "getNtripSettings". The
ntrip_settings/versionargument specifies which version of the NTRIP protocol to use (
send_ggaspecifies whether or not to send NMEA GGA messages to the NTRIP caster, and at which rate. It must be one of
automode, the receiver automatically sends GGA messages if requested by the caster.
rx_has_internetspecifies whether the Rx has internet access or not. Note that an Ethernet cable is the only way to enable internet access on mosaic receivers (and most others) at the moment. In case internet is available, NTRIP will be configured with a simple command
snts, ...that ROSaic sends to the receiver.
rtcm_versionspecifies the type of RTCM data transmitted to ROSaic by the NTRIP caster, either
RTCMv3. It depends on the mountpoint.
rx_input_corrections_tcpspecifies the port number of the IP server (IPS1) connection that ROSaic establishes on the receiver. Note that ROSaic will send GGA messages on this connection, such that in the
Data Linkapplication of
RxToolsone just needs to set up a TCP client to the host name as found in the ROSaic parameter
devicewith the port as found in
rx_input_corrections_tcp. If the latter connection were connection 1 on
Data Link, then connection 2 would set up an NTRIP client connecting to the NTRIP caster as specified in the above parameters in order to forward the corrections from connection 2 to connection 1.
rx_input_corrections_serialanalogously determines the port on which corrections could be serially forwarded to the Rx via
off, empty, empty, empty, empty, empty,
septentrio_gnss_driver/GPGGA.msgmessages into the topic
septentrio_gnss_driver/GPRMC.msgmessages into the topic
septentrio_gnss_driver/GPGSA.msgmessages into the topic
septentrio_gnss_driver/GPGSV.msgmessages into the topic
septentrio_gnss_driver/PVTCartesian.msgmessages into the topic
septentrio_gnss_driver/PVTGeodetic.msgmessages into the topic
septentrio_gnss_driver/PosCovCartesian.msgmessages into the topic
septentrio_gnss_driver/PosCovGeodetic.msgmessages into the topic
septentrio_gnss_driver/AttEuler.msgmessages into the topic
septentrio_gnss_driver/AttCovEuler.msgmessages into the topic
sensor_msgs/TimeReference.msgmessages into the topic
sensor_msgs/NavSatFix.msgmessages into the topic
gps_common/GPSFix.msgmessages into the topic
geometry_msgs/PoseWithCovarianceStamped.msgmessages into the topic
diagnostic_msgs/DiagnosticArray.msgmessages into the topic
A selection of NMEA sentences, the majority being standardized sentences, and proprietary SBF blocks is translated into ROS messages, partly generic and partly custom, and can be published at the discretion of the user into the following ROS topics. All published ROS messages, even custom ones, start with a ROS generic header
std_msgs/Header.msg, which includes the receiver time stamp as well as the frame ID, the latter being specified in the ROS parameter
/gpgga: publishes custom ROS message
septentrio_gnss_driver/Gpgga.msg- equivalent to
nmea_msgs/Gpgga.msg- converted from the NMEA sentence GGA
/gprmc: publishes custom ROS message
septentrio_gnss_driver/Gprmc.msg- equivalent to
nmea_msgs/Gprmc.msg- converted from the NMEA sentence RMC
/gpgsa: publishes custom ROS message
septentrio_gnss_driver/Gpgsa.msg- equivalent to
nmea_msgs/Gpgsa.msg- converted from the NMEA sentence GSA
/gpgsv: publishes custom ROS message
septentrio_gnss_driver/Gpgsv.msg- equivalent to
nmea_msgs/Gpgsv.msg- converted from the NMEA sentence GSV
/pvtcartesian: publishes custom ROS message
septentrio_gnss_driver/PVTCartesian.msg, corresponding to the SBF block
/pvtgeodetic: publishes custom ROS message
septentrio_gnss_driver/PVTGeodetic.msg, corresponding to the SBF block
/poscovcartesian: publishes custom ROS message
septentrio_gnss_driver/PosCovCartesian.msg, corresponding to SBF block
/poscovgeodetic: publishes custom ROS message
septentrio_gnss_driver/PosCovGeodetic.msg, corresponding to SBF block
/atteuler: publishes custom ROS message
septentrio_gnss_driver/AttEuler.msg, corresponding to SBF block
/attcoveuler: publishes custom ROS message
septentrio_gnss_driver/AttCovEuler.msg, corresponding to the SBF block
/gpst(for GPS Time): publishes generic ROS message
sensor_msgs/TimeReference.msg, converted from the
PVTGeodeticblock's GPS time information, stored in its header, or - if
use_gnss_timeis set to
false- from the systems's wall-clock time
/navsatfix: publishes generic ROS message
sensor_msgs/NavSatFix.msg, converted from the SBF blocks
/gpsfix: publishes generic ROS message
gps_common/GPSFix.msg, which is much more detailed than
sensor_msgs/NavSatFix.msg, converted from the SBF blocks
/pose: publishes generic ROS message
geometry_msgs/PoseWithCovarianceStamped.msg, converted from the SBF blocks
setAntennaLocation, ...) !local! NED frame. Thus the orientation is !not! given with respect to the same frame as the position is given in. The cross-covariances are hence set to 0.
robot_localizationpackage can accept the ROS message
/diagnostics: accepts generic ROS message
diagnostic_msgs/DiagnosticArray.msg, converted from the SBF blocks
host:portspecification, the driver could automatically search and establish a connection on the specified port.
/measepoch: It could accept the custom ROS message
septentrio_gnss_driver/MeasEpoch.msg, corresponding to the SBF block
MeasEpoch(raw GNSS data).
/twist: It could accept the generic ROS message
geometry_msgs/TwistWithCovarianceStamped.msg, converted from the SBF blocks
PosCovGeodeticand others or via standardized NMEA sentences (cf. the NMEA driver).
Is there an SBF or NMEA message that is not being addressed while being important to your application? If yes, follow these steps:
.msgfile to the
septentrio_gnss_driver/PVTGeodetic.h) that gets compiler-generated from the
.msgfile constructed in step 3.
NMEA_ID_Enumenumeration in the
rx_message.hppfile with a new entry.
RxIDMapmap in the
rx_message.cppfile with a new pair.
io_comm_rx::RxMessage classin the
rx_message.hppfile. It should be modeled on the existing
evPVTGeodeticcase, e.g. one needs a static counter variable declaration.
septentrio_gnss_driver/src/septentrio_gnss_driver/parsers/nmea_parsersfolder and one such as
publish/..ROSaic parameter in the
septentrio_gnss_driver/config/rover.yamlfile, create a global boolean variable
septentrio_gnss_driver/src/septentrio_gnss_driver/node/rosaic_node.cppfile, insert the publishing callback function to the C++ "multimap"
IO.handlers_.callbackmap_- which is already storing all the others - in the
rosaic_node::ROSaicNode::defineMessages()method in the same file and add an
extern bool publish_...;line to the
septentrio_gnss_driver/CMakeLists.txtfile by adding a new entry to the