RTK Heading
Hardware
AutomatePro can be configured with an integrated RTK GNSS heading sensor, providing precise heading. This is particularly useful when the onboard IMU’s magnetic bearing accuracy is insufficient or when the magnetometer is affected by the operational environment, such as around large steel structures. Depending on antenna placement, the GNSS heading sensor can also measure the robot’s roll or pitch.
The differential heading is provided by the u-blox F9H series. If included, AutomatePro will feature a blue FAKRA connector for antenna connection, with “GNSS-2” used for position and “GNSS-1” for heading.

GNSS Heading Specifications
| Parameter | Value |
|---|---|
| Receiver | u-blox F9H |
| Connector | GNSS-1 (FAKRA C - Signal Blue) |
| Supported Constellation | GPS, Galileo, BeiDou, GLONASS |
| Heading Accuracy | 0.4° 1 (with antenna spacing >1m) |
| Max Navigation Update Rate | Default 1Hz (Can be configured up to 8Hz) |
1 Depends on antennas and spacing between the two antennas. See the datasheet for more information.
External Antenna
The AutomatePro system is compatible with a variety of multi-band high-precision GNSS antennas that have a FAKRA Type C connector (Signal Blue). More information on antennas used with AutomatePro is available here.
Antenna Separation: Ensure a minimum separation of 1 meter (≥1m) between the two GNSS antennas. Configuration options are heading (Yaw) and pitch or heading (Yaw) and roll.
Yaw & Pitch

Yaw & Roll

ROS API
Node: automatepro_gnss_heading_node
Publishers
| Topic | Type | Description |
|---|---|---|
/sensor/gnss/heading/fix | sensor_msgs/msg/NavSatFix | GNSS fix from the heading receiver. |
/sensor/gnss/heading/fix_velocity | geometry_msgs/msg/TwistWithCovarianceStamped | Velocity from the heading receiver. |
/sensor/gnss/heading/true_heading | sensor_msgs/msg/Imu | Differential heading as an orientation quaternion with covariance. |
/sensor/gnss/heading/navrelposned | ublox_msgs/msg/NavRELPOSNED9 | Detailed differential heading with additional information for calculating either roll or pitch. |
/sensor/gnss/heading/monhw | ublox_msgs/msg/MonHW | Hardware status of the GNSS heading module. |
/sensor/gnss/heading/monsys | ublox_msgs/msg/MonSYS | System monitor status of the GNSS heading module. |
/diagnostics | diagnostic_msgs/msg/DiagnosticArray | GNSS heading ROS driver diagnostics. |
Even though /sensor/gnss/heading/navrelposned provides more information, it is not required for normal use cases.
It is recommended to use /sensor/gnss/heading/true_heading for your application, which provides heading as a quaternion with covariance.
Parameters
| Parameter | Type | Packaged default | Runtime R/W | Description |
|---|---|---|---|---|
device | string | /dev/serial/by-id/usb-u-blox_AG_-_www.u-blox.com_u-blox_GNSS_receiver-if00 | read-only | Serial port for the F9H receiver. |
frame_id | string | gnss_heading | read-only | Frame ID for published messages. |
config_on_startup | bool | false | read-only | Leaves receiver flash configuration unchanged at startup. |
gpio.chipname | string | gpiochip0 | read-only | GPIO chip used for receiver reset recovery. |
gpio.line_num | int | 134 | read-only | GPIO line used for receiver reset recovery. |
gpio.reset_time | int | 1 | read-only | Reset pulse duration in seconds. |
recovery.cycle_time | int | 1 | read-only | Delay between recovery attempts in seconds. |
watchdog.timeout | int | 3000 | read-only | Watchdog timeout in milliseconds. |
watchdog.cycle_time | int | 500 | read-only | Watchdog check interval in milliseconds. |
publish.all | bool | false | read-only | Enables all publisher groups when true. |
publish.aid.hui | bool | false | read-only | Enables AID-HUI message publishing. |
publish.nav.relposned | bool | true | read-only | Enables NavRELPOSNED9 publishing. |
publish.nav.heading | bool | true | read-only | Enables heading publishing on /sensor/gnss/heading/true_heading. |
publish.nmea | bool | false | read-only | Keeps NMEA sentence publishing disabled for the heading receiver. |
publish.mon.all | bool | true | read-only | Enables monitor-message publishers, including hardware status. |
debug | int | 0 | read-only | Debug verbosity; range 0-4. |
Configuration
Driver: automatepro_gnss_driver Container: automatepro-core-driver
Runtime configuration files are in the /opt/automatepro/config/ros directory.
Packaged defaults are installed in /opt/automatepro/defconfig/ros.
The runtime files are mounted into the Docker container and used by the ROS driver.
Environment variables can be set in the /opt/automatepro/.env file.
The runtime configuration file is:
/opt/automatepro/config/ros/gnss_heading_params.yaml
The packaged default source is:
/opt/automatepro/defconfig/ros/gnss_heading_params.yaml
Default Config
# Configuration Settings for F9H device in Rover Mode
automatepro_gnss_heading_node:
ros__parameters:
debug: 0 # Range 0-4 (0 means no debug statements will print)
device: /dev/serial/by-id/usb-u-blox_AG_-_www.u-blox.com_u-blox_GNSS_receiver-if00 #/dev/ttyACM0
frame_id: gnss_heading
config_on_startup: false # If false, the node will not override configurations of the device on startup
# Device should be configured with u-center and configurations should be saved in flash
# Please use the configuration file provided by Lemvos
# GPIO configuration
gpio:
chipname: "gpiochip0"
line_num: 134
reset_time: 1
# Recovery configuration
recovery:
cycle_time: 1
# Watchdog configuration
watchdog:
timeout: 3000
cycle_time: 500
# Enable u-blox gnss message publishers
publish:
all: false
aid:
hui: false
nav:
relposned: true
heading: true
nmea: false
mon:
all: true
Restart the automatepro-core-driver Docker container after changing the configuration.
Configuration changes are applied only after the container restarts.
docker restart automatepro-core-driver