mirror of
https://github.com/OSURoboticsClub/Rover_2017_2018.git
synced 2025-11-08 10:11:14 +00:00
Removed ublox. Added rover_drive
This commit is contained in:
195
software/ground_station/.idea/workspace.xml
generated
195
software/ground_station/.idea/workspace.xml
generated
@@ -16,28 +16,6 @@
|
||||
<component name="CreatePatchCommitExecutor">
|
||||
<option name="PATCH_PATH" value="" />
|
||||
</component>
|
||||
<component name="DockManager">
|
||||
<window id="1">
|
||||
<content type="file-editors">
|
||||
<state>
|
||||
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
|
||||
<file leaf-file-name="RoverVideoReceiver.py" pinned="false" current-in-tab="true">
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiver.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1548">
|
||||
<caret line="155" column="8" selection-start-line="155" selection-start-column="8" selection-end-line="155" selection-end-column="8" />
|
||||
<folding>
|
||||
<element signature="e#110#152#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
</leaf>
|
||||
</state>
|
||||
</content>
|
||||
</window>
|
||||
</component>
|
||||
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
|
||||
<component name="FavoritesManager">
|
||||
<favorites_list name="ground_station" />
|
||||
@@ -60,7 +38,7 @@
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="342">
|
||||
<caret line="19" column="22" selection-start-line="19" selection-start-column="22" selection-end-line="19" selection-end-column="32" />
|
||||
<caret line="19" column="26" selection-start-line="19" selection-start-column="23" selection-end-line="19" selection-end-column="26" />
|
||||
<folding>
|
||||
<element signature="e#110#145#0" expanded="true" />
|
||||
</folding>
|
||||
@@ -71,7 +49,7 @@
|
||||
<file leaf-file-name="RoverGroundStation.py" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2826">
|
||||
<state relative-caret-position="665">
|
||||
<caret line="167" column="43" selection-start-line="167" selection-start-column="43" selection-end-line="167" selection-end-column="43" />
|
||||
<folding>
|
||||
<element signature="e#132#142#0" expanded="true" />
|
||||
@@ -80,6 +58,16 @@
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="RoverVideoReceiver.py" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiver.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="252">
|
||||
<caret line="23" column="16" selection-start-line="23" selection-start-column="16" selection-end-line="23" selection-end-column="16" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</file>
|
||||
<file leaf-file-name="RoverVideoReceiverOld.py" pinned="false" current-in-tab="false">
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
@@ -107,8 +95,8 @@
|
||||
<option value="$PROJECT_DIR$/Framework/LoggingSystems/Logger.py" />
|
||||
<option value="$PROJECT_DIR$/Framework/StartupSystems/ROSMasterChecker.py" />
|
||||
<option value="$PROJECT_DIR$/RoverGroundStation.py" />
|
||||
<option value="$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py" />
|
||||
<option value="$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiver.py" />
|
||||
<option value="$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py" />
|
||||
</list>
|
||||
</option>
|
||||
</component>
|
||||
@@ -119,9 +107,9 @@
|
||||
<sorting>DEFINITION_ORDER</sorting>
|
||||
</component>
|
||||
<component name="ProjectFrameBounds">
|
||||
<option name="y" value="16" />
|
||||
<option name="width" value="1920" />
|
||||
<option name="height" value="1044" />
|
||||
<option name="x" value="235" />
|
||||
<option name="width" value="1272" />
|
||||
<option name="height" value="692" />
|
||||
</component>
|
||||
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
|
||||
<OptionsSetting value="true" id="Add" />
|
||||
@@ -200,24 +188,6 @@
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
<PATH>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="ground_station" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="ground_station" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="Framework" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
<PATH_ELEMENT>
|
||||
<option name="myItemId" value="StartupSystems" />
|
||||
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
|
||||
</PATH_ELEMENT>
|
||||
</PATH>
|
||||
</subPane>
|
||||
</pane>
|
||||
</panes>
|
||||
@@ -456,14 +426,14 @@
|
||||
<servers />
|
||||
</component>
|
||||
<component name="ToolWindowManager">
|
||||
<frame x="0" y="16" width="1920" height="1044" extended-state="6" />
|
||||
<frame x="235" y="0" width="1272" height="692" extended-state="0" />
|
||||
<editor active="true" />
|
||||
<layout>
|
||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.134375" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
||||
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.2028302" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
|
||||
<window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="6" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Event Log" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32916668" sideWeight="0.50192416" order="7" side_tool="true" content_ui="tabs" />
|
||||
<window_info id="Database" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="File Transfer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.22399151" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="File Transfer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.35762712" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Version Control" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="false" weight="0.33" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Python Console" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32908705" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
|
||||
<window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
|
||||
@@ -522,6 +492,96 @@
|
||||
<watches-manager />
|
||||
</component>
|
||||
<component name="editorHistoryManager">
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1134">
|
||||
<caret line="74" column="18" selection-start-line="74" selection-start-column="16" selection-end-line="74" selection-end-column="142" />
|
||||
<folding>
|
||||
<element signature="e#0#10#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="378">
|
||||
<caret line="21" column="37" selection-start-line="21" selection-start-column="23" selection-end-line="21" selection-end-column="37" />
|
||||
<folding>
|
||||
<element signature="e#110#134#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding>
|
||||
<element signature="e#110#145#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2826">
|
||||
<caret line="167" column="43" selection-start-line="167" selection-start-column="43" selection-end-line="167" selection-end-column="43" />
|
||||
<folding>
|
||||
<element signature="e#132#142#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1134">
|
||||
<caret line="74" column="18" selection-start-line="74" selection-start-column="16" selection-end-line="74" selection-end-column="142" />
|
||||
<folding>
|
||||
<element signature="e#0#10#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="378">
|
||||
<caret line="21" column="37" selection-start-line="21" selection-start-column="23" selection-end-line="21" selection-end-column="37" />
|
||||
<folding>
|
||||
<element signature="e#110#134#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="0">
|
||||
<caret line="0" column="0" selection-start-line="0" selection-start-column="0" selection-end-line="0" selection-end-column="0" />
|
||||
<folding>
|
||||
<element signature="e#110#145#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2826">
|
||||
<caret line="167" column="43" selection-start-line="167" selection-start-column="43" selection-end-line="167" selection-end-column="43" />
|
||||
<folding>
|
||||
<element signature="e#132#142#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1134">
|
||||
<caret line="74" column="18" selection-start-line="74" selection-start-column="16" selection-end-line="74" selection-end-column="142" />
|
||||
<folding>
|
||||
<element signature="e#0#10#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="288">
|
||||
@@ -722,9 +782,6 @@
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="18">
|
||||
<caret line="74" column="33" selection-start-line="74" selection-start-column="33" selection-end-line="74" selection-end-column="33" />
|
||||
<folding>
|
||||
<element signature="e#110#152#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
@@ -854,16 +911,6 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="2826">
|
||||
<caret line="167" column="43" selection-start-line="167" selection-start-column="43" selection-end-line="167" selection-end-column="43" />
|
||||
<folding>
|
||||
<element signature="e#132#142#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1134">
|
||||
@@ -874,28 +921,36 @@
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
|
||||
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="342">
|
||||
<caret line="19" column="22" selection-start-line="19" selection-start-column="22" selection-end-line="19" selection-end-column="32" />
|
||||
<state relative-caret-position="665">
|
||||
<caret line="167" column="43" selection-start-line="167" selection-start-column="43" selection-end-line="167" selection-end-column="43" />
|
||||
<folding>
|
||||
<element signature="e#110#145#0" expanded="true" />
|
||||
<element signature="e#132#142#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiver.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="1548">
|
||||
<caret line="155" column="8" selection-start-line="155" selection-start-column="8" selection-end-line="155" selection-end-column="8" />
|
||||
<state relative-caret-position="252">
|
||||
<caret line="23" column="16" selection-start-line="23" selection-start-column="16" selection-end-line="23" selection-end-column="16" />
|
||||
<folding />
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
|
||||
<provider selected="true" editor-type-id="text-editor">
|
||||
<state relative-caret-position="342">
|
||||
<caret line="19" column="26" selection-start-line="19" selection-start-column="23" selection-end-line="19" selection-end-column="26" />
|
||||
<folding>
|
||||
<element signature="e#110#152#0" expanded="true" />
|
||||
<element signature="e#110#145#0" expanded="true" />
|
||||
</folding>
|
||||
</state>
|
||||
</provider>
|
||||
</entry>
|
||||
</component>
|
||||
<component name="webServersAuthStorage">
|
||||
<data>AAAAsNHwc2N+8Zbshoe1tr2XDVkf8aGU/l0YnN7t0gOfSXYMOeQZo2dVv+GbvgrFH5EF+uviJzRPHArF3uX1Vb0CuhmnSE0NSLdGfSjyMrpWsoZyS3WBI979X8Y/8lSe/g2O65pafrceXlU4ySEbA9w/JNU42PtXijURL7sXfaZ8kxhE5bYQlRppUyBo5g/qgzvj275mbp6uuZ5w9ssFsOzrJGsGulioJmZ9L9P6O6PVj2sPT2AEw+jC8eGiiappc0lWOA==</data>
|
||||
<data>AAAAsH63+SvytziMvlumQd3PJGrlTyW9FEPL7WYiG5g6tC+j0Pd8NgiGgKuYxUldo4nHUZaB7voERb8t1riqe9fWPgMKFVfPs6FHx+RfsTSoy0A2GtWRXeBXtthBJCVL3fsQjZmy/cEnjcjR8HrXNrVS8q2i6A8uDgTUF7xEIp5EgHwrnRn/3O99V1qfKNOqI5Q/YS/JYZWxwK+7QJVx6xhplXmMNlMfA7Pg5222Hy/dnHAjYJKyQfjgpqqPuaxXVDYK8g==</data>
|
||||
</component>
|
||||
</project>
|
||||
@@ -20,7 +20,7 @@ from sensor_msgs.msg import CompressedImage
|
||||
#####################################
|
||||
CAMERA_TOPIC_PATH = "/cameras/"
|
||||
|
||||
QUALITY_MAX = 50
|
||||
QUALITY_MAX = 80
|
||||
QUALITY_MIN = 15
|
||||
|
||||
|
||||
@@ -153,7 +153,7 @@ class RoverVideoReceiver(QtCore.QThread):
|
||||
|
||||
def __show_video_enabled(self):
|
||||
self.__update_camera_subscription_and_settings()
|
||||
|
||||
|
||||
if self.new_frame and self.current_camera_settings["resolution"]:
|
||||
self.__perform_quality_check_and_adjust()
|
||||
|
||||
|
||||
0
software/rover/rover_drive/src/rover_drive.py
Normal file
0
software/rover/rover_drive/src/rover_drive.py
Normal file
92
software/rover/ublox-master/.gitignore
vendored
92
software/rover/ublox-master/.gitignore
vendored
@@ -1,92 +0,0 @@
|
||||
# BUILD PRODUCTS
|
||||
*.d
|
||||
*.o
|
||||
*.disasm
|
||||
*.map
|
||||
*.elf
|
||||
*.bin
|
||||
*.hex
|
||||
*.slo
|
||||
*.lo
|
||||
*.obj
|
||||
|
||||
# CMAKE TEMPORARY FILES
|
||||
CMakeCache.txt
|
||||
CMakeFiles/
|
||||
CMakeFiles/*
|
||||
|
||||
# BUILD FOLDERS
|
||||
bin/
|
||||
bin/*
|
||||
build/
|
||||
build/*
|
||||
|
||||
# ROS GENERATED PRODUCTS
|
||||
msg_gen/
|
||||
msg_gen/*
|
||||
srv_gen/
|
||||
srv_gen/*
|
||||
|
||||
# ROS GENERATED PYTHON
|
||||
_*.py
|
||||
_*.pyc
|
||||
|
||||
# ROS BAG FILES
|
||||
*.bag
|
||||
|
||||
# XCODE BUILD PRODUCTS
|
||||
*.build/
|
||||
*.build/*
|
||||
|
||||
# XCODE USER SETTINGS
|
||||
*.xcuserdatad/
|
||||
*.xcuserdatad/*
|
||||
*.pbxuser
|
||||
*.pbxuser/*
|
||||
|
||||
# QTCREATOR PROJECT
|
||||
*.includes
|
||||
*.creator
|
||||
*.creator.user
|
||||
*.config
|
||||
*.files
|
||||
|
||||
# GEANY PROJECTS
|
||||
*.geany
|
||||
|
||||
# JETBRAINS
|
||||
*.idea
|
||||
|
||||
# ZEND/ECLIPSE
|
||||
*.buildpath
|
||||
*.settings
|
||||
*.project
|
||||
*.pydevproject
|
||||
|
||||
# MACOSX SETTINGS
|
||||
*.DS_Store
|
||||
|
||||
# GENERATED DOCUMENTATION
|
||||
html_docs/
|
||||
html_docs/*
|
||||
|
||||
# ANDROID SDK GENERATED JAVA
|
||||
gen/
|
||||
gen/*
|
||||
|
||||
# COMPILED DYNAMIC LIBRARIES
|
||||
*.so
|
||||
*.dylib
|
||||
*.dll
|
||||
|
||||
# COMPILED STATIC LIBRARIES
|
||||
*.lai
|
||||
*.la
|
||||
*.a
|
||||
*.lib
|
||||
|
||||
# EXECUTABLES
|
||||
*.exe
|
||||
*.out
|
||||
*.app
|
||||
|
||||
@@ -1,353 +0,0 @@
|
||||
# ublox
|
||||
The `ublox` package provides support for [u-blox](http://www.u-blox.com) GPS receivers. Only the _serial_ configuration of the driver is documented here, but TCP communication is also supported by the driver (untested).
|
||||
|
||||
The driver was originally written by Johannes Meyer. Changes made later are detailed in the version history below.
|
||||
|
||||
## Options
|
||||
|
||||
Example .yaml configuration files are included in `ublox_gps/config`. Consult the u-blox documentation for your device for the recommended settings.
|
||||
|
||||
The `ublox_gps` node supports the following parameters for all products and firmware versions:
|
||||
* `device`: Path to the device port. Defaults to `/dev/ttyACM0`.
|
||||
* `raw_data`: Whether the device is a raw data product. Defaults to false. Firmware <= 7.03 only.
|
||||
* `load`: Parameters for loading the configuration to non-volatile memory. See `ublox_msgs/CfgCFG.msg`
|
||||
* `load/mask`: uint32_t. Mask of the configurations to load.
|
||||
* `load/device`: uint32_t. Mask which selects the devices for the load command.
|
||||
* `save`: Parameters for saving the configuration to non-volatile memory. See `ublox_msgs/CfgCFG.msg`
|
||||
* `save/mask`: uint32_t. Mask of the configurations to save.
|
||||
* `save/device`: uint32_t. Mask which selects the devices for the save command.
|
||||
* `uart1/baudrate`: Bit rate of the serial communication. Defaults to 9600.
|
||||
* `uart1/in`: UART1 in communication protocol. Defaults to UBX, NMEA & RTCM. See `CfgPRT` message for possible values.
|
||||
* `uart1/out`: UART1 out communication protocol. Defaults to UBX, NMEA & RTCM. See `CfgPRT` message for possible values.
|
||||
* `frame_id`: ROS name prepended to frames produced by the node. Defaults to `gps`.
|
||||
* `rate`: Rate in Hz of measurements. Defaults to 4.
|
||||
* `nav_rate`: How often navigation solutions are published in number of measurement cycles. Defaults to 1.
|
||||
* `enable_ppp`: Enable precise-point-positioning system. Defaults to false.
|
||||
* `gnss/sbas`: Enable satellite-based augmentation system. Defaults to false.
|
||||
* `sbas/max`: Maximum number of SBAS channels. Defaults to 0.
|
||||
* `sbas/usage`: See `CfgSBAS` message for details. Defaults to 0.
|
||||
* `dynamic_model`: Possible values below. Defaults to `portable`. See u-blox documentation for further description.
|
||||
* `portable`
|
||||
* `stationary`
|
||||
* `pedestrian`
|
||||
* `automotive`
|
||||
* `sea`
|
||||
* `airborne1`: Airborne, max acceleration = 1G
|
||||
* `airborne2`: Airborne, max acceleration = 2G
|
||||
* `airborne4`: Airborne, max acceleration = 4G
|
||||
* `wristwatch`
|
||||
* `fix_mode`: Type of fixes supported: `2d`, `3d` or `both`.
|
||||
* `dr_limit`: Max time in seconds to use dead reckoning after signal is lost. Defaults to 0.
|
||||
* `dat`: Configuring the datum type (optional). See the CfgDAT message.
|
||||
* `dat/set`: If true, the node will the datum based on the parameters below (required if true). Defaults to false.
|
||||
* `dat/majA`: Semi-major Axis [m]
|
||||
* `dat/flat`: 1.0 / Flattening
|
||||
* `dat/shift`: [X-axis, Y-axis, Z-axis] shift [m]
|
||||
* `dat/rot`: [X, Y, Z] rotation [s]
|
||||
* `dat/scale`: scale change [ppm]
|
||||
|
||||
### For firmware version 6:
|
||||
* `nmea/set`: If true, the NMEA will be configured with the parameters below.
|
||||
* `nmea/version`: NMEA version. Must be set if `nmea/set` is true.
|
||||
* `nmea/num_sv`: Maximum Number of SVs to report per TalkerId. Must be set if `nmea/set` is true.
|
||||
* `nmea/compat`: Enable compatibility mode. Must be set if `nmea/set` is true.
|
||||
* `nmea/consider`: Enable considering mode. Must be set if `nmea/set` is true.
|
||||
* `nmea/filter`: Namespace for filter flags.
|
||||
* `nmea/filter/pos`: Disable position filtering. Defaults to false.
|
||||
* `nmea/filter/msk_pos`: Disable masked position filtering. Defaults to false.
|
||||
* `nmea/filter/time`: Disable time filtering. Defaults to false.
|
||||
* `nmea/filter/date`: Disable date filtering. Defaults to false.
|
||||
* `nmea/filter/sbas`: Enable SBAS filtering. Defaults to false.
|
||||
* `nmea/filter/track`: Disable track filtering. Defaults to false.
|
||||
|
||||
### For devices with firmware >= 7:
|
||||
* `gnss` parameters:
|
||||
* `gnss/gps`: Enable GPS receiver. Defaults to true.
|
||||
* `gnss/glonass`: Enable GLONASS receiver. Defaults to false.
|
||||
* `gnss/beidou`: Enable BeiDou receiver. Defaults to false.
|
||||
* `gnss/qzss`: Enable QZSS receiver. Defaults to false.
|
||||
* `gnss/qzss_sig_cfg`: QZSS signal configuration. Defaults to L1CA. See `CfgGNSS` message for constants.
|
||||
* `nmea` parameters:
|
||||
* `nmea/set`: If true, the NMEA will be configured.
|
||||
* `nmea/version`: NMEA version. Must be set if `nmea/set` is true.
|
||||
* `nmea/num_sv`: Maximum Number of SVs to report per TalkerId. Must be set if `nmea/set` is true.
|
||||
* `nmea/sv_numbering`: Configures the display of satellites that do not have an NMEA-defined value. Must be set if `nmea/set` is true.
|
||||
* `nmea/compat`: Enable compatibility mode. Must be set if `nmea/set` is true.
|
||||
* `nmea/consider`: Enable considering mode. Must be set if `nmea/set` is true.
|
||||
* `nmea/limit82`: Enable strict limit to 82 characters maximum. Defaults to false.
|
||||
* `nmea/high_prec`: Enable high precision mode. Defaults to false.
|
||||
* `nmea/filter`: Namespace for filter flags.
|
||||
* `nmea/filter/pos`: Enable position output for failed or invalid fixes. Defaults to false.
|
||||
* `nmea/filter/msk_pos`: Enable position output for invalid fixes. Defaults to false.
|
||||
* `nmea/filter/time`: Enable time output for invalid times. Defaults to false.
|
||||
* `nmea/filter/date`: Enable date output for invalid dates. Defaults to false.
|
||||
* `nmea/filter/gps_only`: Restrict output to GPS satellites only. Defaults to false.
|
||||
* `nmea/filter/track`: Enable COG output even if COG is frozen. Defaults to false.
|
||||
* `nmea/gnssToFilt`: Filters out satellites based on their GNSS.
|
||||
* `nmea/gnssToFilt/gps`: Disable reporting of GPS satellites. Defaults to false.
|
||||
* `nmea/gnssToFilt/sbas`: Disable reporting of SBAS satellites. Defaults to false.
|
||||
* `nmea/gnssToFilt/qzss`: Disable reporting of QZSS satellites. Defaults to false.
|
||||
* `nmea/gnssToFilt/glonass`: Disable reporting of GLONASS satellites. Defaults to false.
|
||||
* `nmea/gnssToFilt/beidou`: Disable reporting of BeiDou satellites. Defaults to false.
|
||||
* `nmea/main_talker_id`: This field enables the main Talker ID to be overridden. Defaults to 0.
|
||||
* `nmea/gsv_talker_id`: This field enables the GSV Talker ID to be overridden. Defaults to [0, 0].
|
||||
|
||||
### For devices with firmware >= 8:
|
||||
* `save_on_shutdown`: If true, the node will send a `UBX-UPD-SOS` command to save the BBR to flash memory on shutdown. Defaults to false.
|
||||
* `clear_bbr`: If true, the node will send a `UBX-UPD-SOS` command to clear the flash memory during configuration. Defaults to false.
|
||||
* Additional `gnss` params
|
||||
* `gnss/galileo`: Enable Galileo receiver. Defaults to false.
|
||||
* `gnss/imes`: Enable IMES receiver. Defaults to false.
|
||||
* `nmea/bds_talker_id`: (See other NMEA configuration parameters above) Sets the two characters that should be used for the BeiDou Talker ID.
|
||||
|
||||
### For UDR/ADR devices:
|
||||
* `use_adr`: Enable ADR/UDR. Defaults to true.
|
||||
* `nav_rate` should be set to 1 Hz.
|
||||
|
||||
### For HPG Reference devices:
|
||||
* `tmode3`: Time Mode. Required. See CfgTMODE3 for constants.
|
||||
* `arp/lla_flag`: True if the Fixed position is in Lat, Lon, Alt coordinates. False if ECEF. Required if `tmode3` is set to fixed.
|
||||
* `arp/position`: Antenna Reference Point position in [m] or [deg]. Required if `tmode3` is set to fixed.
|
||||
* `arp/position_hp`: Antenna Reference Point High Precision position in [0.1 mm] or [deg * 1e-9]. Required if tmode3 is set to fixed.
|
||||
* `arp/acc`: Fixed position accuracy in [m]. Required if `tmode3` is set to fixed.
|
||||
* `sv_in/reset`: Whether or not to reset the survey in upon initialization. If false, it will only reset if the TMODE is disabled. Defaults to true.
|
||||
* `sv_in/min_dur`: The minimum Survey-In Duration time in seconds. Required tmode3 is set to survey in.
|
||||
* `sv_in/acc_lim`: The minimum accuracy level of the survey in position in meters. Required `tmode3` is set to survey in.
|
||||
|
||||
### For HPG Rover devices:
|
||||
* `dgnss_mode`: The Differential GNSS mode. Defaults to RTK FIXED. See `CfgDGNSS` message for constants.
|
||||
|
||||
### For FTS & TIM devices:
|
||||
* currently unimplemented. See `FtsProduct` and `TimProduct` classes in `ublox_gps` package `node.h` & `node.cpp` files.
|
||||
|
||||
## Fix Topics
|
||||
|
||||
`~fix`([sensor_msgs/NavSatFix](http://docs.ros.org/api/sensor_msgs/html/msg/NavSatFix.html))
|
||||
|
||||
Navigation Satellite fix.
|
||||
|
||||
`~fix_velocity`([geometry_msgs/TwistWithCovarianceStamped](http://docs.ros.org/jade/api/geometry_msgs/html/msg/TwistWithCovarianceStamped.html))
|
||||
|
||||
Velocity in local ENU frame.
|
||||
|
||||
## INF messages
|
||||
To enable printing INF messages to the ROS console, set the parameters below.
|
||||
* `inf/all`: This is the default value for the INF parameters below, which enable printing u-blox `INF` messages to the ROS console. It defaults to true. Individual message types can be turned off by setting their corresponding parameter to false.
|
||||
* `inf/debug`: Whether to configure the UBX and NMEA ports to send Debug messages and print received `INF-Debug` messages to `ROS_DEBUG` console.
|
||||
* `inf/error`: Whether to enable Error messages for the UBX and NMEA ports and print received `INF-Error` messages to `ROS_ERROR` console.
|
||||
* `inf/notice`: Whether to enable Notice messages for the UBX and NMEA ports and print received `INF-Notice messages to `ROS_INFO` console.
|
||||
* `inf/test`: Whether to enable Test messages for the UBX and NMEA ports and print received `INF-Test` messages to `ROS_INFO` console.
|
||||
* `inf/warning`: Whether to enable Warning messages for the UBX and NMEA ports and print received `INF-Warning` messages to the `ROS_WARN` console.
|
||||
|
||||
## Additional Topics
|
||||
To publish a given u-blox message to a ROS topic, set the parameter shown below to true. The node sets the rate of the u-blox messages to 1 measurement cycle.
|
||||
|
||||
### All messages
|
||||
* `publish/all`: This is the default value for `publish/<class>/all` parameters below. It defaults to false. Individual message classes and messages can be enabled or disabled by setting the parameters described below to false.
|
||||
|
||||
### AID messages
|
||||
* `publish/aid/all`: This is the default value for the `publish/aid/<message>` parameters below. It defaults to `publish/all`. Individual messages can be enabled or disabled by setting the parameters below.
|
||||
* `publish/aid/alm`: Topic `~aidalm`
|
||||
* `publish/aid/eph`: Topic `~aideph`
|
||||
* `publish/aid/hui`: Topic `~aidhui`
|
||||
|
||||
### RXM messages
|
||||
* `publish/rxm/all`: This is the default value for the `publish/rxm/<message>` parameters below. It defaults to `publish/all`. Individual messages can be enabled or disabled by setting the parameters below.
|
||||
* `publish/rxm/alm`: Topic `~rxmalm`
|
||||
* `publish/rxm/eph`: Topic `~rxmeph`
|
||||
* `publish/rxm/raw`: Topic `~rxmraw`. Type is either `RxmRAW` or `RxmRAWX` depending on firmware version.
|
||||
* `publish/rxm/rtcm`: Topic `~rxmrtcm`. **Firmware >= 8 only**
|
||||
* `publish/rxm/sfrb`: Topic `~rxmsfrb`. Type is either `RxmSFRB` or `RxmSFRBX` depending on firmware version.
|
||||
|
||||
### MON messages
|
||||
* `publish/mon/all`: This is the default value for the `publish/mon/<message>` parameters below. It defaults to `publish/all`. Individual messages can be enabled or disabled by setting the parameters below.
|
||||
* `publish/mon/hw`: Topic `~monhw`
|
||||
|
||||
### NAV messages
|
||||
* `publish/nav/all`: This is the default value for the `publish/mon/<message>` parameters below. It defaults to `publish/all`. Individual messages can be enabled or disabled by setting the parameters below.
|
||||
* `publish/nav/att`: Topic `~navatt`. **ADR/UDR devices only**
|
||||
* `publish/nav/clock`: Topic `~navclock`
|
||||
* `publish/nav/posecef`: Topic `~navposecef`
|
||||
* `publish/nav/posllh`: Topic `~navposllh`. **Firmware <= 6 only.** For firmware 7 and above, see NavPVT
|
||||
* `publish/nav/pvt`: Topic `~navpvt`. **Firmware >= 7 only.**
|
||||
* `publish/nav/relposned`: Topic `~navrelposned`. **HPG Rover devices only**
|
||||
* `publish/nav/sat`: Topic `~navsat`
|
||||
* `publish/nav/sol`: Topic `~navsol`. **Firmware <= 6 only.** For firmware 7 and above, see NavPVT
|
||||
* `publish/nav/status`: Topic `~navstatus`
|
||||
* `publish/nav/svin`: Topic `~navsvin`. **HPG Reference Station Devices only**
|
||||
* `publish/nav/svinfo`: Topic `~navsvinfo`
|
||||
* `publish/nav/velned`: Topic `~navvelned`. **Firmware <= 6 only.** For firmware 7 and above, see NavPVT
|
||||
|
||||
### ESF messages
|
||||
* `publish/esf/all`: This is the default value for the `publish/esf/<message>` parameters below. It defaults to `publish/all` for **ADR/UDR devices**. Individual messages can be enabled or disabled by setting the parameters below.
|
||||
* `publish/esf/ins`: Topic `~esfins`
|
||||
* `publish/esf/meas`: Topic `~esfmeas`
|
||||
* `publish/esf/raw`: Topic `~esfraw`
|
||||
* `publish/esf/status`: Topic `~esfstatus`
|
||||
|
||||
### HNR messages
|
||||
* `publish/hnr/pvt`: Topic `~hnrpvt`. **ADR/UDR devices only**
|
||||
|
||||
## Launch
|
||||
|
||||
A sample launch file `ublox_device.launch` loads the parameters from a `.yaml` file in the `ublox_gps/config` folder, sample configuration files are included. The required arguments are `node_name` and `param_file_name`.
|
||||
The two topics to which you should subscribe are `~fix` and `~fix_velocity`. The angular component of `fix_velocity` is unused.
|
||||
|
||||
# Version history
|
||||
|
||||
* **1.1.2**:
|
||||
- BUG FIX for NavSatFix messages for firmware >=7. The NavSatFix now only uses the NavPVT message time if it is valid, otherwise it uses ROS time.
|
||||
- BUG FIX for TMODE3 Fixed mode configuration. The ARP High Precision position is now configured correctly.
|
||||
- BUG FIX for `NavDGPS` message which had the wrong Message ID.
|
||||
- After GNSS configuration & reset, I/O resets automatically, without need for restart.
|
||||
- Added `UBX-UPD` messages. For firmware version 8, the node can now save the flash memory on shutdown and clear the flash memory during configuration based on ROS params.
|
||||
- Added `CfgGPS` message and `MonHW6` message for firmware version 6.
|
||||
- Added respawn parameters to example launch file.
|
||||
- Added parameters to load/save configuration.
|
||||
- Added raw_data parameter for Raw Data Products.
|
||||
- Changed name of "subscribe" parameter namespace to "publish" for clarity.
|
||||
- Migrated all callback handling to `callback.h` from `gps.h` and `gps.cpp`. ACK messages are now processed through callback handlers.
|
||||
- Modified how the I/O stream is initialized so that the node now handles parsing the port string.
|
||||
- Changed class names of Ublox product components (e.g. UbloxTim -> TimProduct) for clarity.
|
||||
- Cleaned up ublox custom serialization classes by adding typedefs and using count to determine repeating block statements instead of using try-catch statements to serialize stream.
|
||||
- Added doxygen documentation
|
||||
* **1.1.1**:
|
||||
- BUG FIX for acknowledgments. The last received ack message was accessed by multiple threads but was not atomic. This variable is now thread safe.
|
||||
- BUG FIX for GNSS configuration for Firmware 8, the GNSS configuration is now verified & modified properly.
|
||||
- BUG FIX for fix diagnostics. NumSV was displaying incorrectly. For firmware versions >=7, the NavPVT flags variable is now compared to the constants from the NavPVT message not NavSOL.
|
||||
- Removed ublox_version param, value is now determined by parsing MonVER.
|
||||
- Organized parameters into namespaces.
|
||||
- Better parameter checking. Checks that unsigned ints and vectors of unsigned ints are in bounds.
|
||||
- Changed rtcm/rate parameter to a vector instead of a scalar, now each RTCM id can be set to a different rate.
|
||||
- Diagnostic variables are displayed more clearly with units included.
|
||||
- For HPG Rovers, added diagnostic updater for Carrier Phase Solution.
|
||||
- Added CfgNMEA messages for each firmware version and a CfgDAT message, as well as parameters to configure the NMEA and Datum.
|
||||
- Added constants for NavSAT_SV flags bit mask.
|
||||
|
||||
* **1.1.0**:
|
||||
- BUG FIX for NAV-PVT messages for firmware 7. The NAV-PVT message is shorter for firmware version 7, the new message is `NavPVT7`
|
||||
- BUG FIX for SBAS configuration, it now configures SBAS only if the device is SBAS capable. Previously, if enable_sbas was set to false, it would not configure, meaning that SBAS could not be turned off.
|
||||
- BUG FIX, the baudrate of the serial I/O port was not configured correctly, on the device it was set to the user desired settings, but on the computer it was always set to 4800.
|
||||
- BUG FIX, Diagnostics for Nav Status are now updated in firmware version 6.
|
||||
- BUG FIX, The method which waited for ACKs now checks if the ACK is from the correct class and message ID.
|
||||
- Added messages for `CfgTMODE3`, `CfgHNR`, `CfgRST`, `CfgINF`, `NavATT`, `ESF` messages, `Inf` message (for all INF types), `HnrPVT`, `MgaGAL`, `NavSAT`, `MonHw`, `NavPVT7` (for firmware version 7).
|
||||
- Restructured Node class so that it now uses composition. The main node contains instances of classes which implement `UBloxInterface`, and calls the methods for each interface added to the node. The classes which implement the interface add new features that are not generic to all firmware versions or products. Each firmware version (6-8) has an interface, and each product category has one (SPG, HPG REF, HPG ROV, TIM, FTS, ADR/UDR). The product type is determined from parsing the `MonVER` message.
|
||||
- Added implementations of `ComponentInterface` called `UbloxHpgRef` and `UbloxHpgRov` for HPG reference station and rover devices. The reference station tmode3 can be configured upon startup (see Options section) and the rover dgnss mode can be set. After survey in, once the reference station entire time mode, the nav_rate is set to the user desired value (it must be 1 Hz during survey-in) and the RTCM output messages are enabled. The state can be monitored through the rqt_runtime_monitor. These classes were tested on C94-M8P devices.
|
||||
- Added an implementation of `ComponentInterface` called `UbloxAdrUdr` for ADR/UDR devices. It which subscribes to `NavATT` and ESF messages and configures useAdr. The diagnostics monitor specific to these devices is not implemented. This class has not been tested on a hardware device.
|
||||
- Added a partial implementation of `UbloxTim` for TIM devices which subscribes to `RxmRAWX` and `RxmSFRBX` messages. The `getRosParams()`, `configureUblox()`, and `initializeDiagnostics()` methods are unimplemented.
|
||||
- Added a skeleton class for `UbloxFts` for FTS devices which is unimplemented. See the `ublox_gps` `node.cpp` and `node.h` files.
|
||||
- Changed how GNSS is configured in firmware version 8. The documentation recommends a cold restart after reconfiguring the GNSS, and will reset the device if it receives a `CfgGNSS` message, even if the settings do not change. For firmware version 8, before reconfiguring, the node first checks if the current GNSS settings are the same as the desired settings. If so, it will not send a CfgGNSS message to the device. After reconfiguring, it will cold reset the GNSS.
|
||||
- Migrated I/O initialization to the `Gps` class from the `Node` class.
|
||||
- INF messages are now printed to the ROS console.
|
||||
- Changed how debug statements are displayed. If the debug parameter is set to 1 or greater, it prints debug messages.
|
||||
|
||||
* **1.0.0**:
|
||||
- Added messages for firmware 8: `NavPVT`, `RxmRAWX`, `RxmSFRBX`.
|
||||
- Modified ConfigGNSS and MonVER to include repeated blocks and added
|
||||
ConfigGNSS_Block (configures all GNSS at once) and MonVER_Extension
|
||||
(for MonVER_Char blocks).
|
||||
- MonVER info is now published upon initialization.
|
||||
- Fixed SBAS crashing issue (node crashed if device didn't have SBAS
|
||||
capabilities)
|
||||
- Modified remaining messages to update to firmware 8
|
||||
- Added `UbloxNode` abstract class which does all previous node functions which
|
||||
are the same for all firmware versions. Added subclasses which do functions
|
||||
specific to a given firmware version (e.g. subscribing to NavPVT messages).
|
||||
- Added a read lock to AsyncWorker
|
||||
- Removed hard-coded values from `Gps` and `Node` classes specific to a certain
|
||||
device and changed them to configurable parameters. Modified example
|
||||
launch file accordingly.
|
||||
- Added example parameter yaml files and launch file to load parameters from
|
||||
this file.
|
||||
- Moved implementations of Callback functions into `callback.h` (from `gps.h`
|
||||
and `gps.cpp`)
|
||||
- Updated formatting of some files per google style guide spec (e.g. 80 chars
|
||||
per line).
|
||||
|
||||
* **0.0.5**:
|
||||
- Reformat files under `ublox_gps`
|
||||
|
||||
* **0.0.4**:
|
||||
- Added install targets.
|
||||
|
||||
* **0.0.3**:
|
||||
- Added the `enable_glonass`, `enable_beidou` and `enable_ppp` options.
|
||||
- Added the `ublox_version` option. Consult known issues for important details.
|
||||
- Added `numSVs` field to the RQT monitor.
|
||||
|
||||
* **0.0.2**:
|
||||
- Changed `meas_rate` to simply `rate`, which is in Hz. `meas_rate` is computed automatically.
|
||||
|
||||
* **0.0.1**:
|
||||
- All topics are now published on a private node handle.
|
||||
- Velocities are published as stamped twist messages with covariance. Angular components are unused.
|
||||
- `hAcc`, `vAcc` and `sAcc` are used to generate diagonal covariances.
|
||||
- Velocities use the correct convention: X-Y-Z = East-North-Up.
|
||||
- 2D **or** 3D fix correspond to `STATUS_FIX` (previously only 3D).
|
||||
- `fix` and `fix_velocity` are time-stamped synchronously, using the `iTOW` to check arrival times.
|
||||
- Added options for changing the CFG-NAV5 settings (see above).
|
||||
- Added support for `diagnostic_updater`.
|
||||
- _"received ACK"_ messages are elevated to debug level 2.
|
||||
- Corrected issue where baudrate was not set correctly using rosparam.
|
||||
- Corrected issue where socket destructors were not called.
|
||||
|
||||
* **0.0.0**:
|
||||
- Forked from https://github.com/tu-darmstadt-ros-pkg/ublox
|
||||
- Updated to use catkin.
|
||||
|
||||
# Adding new features
|
||||
## Adding new messages
|
||||
1. Create the .msg file and add it to `ublox_msgs/msg`. Make sure the file includes the constants `CLASS_ID` and `MESSAGE_ID`.
|
||||
|
||||
2. Modify `ublox_msgs/include/ublox_msgs/ublox_msgs.h`.
|
||||
a. Include the message header.
|
||||
b. Make sure the message's class constant is declared in the `ublox_msgs::Class` namespace.
|
||||
c. Declare the message's ID constant in the `ublox_messages::Message::<CLASS_NAME>` namespace.
|
||||
|
||||
3. Declare the message in `ublox_msgs/src/ublox_msgs.cpp`.
|
||||
|
||||
4. If the message has a repeated or optional block of varying size, create an additional message for the repeating block and include it in the message.
|
||||
a. Include the block message in the `ublox_msgs/include/ublox_msgs/ublox_msgs.h` file.
|
||||
b. Modify `ublox_msgs/include/ublox/serialization/ublox_msgs.h` and add a custom `Serializer`. If the message doesn't include the number of repeating/optional blocks as a parameter, you can infer it from the count/size of the message, which is the length of the payload.
|
||||
|
||||
5. Modify `ublox_gps/src/node.cpp` (and the header file if necessary) to either subscribe to the message or send the configuration message. Be sure to modify the appropriate subscribe function. For messages which apply to all firmware/hardware, modify `UbloxNode::subscribe()`. Otherwise modify the appropriate firmware or hardware's subscribe function, e.g. `UbloxFirmware8::subscribe()`, `HpgRovProduct::subscribe()`. If the message is a configuration message, consider modifying `ublox_gps/src/gps.cpp` (and the header file) to add a configuration function.
|
||||
|
||||
### One message protocol for multiple IDs (e.g. INF message)
|
||||
If a given message protocol applies to multiple message IDs (e.g. the `Inf` message), do not include the message ID in the message itself.
|
||||
When declaring the message, for the first declaration, use `DECLARE_UBLOX_MESSAGE` macro. For the following declarations use the `DECLARE_UBLOX_MESSAGE_ID` macro.
|
||||
|
||||
## Adding device / firmware specific functionality
|
||||
|
||||
The `node.cpp` file in `ublox_gps` contains a main Node class called UbloxNode which acts as the ROS Node and handles the node initialization, publishers, and diagnostics. `UbloxNode` contains a vector `components_` of instances of `ComponentInterface`. The `UbloxNode::initialize()` calls each component's public interface methods. The node contains components for both the firmware version and the product category, which are added after parsing the `MonVER` message. Any class which implements `ComponentInterface` can be added to the `UbloxNode` `components_` vector and its methods will be called by `UbloxNode`. Simply add an implementation of `ComponentInterface` to the ublox_gps `node.h` and `node.cpp` files. Behavior specific to a given firmware or product should not be implemented in the `UbloxNode` class and instead should be implemented in an implementation of `ComponentInterface`.
|
||||
|
||||
Currently there are implementations of `ComponentInterface` for firmware versions 6-8 and product categories `HpgRefProduct`, `HpgRovProduct`, `AdrUdrProduct`, `TimProduct`, `FtsProduct`. SPG products do not have their own implementation of `ComponentInterface`, since the Firmware classes implement all of the behavior of SPG devices.
|
||||
|
||||
`HpgRefProduct` and `HpgRovProduct` have been tested on the C94-M8P device.
|
||||
|
||||
## Adding new parameters
|
||||
1. Modify the `getRosParams()` method in the appropriate implementation of ComponentInterface (e.g. UbloxNode, UbloxFirmware8, HpgRefProduct, etc.) and get the parameter. Group multiple related parameters into a namespace. Use all lower case names for parameters and namespaces separated with underscores.
|
||||
* If the type is an unsigned integer (of any size) or vector of unsigned integers, use the `ublox_node::getRosUint` method which will verify the bounds of the parameter.
|
||||
* If the type is an int8 or int16 or vector of int8's or int16's, use the `ublox_nod::getRosInt` method which will verify the bounds of the parameter. (This method can also be used for int32's but ROS has methods to get int32 parameters as well).
|
||||
2. If the parameter is used during configuration also modify the `ComponentInterface`'s `configureUblox()` method to send the appropriate configuration message. Do not send configuration messages in `getRosParams()`.
|
||||
3. Modify this README file and add the parameter name and description in the appropriate section. State whether there is a default value or if the parameter is required.
|
||||
4. Modify one of the sample `.yaml` configuration files in `ublox_gps/config` to include the parameter or add a new sample `.yaml` for your device.
|
||||
|
||||
# Known Issues
|
||||
|
||||
## Unimplemented / Untested Devices
|
||||
|
||||
`TimProduct` and `FtsProduct` are currently unimplemented skeleton classes. `AdrUdrProduct` is implemented, with the exception of `initializeRosDiagnostics()` and has not been tested on hardware.
|
||||
|
||||
`UbloxFirmware7` has not been properly tested on a device with firmware version 7. `UbloxFirmware6` has been tested on a device with firmware version 8, but not with firmware version 6.
|
||||
|
||||
## Debugging
|
||||
|
||||
For debugging messages set the debug parameter to > 0. The range for debug is 0-4. At level 1 it prints configuration messages and checksum errors, at level 2 it also prints ACK/NACK messages and sent messages. At level 3 it prints the received bytes being decoded by a specific message reader. At level 4 it prints the incoming buffer before it is split by message header.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
1. Why can't the ublox_gps node open my device, even though I have correctly specified the path in `/dev`?
|
||||
* Make sure you are the owner of the device, or a member of `dialout` group.
|
||||
|
||||
# Links
|
||||
Consult the [official protocol spec](https://www.u-blox.com/sites/default/files/products/documents/u-blox8-M8_ReceiverDescrProtSpec_(UBX-13003221)_Public.pdf) for details on packets supported by u-blox devices.
|
||||
@@ -1,4 +0,0 @@
|
||||
cmake_minimum_required(VERSION 2.8.3)
|
||||
project(ublox)
|
||||
find_package(catkin REQUIRED)
|
||||
catkin_metapackage()
|
||||
@@ -1,19 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package>
|
||||
<name>ublox</name>
|
||||
<version>1.1.2</version>
|
||||
<description>Provides a ublox_gps node for u-blox GPS receivers, messages, and serialization packages for the binary UBX protocol.</description>
|
||||
<author>Johannes Meyer</author>
|
||||
<maintainer email="vmlane@alum.mit.edu">Veronica Lane</maintainer>
|
||||
<license>BSD</license>
|
||||
|
||||
<buildtool_depend>catkin</buildtool_depend>
|
||||
<url>http://wiki.ros.org/ublox</url>
|
||||
|
||||
<!-- The export tag contains other, unspecified, tags -->
|
||||
<export>
|
||||
<rosdoc external="http://www.u-blox.com/en/product-resources"/>
|
||||
<!-- You can specify that this package is a metapackage here: -->
|
||||
<metapackage />
|
||||
</export>
|
||||
</package>
|
||||
@@ -1,61 +0,0 @@
|
||||
cmake_minimum_required(VERSION 2.8.3)
|
||||
project(ublox_gps)
|
||||
find_package(catkin REQUIRED COMPONENTS
|
||||
roscpp
|
||||
roscpp_serialization
|
||||
ublox_msgs
|
||||
ublox_serialization
|
||||
diagnostic_updater
|
||||
)
|
||||
|
||||
catkin_package(
|
||||
INCLUDE_DIRS include
|
||||
LIBRARIES ${PROJECT_NAME}
|
||||
CATKIN_DEPENDS roscpp ublox_msgs ublox_serialization)
|
||||
|
||||
# include boost
|
||||
find_package(Boost REQUIRED COMPONENTS system regex thread)
|
||||
link_directories(${Boost_LIBRARY_DIR})
|
||||
include_directories(${Boost_INCLUDE_DIR})
|
||||
|
||||
# include other ublox packages
|
||||
include_directories(${PROJECT_SOURCE_DIR}/include)
|
||||
include_directories(${catkin_INCLUDE_DIRS})
|
||||
|
||||
# link pthread
|
||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
|
||||
|
||||
# build library
|
||||
add_library(ublox_gps src/gps.cpp)
|
||||
|
||||
# fix msg compile order bug
|
||||
add_dependencies(ublox_gps ${catkin_EXPORTED_TARGETS})
|
||||
|
||||
target_link_libraries(ublox_gps
|
||||
boost_system
|
||||
boost_regex
|
||||
boost_thread
|
||||
)
|
||||
|
||||
target_link_libraries(ublox_gps
|
||||
${catkin_LIBRARIES}
|
||||
)
|
||||
|
||||
# build node
|
||||
add_executable(ublox_gps_node src/node.cpp src/mkgmtime.c)
|
||||
set_target_properties(ublox_gps_node PROPERTIES OUTPUT_NAME ublox_gps)
|
||||
|
||||
target_link_libraries(ublox_gps_node boost_system boost_regex boost_thread)
|
||||
target_link_libraries(ublox_gps_node ${catkin_LIBRARIES})
|
||||
target_link_libraries(ublox_gps_node ublox_gps)
|
||||
|
||||
install(TARGETS ublox_gps ublox_gps_node
|
||||
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||
)
|
||||
|
||||
install(DIRECTORY include/${PROJECT_NAME}/
|
||||
DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
|
||||
PATTERN ".svn" EXCLUDE
|
||||
)
|
||||
@@ -1,72 +0,0 @@
|
||||
# Configuration Settings for C94-M8P device
|
||||
|
||||
debug: 1 # Range 0-4 (0 means no debug statements will print)
|
||||
|
||||
save:
|
||||
mask: 3103 # Save I/O, Message, INF Message, Nav, Receiver
|
||||
# Manager, Antenna, and Logging Configuration
|
||||
device: 4 # Save to EEPROM
|
||||
|
||||
device: /dev/ttyACM0
|
||||
frame_id: gps_base
|
||||
dynamic_model: stationary # Velocity restricted to 0 m/s. Zero dynamics
|
||||
# assumed.
|
||||
fix_mode: auto
|
||||
dr_limit: 0
|
||||
enable_ppp: false # Not supported by C94-M8P
|
||||
|
||||
rate: 4 # Measurement rate in Hz
|
||||
nav_rate: 4 # in number of measurement cycles
|
||||
|
||||
uart1:
|
||||
baudrate: 19200 # C94-M8P specific
|
||||
in: 0 # No UART in for base
|
||||
out: 32 # RTCM 3
|
||||
|
||||
# TMODE3 Config
|
||||
tmode3: 1 # Survey-In Mode
|
||||
sv_in:
|
||||
reset: false # True: disables and re-enables survey-in (resets)
|
||||
# False: Disables survey-in only if TMODE3 is
|
||||
# disabled
|
||||
min_dur: 300 # Survey-In Minimum Duration [s]
|
||||
acc_lim: 3.0 # Survey-In Accuracy Limit [m]
|
||||
|
||||
# RTCM out config
|
||||
rtcm:
|
||||
ids: [5, 87, 77, 230] # RTCM Messages to configure for Base station
|
||||
# Enabled: GPS MSM7, GLONASS MSM7,
|
||||
# GLONASS CP bias, Stationary RTK ref
|
||||
# 0xF5 0x05 Stationary RTK reference station
|
||||
# ARP
|
||||
# 0xF5 0x4A GPS MSM4
|
||||
# 0xF5 0x4D GPS MSM7
|
||||
# 0xF5 0x54 GLONASS MSM4
|
||||
# 0xF5 0x57 GLONASS MSM7
|
||||
# 0xF5 0x7C BeiDou MSM4
|
||||
# 0xF5 0x7F BeiDou MSM7
|
||||
# 0xF5 0xE6 GLONASS code-phase biases
|
||||
# 0xF5 0xFE Reference station PVT
|
||||
#(u-blox proprietary RTCM Message)
|
||||
rates: [1, 1, 1, 10] # in number of navigation solutions, must match
|
||||
# nav_rate, except for 0xE6
|
||||
|
||||
dat:
|
||||
set: false
|
||||
|
||||
# GNSS Config
|
||||
gnss:
|
||||
glonass: true # Supported by C94-M8P
|
||||
beidou: false # Supported by C94-M8P
|
||||
qzss: false # Supported by C94-M8P
|
||||
|
||||
inf:
|
||||
all: true # Whether to display all INF messages in console
|
||||
|
||||
# Enable u-blox message publishers
|
||||
publish:
|
||||
all: true
|
||||
aid:
|
||||
hui: false
|
||||
nav:
|
||||
posecef: false
|
||||
@@ -1,46 +0,0 @@
|
||||
# Configuration Settings for C94-M8P device
|
||||
|
||||
debug: 1 # Range 0-4 (0 means no debug statements will print)
|
||||
|
||||
save:
|
||||
mask: 3103 # Save I/O, Message, INF Message, Nav, Receiver
|
||||
# Manager, Antenna, and Logging Configuration
|
||||
device: 4 # Save to EEPROM
|
||||
|
||||
device: /dev/ttyACM1
|
||||
frame_id: gps
|
||||
rate: 4 # in Hz
|
||||
nav_rate: 4 # [# of measurement cycles], recommended 1 Hz, may
|
||||
# be either 5 Hz (Dual constellation) or
|
||||
# 8 Hz (GPS only)
|
||||
dynamic_model: airborne2 # Airborne < 2G, 2D fix not supported (3D only),
|
||||
# Max Alt: 50km
|
||||
# Max Horizontal Velocity: 250 m/s,
|
||||
# Max Vertical Velocity: 100 m/s
|
||||
fix_mode: auto
|
||||
enable_ppp: false # Not supported by C94-M8P
|
||||
dr_limit: 0
|
||||
|
||||
uart1:
|
||||
baudrate: 19200 # C94-M8P specific
|
||||
in: 32 # RTCM 3
|
||||
out: 0 # No UART out for rover
|
||||
|
||||
gnss:
|
||||
glonass: true # Supported by C94-M8P
|
||||
beidou: false # Supported by C94-M8P
|
||||
qzss: false # Supported by C94-M8P
|
||||
|
||||
dgnss_mode: 3 # Fixed mode
|
||||
|
||||
inf:
|
||||
all: true # Whether to display all INF messages in console
|
||||
|
||||
# Enable u-blox message publishers
|
||||
publish:
|
||||
all: true
|
||||
aid:
|
||||
hui: false
|
||||
|
||||
nav:
|
||||
posecef: false
|
||||
@@ -1,46 +0,0 @@
|
||||
# Configuration Settings for C94-M8P device
|
||||
|
||||
debug: 1 # Range 0-4 (0 means no debug statements will print)
|
||||
|
||||
save:
|
||||
mask: 3103 # Save I/O, Message, INF Message, Nav, Receiver
|
||||
# Manager, Antenna, and Logging Configuration
|
||||
device: 4 # Save to EEPROM
|
||||
|
||||
device: /dev/ttyUSB3
|
||||
frame_id: gps
|
||||
rate: 4 # in Hz
|
||||
nav_rate: 4 # [# of measurement cycles], recommended 1 Hz, may
|
||||
# be either 5 Hz (Dual constellation) or
|
||||
# 8 Hz (GPS only)
|
||||
dynamic_model: airborne2 # Airborne < 2G, 2D fix not supported (3D only),
|
||||
# Max Alt: 50km
|
||||
# Max Horizontal Velocity: 250 m/s,
|
||||
# Max Vertical Velocity: 100 m/s
|
||||
fix_mode: auto
|
||||
enable_ppp: false # Not supported by C94-M8P
|
||||
dr_limit: 0
|
||||
|
||||
uart1:
|
||||
baudrate: 9600 # C94-M8P specific
|
||||
in: 32 # RTCM 3
|
||||
out: 0 # No UART out for rover
|
||||
|
||||
gnss:
|
||||
glonass: true # Supported by C94-M8P
|
||||
beidou: false # Supported by C94-M8P
|
||||
qzss: false # Supported by C94-M8P
|
||||
|
||||
dgnss_mode: 3 # Fixed mode
|
||||
|
||||
inf:
|
||||
all: true # Whether to display all INF messages in console
|
||||
|
||||
# Enable u-blox message publishers
|
||||
publish:
|
||||
all: true
|
||||
aid:
|
||||
hui: false
|
||||
|
||||
nav:
|
||||
posecef: false
|
||||
@@ -1,31 +0,0 @@
|
||||
# Sample NMEA parameter configuration
|
||||
device: /dev/rover/ttyGPS
|
||||
|
||||
uart1:
|
||||
baudrate: 9600 # C94-M8P specific
|
||||
|
||||
nmea:
|
||||
set: true
|
||||
version: 65
|
||||
num_sv: 8
|
||||
sv_numbering: 1
|
||||
compat: true
|
||||
consider: true
|
||||
limit82: true
|
||||
high_prec: false
|
||||
filter:
|
||||
pos: true
|
||||
msk_pos: true
|
||||
time: true
|
||||
date: true
|
||||
gps_only: true
|
||||
track: true
|
||||
gnssToFilter:
|
||||
gps: false
|
||||
sbas: true
|
||||
qzss: true
|
||||
glonass: false
|
||||
beidou: true
|
||||
main_talker_id: 1
|
||||
gsv_talker_id: 1
|
||||
bds_talker_id: [0,0]
|
||||
@@ -1,258 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#ifndef UBLOX_GPS_ASYNC_WORKER_H
|
||||
#define UBLOX_GPS_ASYNC_WORKER_H
|
||||
|
||||
#include <ublox_gps/gps.h>
|
||||
|
||||
#include <boost/asio.hpp>
|
||||
#include <boost/bind.hpp>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/thread/condition.hpp>
|
||||
|
||||
|
||||
#include "worker.h"
|
||||
|
||||
namespace ublox_gps {
|
||||
|
||||
int debug; //!< Used to determine which debug messages to display
|
||||
|
||||
/**
|
||||
* @brief Handles Asynchronous I/O reading and writing.
|
||||
*/
|
||||
template <typename StreamT>
|
||||
class AsyncWorker : public Worker {
|
||||
public:
|
||||
typedef boost::mutex Mutex;
|
||||
typedef boost::mutex::scoped_lock ScopedLock;
|
||||
|
||||
/**
|
||||
* @brief Construct an Asynchronous I/O worker.
|
||||
* @param stream the stream for th I/O service
|
||||
* @param io_service the I/O service
|
||||
* @param buffer_size the size of the input and output buffers
|
||||
*/
|
||||
AsyncWorker(boost::shared_ptr<StreamT> stream,
|
||||
boost::shared_ptr<boost::asio::io_service> io_service,
|
||||
std::size_t buffer_size = 8192);
|
||||
virtual ~AsyncWorker();
|
||||
|
||||
/**
|
||||
* @brief Set the callback function which handles input messages.
|
||||
* @param callback the read callback which handles received messages
|
||||
*/
|
||||
void setCallback(const Callback& callback) { read_callback_ = callback; }
|
||||
|
||||
/**
|
||||
* @brief Send the data bytes via the I/O stream.
|
||||
* @param data the buffer of data bytes to send
|
||||
* @param size the size of the buffer
|
||||
*/
|
||||
bool send(const unsigned char* data, const unsigned int size);
|
||||
/**
|
||||
* @brief Wait for incoming messages.
|
||||
* @param timeout the maximum time to wait
|
||||
*/
|
||||
void wait(const boost::posix_time::time_duration& timeout);
|
||||
|
||||
bool isOpen() const { return stream_->is_open(); }
|
||||
|
||||
protected:
|
||||
/**
|
||||
* @brief Read the input stream.
|
||||
*/
|
||||
void doRead();
|
||||
|
||||
/**
|
||||
* @brief Process messages read from the input stream.
|
||||
* @param error_code an error code for read failures
|
||||
* @param the number of bytes received
|
||||
*/
|
||||
void readEnd(const boost::system::error_code&, std::size_t);
|
||||
|
||||
/**
|
||||
* @brief Send all the data in the output buffer.
|
||||
*/
|
||||
void doWrite();
|
||||
|
||||
/**
|
||||
* @brief Close the I/O stream.
|
||||
*/
|
||||
void doClose();
|
||||
|
||||
boost::shared_ptr<StreamT> stream_; //!< The I/O stream
|
||||
boost::shared_ptr<boost::asio::io_service> io_service_; //!< The I/O service
|
||||
|
||||
Mutex read_mutex_; //!< Lock for the input buffer
|
||||
boost::condition read_condition_;
|
||||
std::vector<unsigned char> in_; //!< The input buffer
|
||||
std::size_t in_buffer_size_; //!< number of bytes currently in the input
|
||||
//!< buffer
|
||||
|
||||
Mutex write_mutex_; //!< Lock for the output buffer
|
||||
boost::condition write_condition_;
|
||||
std::vector<unsigned char> out_; //!< The output buffer
|
||||
|
||||
boost::shared_ptr<boost::thread> background_thread_; //!< thread for the I/O
|
||||
//!< service
|
||||
Callback read_callback_; //!< Callback function to handle received messages
|
||||
|
||||
bool stopping_; //!< Whether or not the I/O service is closed
|
||||
};
|
||||
|
||||
template <typename StreamT>
|
||||
AsyncWorker<StreamT>::AsyncWorker(boost::shared_ptr<StreamT> stream,
|
||||
boost::shared_ptr<boost::asio::io_service> io_service,
|
||||
std::size_t buffer_size)
|
||||
: stopping_(false) {
|
||||
stream_ = stream;
|
||||
io_service_ = io_service;
|
||||
in_.resize(buffer_size);
|
||||
in_buffer_size_ = 0;
|
||||
|
||||
out_.reserve(buffer_size);
|
||||
|
||||
io_service_->post(boost::bind(&AsyncWorker<StreamT>::doRead, this));
|
||||
background_thread_.reset(new boost::thread(
|
||||
boost::bind(&boost::asio::io_service::run, io_service_)));
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
AsyncWorker<StreamT>::~AsyncWorker() {
|
||||
io_service_->post(boost::bind(&AsyncWorker<StreamT>::doClose, this));
|
||||
background_thread_->join();
|
||||
//io_service_->reset();
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
bool AsyncWorker<StreamT>::send(const unsigned char* data,
|
||||
const unsigned int size) {
|
||||
ScopedLock lock(write_mutex_);
|
||||
if(size == 0) {
|
||||
ROS_ERROR("Ublox AsyncWorker::send: Size of message to send is 0");
|
||||
return true;
|
||||
}
|
||||
|
||||
if (out_.capacity() - out_.size() < size) {
|
||||
ROS_ERROR("Ublox AsyncWorker::send: Output buffer too full to send message");
|
||||
return false;
|
||||
}
|
||||
out_.insert(out_.end(), data, data + size);
|
||||
|
||||
io_service_->post(boost::bind(&AsyncWorker<StreamT>::doWrite, this));
|
||||
return true;
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
void AsyncWorker<StreamT>::doWrite() {
|
||||
ScopedLock lock(write_mutex_);
|
||||
// Do nothing if out buffer is empty
|
||||
if (out_.size() == 0) {
|
||||
return;
|
||||
}
|
||||
// Write all the data in the out buffer
|
||||
boost::asio::write(*stream_, boost::asio::buffer(out_.data(), out_.size()));
|
||||
|
||||
if (debug >= 2) {
|
||||
// Print the data that was sent
|
||||
std::ostringstream oss;
|
||||
for (std::vector<unsigned char>::iterator it = out_.begin();
|
||||
it != out_.end(); ++it)
|
||||
oss << boost::format("%02x") % static_cast<unsigned int>(*it) << " ";
|
||||
ROS_DEBUG("U-Blox sent %li bytes: \n%s", out_.size(), oss.str().c_str());
|
||||
}
|
||||
// Clear the buffer & unlock
|
||||
out_.clear();
|
||||
write_condition_.notify_all();
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
void AsyncWorker<StreamT>::doRead() {
|
||||
ScopedLock lock(read_mutex_);
|
||||
stream_->async_read_some(
|
||||
boost::asio::buffer(in_.data() + in_buffer_size_,
|
||||
in_.size() - in_buffer_size_),
|
||||
boost::bind(&AsyncWorker<StreamT>::readEnd, this,
|
||||
boost::asio::placeholders::error,
|
||||
boost::asio::placeholders::bytes_transferred));
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
void AsyncWorker<StreamT>::readEnd(const boost::system::error_code& error,
|
||||
std::size_t bytes_transfered) {
|
||||
ScopedLock lock(read_mutex_);
|
||||
if (error) {
|
||||
ROS_ERROR("U-Blox ASIO input buffer read error: %s, %li",
|
||||
error.message().c_str(),
|
||||
bytes_transfered);
|
||||
} else if (bytes_transfered > 0) {
|
||||
in_buffer_size_ += bytes_transfered;
|
||||
|
||||
if (debug >= 4) {
|
||||
std::ostringstream oss;
|
||||
for (std::vector<unsigned char>::iterator it =
|
||||
in_.begin() + in_buffer_size_ - bytes_transfered;
|
||||
it != in_.begin() + in_buffer_size_; ++it)
|
||||
oss << boost::format("%02x") % static_cast<unsigned int>(*it) << " ";
|
||||
ROS_DEBUG("U-Blox received %li bytes \n%s", bytes_transfered,
|
||||
oss.str().c_str());
|
||||
}
|
||||
|
||||
if (read_callback_)
|
||||
read_callback_(in_.data(), in_buffer_size_);
|
||||
|
||||
read_condition_.notify_all();
|
||||
}
|
||||
|
||||
if (!stopping_)
|
||||
io_service_->post(boost::bind(&AsyncWorker<StreamT>::doRead, this));
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
void AsyncWorker<StreamT>::doClose() {
|
||||
ScopedLock lock(read_mutex_);
|
||||
stopping_ = true;
|
||||
boost::system::error_code error;
|
||||
stream_->close(error);
|
||||
if(error)
|
||||
ROS_ERROR_STREAM(
|
||||
"Error while closing the AsyncWorker stream: " << error.message());
|
||||
}
|
||||
|
||||
template <typename StreamT>
|
||||
void AsyncWorker<StreamT>::wait(
|
||||
const boost::posix_time::time_duration& timeout) {
|
||||
ScopedLock lock(read_mutex_);
|
||||
read_condition_.timed_wait(lock, timeout);
|
||||
}
|
||||
|
||||
} // namespace ublox_gps
|
||||
|
||||
#endif // UBLOX_GPS_ASYNC_WORKER_H
|
||||
@@ -1,238 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#ifndef UBLOX_GPS_CALLBACK_H
|
||||
#define UBLOX_GPS_CALLBACK_H
|
||||
|
||||
#include <ros/console.h>
|
||||
#include <ublox/serialization/ublox_msgs.h>
|
||||
#include <boost/format.hpp>
|
||||
#include <boost/function.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
namespace ublox_gps {
|
||||
|
||||
/**
|
||||
* @brief A callback handler for a u-blox message.
|
||||
*/
|
||||
class CallbackHandler {
|
||||
public:
|
||||
/**
|
||||
* @brief Decode the u-blox message.
|
||||
*/
|
||||
virtual void handle(ublox::Reader& reader) = 0;
|
||||
|
||||
/**
|
||||
* @brief Wait for on the condition.
|
||||
*/
|
||||
bool wait(const boost::posix_time::time_duration& timeout) {
|
||||
boost::mutex::scoped_lock lock(mutex_);
|
||||
return condition_.timed_wait(lock, timeout);
|
||||
}
|
||||
|
||||
protected:
|
||||
boost::mutex mutex_; //!< Lock for the handler
|
||||
boost::condition_variable condition_; //!< Condition for the handler lock
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief A callback handler for a u-blox message.
|
||||
* @typedef T the message type
|
||||
*/
|
||||
template <typename T>
|
||||
class CallbackHandler_ : public CallbackHandler {
|
||||
public:
|
||||
typedef boost::function<void(const T&)> Callback; //!< A callback function
|
||||
|
||||
/**
|
||||
* @brief Initialize the Callback Handler with a callback function
|
||||
* @param func a callback function for the message, defaults to none
|
||||
*/
|
||||
CallbackHandler_(const Callback& func = Callback()) : func_(func) {}
|
||||
|
||||
/**
|
||||
* @brief Get the last received message.
|
||||
*/
|
||||
virtual const T& get() { return message_; }
|
||||
|
||||
/**
|
||||
* @brief Decode the U-Blox message & call the callback function if it exists.
|
||||
* @param reader a reader to decode the message buffer
|
||||
*/
|
||||
void handle(ublox::Reader& reader) {
|
||||
boost::mutex::scoped_lock(mutex_);
|
||||
try {
|
||||
if (!reader.read<T>(message_)) {
|
||||
ROS_DEBUG_COND(debug >= 2,
|
||||
"U-Blox Decoder error for 0x%02x / 0x%02x (%d bytes)",
|
||||
static_cast<unsigned int>(reader.classId()),
|
||||
static_cast<unsigned int>(reader.messageId()),
|
||||
reader.length());
|
||||
condition_.notify_all();
|
||||
return;
|
||||
}
|
||||
} catch (std::runtime_error& e) {
|
||||
ROS_DEBUG_COND(debug >= 2,
|
||||
"U-Blox Decoder error for 0x%02x / 0x%02x (%d bytes)",
|
||||
static_cast<unsigned int>(reader.classId()),
|
||||
static_cast<unsigned int>(reader.messageId()),
|
||||
reader.length());
|
||||
condition_.notify_all();
|
||||
return;
|
||||
}
|
||||
|
||||
if (func_) func_(message_);
|
||||
condition_.notify_all();
|
||||
}
|
||||
|
||||
private:
|
||||
Callback func_; //!< the callback function to handle the message
|
||||
T message_; //!< The last received message
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Callback handlers for incoming u-blox messages.
|
||||
*/
|
||||
class CallbackHandlers {
|
||||
public:
|
||||
/**
|
||||
* @brief Add a callback handler for the given message type.
|
||||
* @param callback the callback handler for the message
|
||||
* @typedef.a ublox_msgs message with CLASS_ID and MESSAGE_ID constants
|
||||
*/
|
||||
template <typename T>
|
||||
void insert(typename CallbackHandler_<T>::Callback callback) {
|
||||
boost::mutex::scoped_lock lock(callback_mutex_);
|
||||
CallbackHandler_<T>* handler = new CallbackHandler_<T>(callback);
|
||||
callbacks_.insert(
|
||||
std::make_pair(std::make_pair(T::CLASS_ID, T::MESSAGE_ID),
|
||||
boost::shared_ptr<CallbackHandler>(handler)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Add a callback handler for the given message type and ID. This is
|
||||
* used for messages in which have the same structure (and therefore msg file)
|
||||
* and same class ID but different message IDs. (e.g. INF, ACK)
|
||||
* @param callback the callback handler for the message
|
||||
* @param message_id the ID of the message
|
||||
* @typedef.a ublox_msgs message with a CLASS_ID constant
|
||||
*/
|
||||
template <typename T>
|
||||
void insert(
|
||||
typename CallbackHandler_<T>::Callback callback,
|
||||
unsigned int message_id) {
|
||||
boost::mutex::scoped_lock lock(callback_mutex_);
|
||||
CallbackHandler_<T>* handler = new CallbackHandler_<T>(callback);
|
||||
callbacks_.insert(
|
||||
std::make_pair(std::make_pair(T::CLASS_ID, message_id),
|
||||
boost::shared_ptr<CallbackHandler>(handler)));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Calls the callback handler for the message in the reader.
|
||||
* @param reader a reader containing a u-blox message
|
||||
*/
|
||||
void handle(ublox::Reader& reader) {
|
||||
// Find the callback handlers for the message & decode it
|
||||
boost::mutex::scoped_lock lock(callback_mutex_);
|
||||
Callbacks::key_type key =
|
||||
std::make_pair(reader.classId(), reader.messageId());
|
||||
for (Callbacks::iterator callback = callbacks_.lower_bound(key);
|
||||
callback != callbacks_.upper_bound(key); ++callback)
|
||||
callback->second->handle(reader);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read a u-blox message of the given type.
|
||||
* @param message the received u-blox message
|
||||
* @param timeout the amount of time to wait for the desired message
|
||||
*/
|
||||
template <typename T>
|
||||
bool read(T& message, const boost::posix_time::time_duration& timeout) {
|
||||
bool result = false;
|
||||
// Create a callback handler for this message
|
||||
callback_mutex_.lock();
|
||||
CallbackHandler_<T>* handler = new CallbackHandler_<T>();
|
||||
Callbacks::iterator callback = callbacks_.insert(
|
||||
(std::make_pair(std::make_pair(T::CLASS_ID, T::MESSAGE_ID),
|
||||
boost::shared_ptr<CallbackHandler>(handler))));
|
||||
callback_mutex_.unlock();
|
||||
|
||||
// Wait for the message
|
||||
if (handler->wait(timeout)) {
|
||||
message = handler->get();
|
||||
result = true;
|
||||
}
|
||||
|
||||
// Remove the callback handler
|
||||
callback_mutex_.lock();
|
||||
callbacks_.erase(callback);
|
||||
callback_mutex_.unlock();
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Processes u-blox messages in the given buffer & clears the read
|
||||
* messages from the buffer.
|
||||
* @param data the buffer of u-blox messages to process
|
||||
* @param size the size of the buffer
|
||||
*/
|
||||
void readCallback(unsigned char* data, std::size_t& size) {
|
||||
ublox::Reader reader(data, size);
|
||||
// Read all U-Blox messages in buffer
|
||||
while (reader.search() != reader.end() && reader.found()) {
|
||||
if (debug >= 3) {
|
||||
// Print the received bytes
|
||||
std::ostringstream oss;
|
||||
for (ublox::Reader::iterator it = reader.pos();
|
||||
it != reader.pos() + reader.length() + 8; ++it)
|
||||
oss << boost::format("%02x") % static_cast<unsigned int>(*it) << " ";
|
||||
ROS_DEBUG("U-blox: reading %d bytes\n%s", reader.length() + 8,
|
||||
oss.str().c_str());
|
||||
}
|
||||
|
||||
handle(reader);
|
||||
}
|
||||
|
||||
// delete read bytes from ASIO input buffer
|
||||
std::copy(reader.pos(), reader.end(), data);
|
||||
size -= reader.pos() - data;
|
||||
}
|
||||
|
||||
private:
|
||||
typedef std::multimap<std::pair<uint8_t, uint8_t>,
|
||||
boost::shared_ptr<CallbackHandler> > Callbacks;
|
||||
|
||||
// Call back handlers for u-blox messages
|
||||
Callbacks callbacks_;
|
||||
boost::mutex callback_mutex_;
|
||||
};
|
||||
|
||||
} // namespace ublox_gps
|
||||
|
||||
#endif // UBLOX_GPS_CALLBACK_H
|
||||
@@ -1,513 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#ifndef UBLOX_GPS_H
|
||||
#define UBLOX_GPS_H
|
||||
// STL
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <locale>
|
||||
#include <stdexcept>
|
||||
// Boost
|
||||
#include <boost/asio/ip/tcp.hpp>
|
||||
#include <boost/asio/serial_port.hpp>
|
||||
#include <boost/asio/io_service.hpp>
|
||||
#include <boost/atomic.hpp>
|
||||
// ROS
|
||||
#include <ros/console.h>
|
||||
// Other u-blox packages
|
||||
#include <ublox/serialization/ublox_msgs.h>
|
||||
// u-blox gps
|
||||
#include <ublox_gps/async_worker.h>
|
||||
#include <ublox_gps/callback.h>
|
||||
|
||||
/**
|
||||
* @namespace ublox_gps
|
||||
* This namespace is for I/O communication with the u-blox device, including
|
||||
* read callbacks.
|
||||
*/
|
||||
namespace ublox_gps {
|
||||
//! Possible baudrates for u-blox devices
|
||||
constexpr static unsigned int kBaudrates[] = { 4800,
|
||||
9600,
|
||||
19200,
|
||||
38400,
|
||||
57600,
|
||||
115200,
|
||||
230400,
|
||||
460800 };
|
||||
/**
|
||||
* @brief Handles communication with and configuration of the u-blox device
|
||||
*/
|
||||
class Gps {
|
||||
public:
|
||||
//! Sleep time [ms] after setting the baudrate
|
||||
constexpr static int kSetBaudrateSleepMs = 500;
|
||||
//! Default timeout for ACK messages in seconds
|
||||
constexpr static double kDefaultAckTimeout = 1.0;
|
||||
//! Size of write buffer for output messages
|
||||
constexpr static int kWriterSize = 1024;
|
||||
|
||||
Gps();
|
||||
virtual ~Gps();
|
||||
|
||||
/**
|
||||
* @brief If called, when the node shuts down, it will send a command to
|
||||
* save the flash memory.
|
||||
*/
|
||||
void setSaveOnShutdown(bool save_on_shutdown) {
|
||||
save_on_shutdown_ = save_on_shutdown;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Initialize TCP I/O.
|
||||
* @param host the TCP host
|
||||
* @param port the TCP port
|
||||
*/
|
||||
void initializeTcp(std::string host, std::string port);
|
||||
|
||||
/**
|
||||
* @brief Initialize the Serial I/O port.
|
||||
* @param port the device port address
|
||||
* @param baudrate the desired baud rate of the port
|
||||
* @param uart_in the UART In protocol, see CfgPRT for options
|
||||
* @param uart_out the UART Out protocol, see CfgPRT for options
|
||||
*/
|
||||
void initializeSerial(std::string port, unsigned int baudrate,
|
||||
uint16_t uart_in, uint16_t uart_out);
|
||||
|
||||
/**
|
||||
* @brief Reset the Serial I/O port after u-blox reset.
|
||||
* @param port the device port address
|
||||
* @param baudrate the desired baud rate of the port
|
||||
* @param uart_in the UART In protocol, see CfgPRT for options
|
||||
* @param uart_out the UART Out protocol, see CfgPRT for options
|
||||
*/
|
||||
void resetSerial(std::string port);
|
||||
|
||||
/**
|
||||
* @brief Closes the I/O port, and initiates save on shutdown procedure
|
||||
* if enabled.
|
||||
*/
|
||||
void close();
|
||||
|
||||
/**
|
||||
* @brief Reset I/O communications.
|
||||
* @param wait Time to wait before restarting communications
|
||||
*/
|
||||
void reset(const boost::posix_time::time_duration& wait);
|
||||
|
||||
/**
|
||||
* @brief Send a reset message to the u-blox device.
|
||||
* @param nav_bbr_mask The BBR sections to clear, see CfgRST message
|
||||
* @param reset_mode The reset type, see CfgRST message
|
||||
* @return true if the message was successfully sent, false otherwise
|
||||
*/
|
||||
bool configReset(uint16_t nav_bbr_mask, uint16_t reset_mode);
|
||||
|
||||
/**
|
||||
* @brief Configure the GNSS, cold reset the device, and reset the I/O.
|
||||
* @param gnss the desired GNSS configuration
|
||||
* @param wait the time to wait after resetting I/O before restarting
|
||||
* @return true if the GNSS was configured, the device was reset, and the
|
||||
* I/O reset successfully
|
||||
*/
|
||||
bool configGnss(ublox_msgs::CfgGNSS gnss,
|
||||
const boost::posix_time::time_duration& wait);
|
||||
|
||||
/**
|
||||
* @brief Send a message to the receiver to delete the BBR data stored in
|
||||
* flash.
|
||||
* @return true if sent message and received ACK, false otherwise
|
||||
*/
|
||||
bool clearBbr();
|
||||
|
||||
/**
|
||||
* @brief Configure the UART1 Port.
|
||||
* @param baudrate the baudrate of the port
|
||||
* @param in_proto_mask the in protocol mask, see CfgPRT message
|
||||
* @param out_proto_mask the out protocol mask, see CfgPRT message
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configUart1(unsigned int baudrate, uint16_t in_proto_mask,
|
||||
uint16_t out_proto_mask);
|
||||
|
||||
/**
|
||||
* @brief Disable the UART Port. Sets in/out protocol masks to 0. Does not
|
||||
* modify other values.
|
||||
* @param prev_cfg an empty message which will be filled with the previous
|
||||
* configuration parameters
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool disableUart1(ublox_msgs::CfgPRT& prev_cfg);
|
||||
|
||||
/**
|
||||
* @brief Configure the USB Port.
|
||||
* @param tx_ready the TX ready pin configuration, see CfgPRT message
|
||||
* @param in_proto_mask the in protocol mask, see CfgPRT message
|
||||
* @param out_proto_mask the out protocol mask, see CfgPRT message
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configUsb(uint16_t tx_ready, uint16_t in_proto_mask,
|
||||
uint16_t out_proto_mask);
|
||||
|
||||
/**
|
||||
* @brief Configure the device navigation and measurement rate settings.
|
||||
* @param meas_rate Period in milliseconds between subsequent measurements.
|
||||
* @param nav_rate the rate at which navigation solutions are generated by the
|
||||
* receiver in number measurement cycles
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configRate(uint16_t meas_rate, uint16_t nav_rate);
|
||||
|
||||
/**
|
||||
* @brief Configure the RTCM messages with the given IDs to the set rate.
|
||||
* @param ids the RTCM message ids, valid range: [0, 255]
|
||||
* @param rates the send rates for each RTCM message ID, valid range: [0, 255]
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configRtcm(std::vector<uint8_t> ids, std::vector<uint8_t> rates);
|
||||
|
||||
/**
|
||||
* @brief Configure the SBAS settings.
|
||||
* @param enable If true, enable SBAS. Deprecated in firmware 8, use CfgGNSS
|
||||
* instead.
|
||||
* @param usage SBAS usage, see CfgSBAS for options
|
||||
* @param max_sbas Maximum Number of SBAS prioritized tracking channels
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configSbas(bool enable, uint8_t usage, uint8_t max_sbas);
|
||||
|
||||
/**
|
||||
* @brief Set the TMODE3 settings to fixed.
|
||||
*
|
||||
* @details Sets the at the given antenna reference point (ARP) position in
|
||||
* either Latitude Longitude Altitude (LLA) or ECEF coordinates.
|
||||
* @param arp_position a vector of size 3 representing the ARP position in
|
||||
* ECEF coordinates [m] or LLA coordinates [deg]
|
||||
* @param arp_position_hp a vector of size 3 a vector of size 3 representing
|
||||
* the ARP position in ECEF coordinates [0.1 mm] or LLA coordinates
|
||||
* [deg * 1e-9]
|
||||
* @param lla_flag true if position is given in LAT/LON/ALT, false if ECEF
|
||||
* @param fixed_pos_acc Fixed position 3D accuracy [m]
|
||||
* @return true on ACK, false if settings are incorrect or on other conditions
|
||||
*/
|
||||
bool configTmode3Fixed(bool lla_flag,
|
||||
std::vector<float> arp_position,
|
||||
std::vector<int8_t> arp_position_hp,
|
||||
float fixed_pos_acc);
|
||||
|
||||
/**
|
||||
* @brief Set the TMODE3 settings to survey-in.
|
||||
* @param svin_min_dur Survey-in minimum duration [s]
|
||||
* @param svin_acc_limit Survey-in position accuracy limit [m]
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool configTmode3SurveyIn(unsigned int svin_min_dur, float svin_acc_limit);
|
||||
|
||||
/**
|
||||
* @brief Set the TMODE3 settings to disabled. Should only be called for
|
||||
* High Precision GNSS devices, otherwise the device will return a NACK.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool disableTmode3();
|
||||
|
||||
/**
|
||||
* @brief Set the rate at which the U-Blox device sends the given message
|
||||
* @param class_id the class identifier of the message
|
||||
* @param message_id the message identifier
|
||||
* @param rate the updated rate in Hz
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool setRate(uint8_t class_id, uint8_t message_id, uint8_t rate);
|
||||
|
||||
/**
|
||||
* @brief Set the device dynamic model.
|
||||
* @param model Dynamic model to use. Consult ublox protocol spec for details.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool setDynamicModel(uint8_t model);
|
||||
|
||||
/**
|
||||
* @brief Set the device fix mode.
|
||||
* @param mode 2D only, 3D only or auto.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool setFixMode(uint8_t mode);
|
||||
|
||||
/**
|
||||
* @brief Set the dead reckoning time limit
|
||||
* @param limit Time limit in seconds.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool setDeadReckonLimit(uint8_t limit);
|
||||
|
||||
/**
|
||||
* @brief Enable or disable PPP (precise-point-positioning).
|
||||
* @param enable If true, enable PPP.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*
|
||||
* @note This is part of the expert settings. It is recommended you check
|
||||
* the ublox manual first.
|
||||
*/
|
||||
bool setPpp(bool enable);
|
||||
|
||||
/**
|
||||
* @brief Set the DGNSS mode (see CfgDGNSS message for details).
|
||||
* @param mode the DGNSS mode (see CfgDGNSS message for options)
|
||||
* @return true on ACK, false on other conditions
|
||||
*/
|
||||
bool setDgnss(uint8_t mode);
|
||||
|
||||
/**
|
||||
* @brief Enable or disable ADR (automotive dead reckoning).
|
||||
* @param enable If true, enable ADR.
|
||||
* @return true on ACK, false on other conditions.
|
||||
*/
|
||||
bool setUseAdr(bool enable);
|
||||
|
||||
/**
|
||||
* @brief Configure the U-Blox send rate of the message & subscribe to the
|
||||
* given message
|
||||
* @param the callback handler for the message
|
||||
* @param rate the rate in Hz of the message
|
||||
*/
|
||||
template <typename T>
|
||||
void subscribe(typename CallbackHandler_<T>::Callback callback,
|
||||
unsigned int rate);
|
||||
/**
|
||||
* @brief Subscribe to the given Ublox message.
|
||||
* @param the callback handler for the message
|
||||
*/
|
||||
template <typename T>
|
||||
void subscribe(typename CallbackHandler_<T>::Callback callback);
|
||||
|
||||
/**
|
||||
* @brief Subscribe to the message with the given ID. This is used for
|
||||
* messages which have the same format but different message IDs,
|
||||
* e.g. INF messages.
|
||||
* @param the callback handler for the message
|
||||
* @param message_id the U-Blox message ID
|
||||
*/
|
||||
template <typename T>
|
||||
void subscribeId(typename CallbackHandler_<T>::Callback callback,
|
||||
unsigned int message_id);
|
||||
|
||||
/**
|
||||
* Read a u-blox message of the given type.
|
||||
* @param message the received u-blox message
|
||||
* @param timeout the amount of time to wait for the desired message
|
||||
*/
|
||||
template <typename T>
|
||||
bool read(T& message,
|
||||
const boost::posix_time::time_duration& timeout = default_timeout_);
|
||||
|
||||
bool isInitialized() const { return worker_ != 0; }
|
||||
bool isConfigured() const { return isInitialized() && configured_; }
|
||||
bool isOpen() const { return worker_->isOpen(); }
|
||||
|
||||
/**
|
||||
* Poll a u-blox message of the given type.
|
||||
* @param message the received u-blox message output
|
||||
* @param payload the poll message payload sent to the device
|
||||
* defaults to empty
|
||||
* @param timeout the amount of time to wait for the desired message
|
||||
*/
|
||||
template <typename ConfigT>
|
||||
bool poll(ConfigT& message,
|
||||
const std::vector<uint8_t>& payload = std::vector<uint8_t>(),
|
||||
const boost::posix_time::time_duration& timeout = default_timeout_);
|
||||
/**
|
||||
* Poll a u-blox message.
|
||||
* @param class_id the u-blox message class id
|
||||
* @param message_id the u-blox message id
|
||||
* @param payload the poll message payload sent to the device,
|
||||
* defaults to empty
|
||||
* @param timeout the amount of time to wait for the desired message
|
||||
*/
|
||||
bool poll(uint8_t class_id, uint8_t message_id,
|
||||
const std::vector<uint8_t>& payload = std::vector<uint8_t>());
|
||||
|
||||
/**
|
||||
* @brief Send the given configuration message.
|
||||
* @param message the configuration message
|
||||
* @param wait if true, wait for an ACK
|
||||
* @return true if message sent successfully and either ACK was received or
|
||||
* wait was set to false
|
||||
*/
|
||||
template <typename ConfigT>
|
||||
bool configure(const ConfigT& message, bool wait = true);
|
||||
|
||||
/**
|
||||
* @brief Wait for an acknowledge message until the timeout
|
||||
* @param timeout maximum time to wait in seconds
|
||||
* @param class_id the expected class ID of the ACK
|
||||
* @param msg_id the expected message ID of the ACK
|
||||
* @return true if expected ACK received, false otherwise
|
||||
*/
|
||||
bool waitForAcknowledge(const boost::posix_time::time_duration& timeout,
|
||||
uint8_t class_id, uint8_t msg_id);
|
||||
|
||||
private:
|
||||
//! Types for ACK/NACK messages, WAIT is used when waiting for an ACK
|
||||
enum AckType {
|
||||
NACK, //! Not acknowledged
|
||||
ACK, //! Acknowledge
|
||||
WAIT //! Waiting for ACK
|
||||
};
|
||||
|
||||
//! Stores ACK/NACK messages
|
||||
struct Ack {
|
||||
AckType type; //!< The ACK type
|
||||
uint8_t class_id; //!< The class ID of the ACK
|
||||
uint8_t msg_id; //!< The message ID of the ACK
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Set the I/O worker
|
||||
* @param an I/O handler
|
||||
*/
|
||||
void setWorker(const boost::shared_ptr<Worker>& worker);
|
||||
|
||||
/**
|
||||
* @brief Subscribe to ACK/NACK messages and UPD-SOS-ACK messages.
|
||||
*/
|
||||
void subscribeAcks();
|
||||
|
||||
/**
|
||||
* @brief Callback handler for UBX-ACK message.
|
||||
* @param m the message to process
|
||||
*/
|
||||
void processAck(const ublox_msgs::Ack &m);
|
||||
|
||||
/**
|
||||
* @brief Callback handler for UBX-NACK message.
|
||||
* @param m the message to process
|
||||
*/
|
||||
void processNack(const ublox_msgs::Ack &m);
|
||||
|
||||
/**
|
||||
* @brief Callback handler for UBX-UPD-SOS-ACK message.
|
||||
* @param m the message to process
|
||||
*/
|
||||
void processUpdSosAck(const ublox_msgs::UpdSOS_Ack &m);
|
||||
|
||||
/**
|
||||
* @brief Execute save on shutdown procedure.
|
||||
*
|
||||
* @details Execute the procedure recommended in the u-blox 8 documentation.
|
||||
* Send a stop message to the receiver and instruct it to dump its
|
||||
* current state to the attached flash memory (where fitted) as part of the
|
||||
* shutdown procedure. The flash data is automatically retrieved when the
|
||||
* receiver is restarted.
|
||||
* @return true if the receiver reset & saved the BBR contents to flash
|
||||
*/
|
||||
bool saveOnShutdown();
|
||||
|
||||
//! Processes I/O stream data
|
||||
boost::shared_ptr<Worker> worker_;
|
||||
//! Whether or not the I/O port has been configured
|
||||
bool configured_;
|
||||
//! Whether or not to save Flash BBR on shutdown
|
||||
bool save_on_shutdown_;
|
||||
|
||||
//! The default timeout for ACK messages
|
||||
static const boost::posix_time::time_duration default_timeout_;
|
||||
//! Stores last received ACK accessed by multiple threads
|
||||
mutable boost::atomic<Ack> ack_;
|
||||
|
||||
//! Callback handlers for u-blox messages
|
||||
CallbackHandlers callbacks_;
|
||||
|
||||
std::string host_, port_;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
void Gps::subscribe(
|
||||
typename CallbackHandler_<T>::Callback callback, unsigned int rate) {
|
||||
if (!setRate(T::CLASS_ID, T::MESSAGE_ID, rate)) return;
|
||||
subscribe<T>(callback);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void Gps::subscribe(typename CallbackHandler_<T>::Callback callback) {
|
||||
callbacks_.insert<T>(callback);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void Gps::subscribeId(typename CallbackHandler_<T>::Callback callback,
|
||||
unsigned int message_id) {
|
||||
callbacks_.insert<T>(callback, message_id);
|
||||
}
|
||||
|
||||
template <typename ConfigT>
|
||||
bool Gps::poll(ConfigT& message,
|
||||
const std::vector<uint8_t>& payload,
|
||||
const boost::posix_time::time_duration& timeout) {
|
||||
if (!poll(ConfigT::CLASS_ID, ConfigT::MESSAGE_ID, payload)) return false;
|
||||
return read(message, timeout);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
bool Gps::read(T& message, const boost::posix_time::time_duration& timeout) {
|
||||
if (!worker_) return false;
|
||||
return callbacks_.read(message, timeout);
|
||||
}
|
||||
|
||||
template <typename ConfigT>
|
||||
bool Gps::configure(const ConfigT& message, bool wait) {
|
||||
if (!worker_) return false;
|
||||
|
||||
// Reset ack
|
||||
Ack ack;
|
||||
ack.type = WAIT;
|
||||
ack_.store(ack, boost::memory_order_seq_cst);
|
||||
|
||||
// Encode the message
|
||||
std::vector<unsigned char> out(kWriterSize);
|
||||
ublox::Writer writer(out.data(), out.size());
|
||||
if (!writer.write(message)) {
|
||||
ROS_ERROR("Failed to encode config message 0x%02x / 0x%02x",
|
||||
message.CLASS_ID, message.MESSAGE_ID);
|
||||
return false;
|
||||
}
|
||||
// Send the message to the device
|
||||
worker_->send(out.data(), writer.end() - out.data());
|
||||
|
||||
if (!wait) return true;
|
||||
|
||||
// Wait for an acknowledgment and return whether or not it was received
|
||||
return waitForAcknowledge(default_timeout_,
|
||||
message.CLASS_ID,
|
||||
message.MESSAGE_ID);
|
||||
}
|
||||
|
||||
} // namespace ublox_gps
|
||||
|
||||
#endif // UBLOX_GPS_H
|
||||
@@ -1,55 +0,0 @@
|
||||
/* mkgmtime.h -- make a time_t from a gmtime struct tm
|
||||
$Id: mkgmtime.h,v 1.5 2003/02/13 20:15:41 rjs3 Exp $
|
||||
|
||||
* Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The name "Carnegie Mellon University" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For permission or any other legal
|
||||
* details, please contact
|
||||
* Office of Technology Transfer
|
||||
* Carnegie Mellon University
|
||||
* 5000 Forbes Avenue
|
||||
* Pittsburgh, PA 15213-3890
|
||||
* (412) 268-4387, fax: (412) 268-7395
|
||||
* tech-transfer@andrew.cmu.edu
|
||||
*
|
||||
* 4. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by Computing Services
|
||||
* at Carnegie Mellon University (http://www.cmu.edu/computing/)."
|
||||
*
|
||||
* CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
|
||||
* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef INCLUDED_MKGMTIME_H
|
||||
#define INCLUDED_MKGMTIME_H
|
||||
|
||||
#include <time.h>
|
||||
|
||||
/**
|
||||
* @brief Get the UTC time in seconds and nano-seconds from a time struct in
|
||||
* GM time.
|
||||
*/
|
||||
extern time_t mkgmtime(struct tm * const tmp);
|
||||
|
||||
#endif /* INCLUDED_MKGMTIME_H */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,31 +0,0 @@
|
||||
#ifndef UBLOX_GPS_UTILS_H
|
||||
#define UBLOX_GPS_UTILS_H
|
||||
|
||||
#include <math.h>
|
||||
#include <time.h>
|
||||
#include "ublox_msgs/NavPVT.h"
|
||||
|
||||
extern "C" {
|
||||
#include "ublox_gps/mkgmtime.h"
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Convert date/time to UTC time in seconds.
|
||||
*/
|
||||
template<typename NavPVT>
|
||||
long toUtcSeconds(const NavPVT& msg) {
|
||||
// Create TM struct for mkgmtime
|
||||
struct tm time = {0};
|
||||
time.tm_year = msg.year - 1900;
|
||||
time.tm_mon = msg.month - 1;
|
||||
time.tm_mday = msg.day;
|
||||
time.tm_hour = msg.hour;
|
||||
time.tm_min = msg.min;
|
||||
time.tm_sec = msg.sec;
|
||||
// C++ STL doesn't have a mkgmtime (though other libraries do)
|
||||
// STL mktime converts date/time to seconds in local time
|
||||
// A modified version of code external library is used for mkgmtime
|
||||
return mkgmtime(&time);
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -1,72 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#ifndef UBLOX_GPS_WORKER_H
|
||||
#define UBLOX_GPS_WORKER_H
|
||||
|
||||
#include <boost/date_time/posix_time/posix_time.hpp>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
namespace ublox_gps {
|
||||
|
||||
/**
|
||||
* @brief Handles I/O reading and writing.
|
||||
*/
|
||||
class Worker {
|
||||
public:
|
||||
typedef boost::function<void(unsigned char*, std::size_t&)> Callback;
|
||||
virtual ~Worker() {}
|
||||
|
||||
/**
|
||||
* @brief Set the callback function for received messages.
|
||||
* @param callback the callback function which process messages in the buffer
|
||||
*/
|
||||
virtual void setCallback(const Callback& callback) = 0;
|
||||
|
||||
/**
|
||||
* @brief Send the data in the buffer.
|
||||
* @param data the bytes to send
|
||||
* @param size the size of the buffer
|
||||
*/
|
||||
virtual bool send(const unsigned char* data, const unsigned int size) = 0;
|
||||
|
||||
/**
|
||||
* @brief Wait for an incoming message.
|
||||
* @param timeout the maximum time to wait.
|
||||
*/
|
||||
virtual void wait(const boost::posix_time::time_duration& timeout) = 0;
|
||||
|
||||
/**
|
||||
* @brief Whether or not the I/O stream is open.
|
||||
*/
|
||||
virtual bool isOpen() const = 0;
|
||||
};
|
||||
|
||||
} // namespace ublox_gps
|
||||
|
||||
#endif // UBLOX_GPS_WORKER_H
|
||||
@@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<launch>
|
||||
<node name="rover_gps" pkg="ublox_gps" type="ublox_gps" output="screen" clear_params="false" respawn="true" respawn_delay="10">
|
||||
<rosparam command="load" file="$(find ublox_gps)/config/nmea.yaml" />
|
||||
</node>
|
||||
</launch>
|
||||
@@ -1,23 +0,0 @@
|
||||
<?xml version="1.0"?>
|
||||
<package format='2'>
|
||||
<name>ublox_gps</name>
|
||||
<version>1.1.2</version>
|
||||
<description>
|
||||
Driver for u-blox GPS devices.
|
||||
</description>
|
||||
<author>Johannes Meyer</author>
|
||||
<maintainer email="gcross.code@icloud.com">Gareth Cross</maintainer>
|
||||
<maintainer email="quchao@seas.upenn.edu">Chao Qu</maintainer>
|
||||
<maintainer email="vmlane@alum.mit.edu">Veronica Lane</maintainer>
|
||||
<license>BSD</license>
|
||||
<url>http://ros.org/wiki/ublox</url>
|
||||
|
||||
<buildtool_depend>catkin</buildtool_depend>
|
||||
|
||||
<depend>ublox_serialization</depend>
|
||||
<depend>ublox_msgs</depend>
|
||||
<depend>roscpp</depend>
|
||||
<depend>roscpp_serialization</depend>
|
||||
<depend>diagnostic_updater</depend>
|
||||
|
||||
</package>
|
||||
@@ -1,540 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND
|
||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#include <ublox_gps/gps.h>
|
||||
|
||||
namespace ublox_gps {
|
||||
|
||||
using namespace ublox_msgs;
|
||||
|
||||
const boost::posix_time::time_duration Gps::default_timeout_ =
|
||||
boost::posix_time::seconds(Gps::kDefaultAckTimeout);
|
||||
|
||||
Gps::Gps() : configured_(false) { subscribeAcks(); }
|
||||
|
||||
Gps::~Gps() { close(); }
|
||||
|
||||
void Gps::setWorker(const boost::shared_ptr<Worker>& worker) {
|
||||
if (worker_) return;
|
||||
worker_ = worker;
|
||||
worker_->setCallback(boost::bind(&CallbackHandlers::readCallback,
|
||||
&callbacks_, _1, _2));
|
||||
configured_ = static_cast<bool>(worker);
|
||||
}
|
||||
|
||||
void Gps::subscribeAcks() {
|
||||
// Set NACK handler
|
||||
subscribeId<ublox_msgs::Ack>(boost::bind(&Gps::processNack, this, _1),
|
||||
ublox_msgs::Message::ACK::NACK);
|
||||
// Set ACK handler
|
||||
subscribeId<ublox_msgs::Ack>(boost::bind(&Gps::processAck, this, _1),
|
||||
ublox_msgs::Message::ACK::ACK);
|
||||
// Set UPD-SOS-ACK handler
|
||||
subscribe<ublox_msgs::UpdSOS_Ack>(
|
||||
boost::bind(&Gps::processUpdSosAck, this, _1));
|
||||
}
|
||||
|
||||
void Gps::processAck(const ublox_msgs::Ack &m) {
|
||||
// Process ACK/NACK messages
|
||||
Ack ack;
|
||||
ack.type = ACK;
|
||||
ack.class_id = m.clsID;
|
||||
ack.msg_id = m.msgID;
|
||||
// store the ack atomically
|
||||
ack_.store(ack, boost::memory_order_seq_cst);
|
||||
ROS_DEBUG_COND(debug >= 2, "U-blox: received ACK: 0x%02x / 0x%02x",
|
||||
m.clsID, m.msgID);
|
||||
}
|
||||
|
||||
void Gps::processNack(const ublox_msgs::Ack &m) {
|
||||
// Process ACK/NACK messages
|
||||
Ack ack;
|
||||
ack.type = NACK;
|
||||
ack.class_id = m.clsID;
|
||||
ack.msg_id = m.msgID;
|
||||
// store the ack atomically
|
||||
ack_.store(ack, boost::memory_order_seq_cst);
|
||||
ROS_ERROR("U-blox: received NACK: 0x%02x / 0x%02x", m.clsID, m.msgID);
|
||||
}
|
||||
|
||||
void Gps::processUpdSosAck(const ublox_msgs::UpdSOS_Ack &m) {
|
||||
if (m.cmd == UpdSOS_Ack::CMD_BACKUP_CREATE_ACK) {
|
||||
Ack ack;
|
||||
ack.type = (m.response == m.BACKUP_CREATE_ACK) ? ACK : NACK;
|
||||
ack.class_id = m.CLASS_ID;
|
||||
ack.msg_id = m.MESSAGE_ID;
|
||||
// store the ack atomically
|
||||
ack_.store(ack, boost::memory_order_seq_cst);
|
||||
ROS_DEBUG_COND(ack.type == ACK && debug >= 2,
|
||||
"U-blox: received UPD SOS Backup ACK");
|
||||
if(ack.type == NACK)
|
||||
ROS_ERROR("U-blox: received UPD SOS Backup NACK");
|
||||
}
|
||||
}
|
||||
|
||||
void Gps::initializeSerial(std::string port, unsigned int baudrate,
|
||||
uint16_t uart_in, uint16_t uart_out) {
|
||||
port_ = port;
|
||||
boost::shared_ptr<boost::asio::io_service> io_service(
|
||||
new boost::asio::io_service);
|
||||
boost::shared_ptr<boost::asio::serial_port> serial(
|
||||
new boost::asio::serial_port(*io_service));
|
||||
|
||||
// open serial port
|
||||
try {
|
||||
serial->open(port);
|
||||
} catch (std::runtime_error& e) {
|
||||
throw std::runtime_error("U-Blox: Could not open serial port :"
|
||||
+ port + " " + e.what());
|
||||
}
|
||||
|
||||
ROS_INFO("U-Blox: Opened serial port %s", port.c_str());
|
||||
|
||||
// Set the I/O worker
|
||||
if (worker_) return;
|
||||
setWorker(boost::shared_ptr<Worker>(
|
||||
new AsyncWorker<boost::asio::serial_port>(serial, io_service)));
|
||||
|
||||
configured_ = false;
|
||||
|
||||
// Set the baudrate
|
||||
boost::asio::serial_port_base::baud_rate current_baudrate;
|
||||
serial->get_option(current_baudrate);
|
||||
// Incrementally increase the baudrate to the desired value
|
||||
for (int i = 0; i < sizeof(kBaudrates)/sizeof(kBaudrates[0]); i++) {
|
||||
if (current_baudrate.value() == baudrate)
|
||||
break;
|
||||
// Don't step down, unless the desired baudrate is lower
|
||||
if(current_baudrate.value() > kBaudrates[i] && baudrate > kBaudrates[i])
|
||||
continue;
|
||||
serial->set_option(
|
||||
boost::asio::serial_port_base::baud_rate(kBaudrates[i]));
|
||||
boost::this_thread::sleep(
|
||||
boost::posix_time::milliseconds(kSetBaudrateSleepMs));
|
||||
serial->get_option(current_baudrate);
|
||||
ROS_DEBUG("U-Blox: Set ASIO baudrate to %u", current_baudrate.value());
|
||||
}
|
||||
configured_ = configUart1(baudrate, uart_in, uart_out);
|
||||
if(!configured_ || current_baudrate.value() != baudrate) {
|
||||
throw std::runtime_error("Could not configure serial baud rate");
|
||||
}
|
||||
}
|
||||
|
||||
void Gps::resetSerial(std::string port) {
|
||||
boost::shared_ptr<boost::asio::io_service> io_service(
|
||||
new boost::asio::io_service);
|
||||
boost::shared_ptr<boost::asio::serial_port> serial(
|
||||
new boost::asio::serial_port(*io_service));
|
||||
|
||||
// open serial port
|
||||
try {
|
||||
serial->open(port);
|
||||
} catch (std::runtime_error& e) {
|
||||
throw std::runtime_error("U-Blox: Could not open serial port :"
|
||||
+ port + " " + e.what());
|
||||
}
|
||||
|
||||
ROS_INFO("U-Blox: Reset serial port %s", port.c_str());
|
||||
|
||||
// Set the I/O worker
|
||||
if (worker_) return;
|
||||
setWorker(boost::shared_ptr<Worker>(
|
||||
new AsyncWorker<boost::asio::serial_port>(serial, io_service)));
|
||||
configured_ = false;
|
||||
|
||||
// Poll UART PRT Config
|
||||
std::vector<uint8_t> payload;
|
||||
payload.push_back(CfgPRT::PORT_ID_UART1);
|
||||
if (!poll(CfgPRT::CLASS_ID, CfgPRT::MESSAGE_ID, payload)) {
|
||||
ROS_ERROR("Resetting Serial Port: Could not poll UART1 CfgPRT");
|
||||
return;
|
||||
}
|
||||
CfgPRT prt;
|
||||
if(!read(prt, default_timeout_)) {
|
||||
ROS_ERROR("Resetting Serial Port: Could not read polled UART1 CfgPRT %s",
|
||||
"message");
|
||||
return;
|
||||
}
|
||||
|
||||
// Set the baudrate
|
||||
serial->set_option(boost::asio::serial_port_base::baud_rate(prt.baudRate));
|
||||
configured_ = true;
|
||||
}
|
||||
|
||||
void Gps::initializeTcp(std::string host, std::string port) {
|
||||
host_ = host;
|
||||
port_ = port;
|
||||
boost::shared_ptr<boost::asio::io_service> io_service(
|
||||
new boost::asio::io_service);
|
||||
boost::asio::ip::tcp::resolver::iterator endpoint;
|
||||
|
||||
try {
|
||||
boost::asio::ip::tcp::resolver resolver(*io_service);
|
||||
endpoint =
|
||||
resolver.resolve(boost::asio::ip::tcp::resolver::query(host, port));
|
||||
} catch (std::runtime_error& e) {
|
||||
throw std::runtime_error("U-Blox: Could not resolve" + host + " " +
|
||||
port + " " + e.what());
|
||||
}
|
||||
|
||||
boost::shared_ptr<boost::asio::ip::tcp::socket> socket(
|
||||
new boost::asio::ip::tcp::socket(*io_service));
|
||||
|
||||
try {
|
||||
socket->connect(*endpoint);
|
||||
} catch (std::runtime_error& e) {
|
||||
throw std::runtime_error("U-Blox: Could not connect to " +
|
||||
endpoint->host_name() + ":" +
|
||||
endpoint->service_name() + ": " + e.what());
|
||||
}
|
||||
|
||||
ROS_INFO("U-Blox: Connected to %s:%s.", endpoint->host_name().c_str(),
|
||||
endpoint->service_name().c_str());
|
||||
|
||||
if (worker_) return;
|
||||
setWorker(boost::shared_ptr<Worker>(
|
||||
new AsyncWorker<boost::asio::ip::tcp::socket>(socket,
|
||||
io_service)));
|
||||
}
|
||||
|
||||
void Gps::close() {
|
||||
if(save_on_shutdown_) {
|
||||
if(saveOnShutdown())
|
||||
ROS_INFO("U-Blox Flash BBR saved");
|
||||
else
|
||||
ROS_INFO("U-Blox Flash BBR failed to save");
|
||||
}
|
||||
worker_.reset();
|
||||
configured_ = false;
|
||||
}
|
||||
|
||||
void Gps::reset(const boost::posix_time::time_duration& wait) {
|
||||
worker_.reset();
|
||||
configured_ = false;
|
||||
// sleep because of undefined behavior after I/O reset
|
||||
boost::this_thread::sleep(wait);
|
||||
if (host_ == "")
|
||||
resetSerial(port_);
|
||||
else
|
||||
initializeTcp(host_, port_);
|
||||
}
|
||||
|
||||
bool Gps::configReset(uint16_t nav_bbr_mask, uint16_t reset_mode) {
|
||||
ROS_WARN("Resetting u-blox. If device address changes, %s",
|
||||
"node must be relaunched.");
|
||||
|
||||
CfgRST rst;
|
||||
rst.navBbrMask = nav_bbr_mask;
|
||||
rst.resetMode = reset_mode;
|
||||
|
||||
// Don't wait for ACK, return if it fails
|
||||
if (!configure(rst, false))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Gps::configGnss(CfgGNSS gnss,
|
||||
const boost::posix_time::time_duration& wait) {
|
||||
// Configure the GNSS settings
|
||||
ROS_DEBUG("Re-configuring GNSS.");
|
||||
if (!configure(gnss))
|
||||
return false;
|
||||
// Cold reset the GNSS
|
||||
ROS_WARN("GNSS re-configured, cold resetting device.");
|
||||
if (!configReset(CfgRST::NAV_BBR_COLD_START, CfgRST::RESET_MODE_GNSS))
|
||||
return false;
|
||||
ros::Duration(1.0).sleep();
|
||||
// Reset the I/O
|
||||
reset(wait);
|
||||
return isConfigured();
|
||||
}
|
||||
|
||||
bool Gps::saveOnShutdown() {
|
||||
// Command the receiver to stop
|
||||
CfgRST rst;
|
||||
rst.navBbrMask = rst.NAV_BBR_HOT_START;
|
||||
rst.resetMode = rst.RESET_MODE_GNSS_STOP;
|
||||
if(!configure(rst))
|
||||
return false;
|
||||
// Command saving the contents of BBR to flash memory
|
||||
// And wait for UBX-UPD-SOS-ACK
|
||||
UpdSOS backup;
|
||||
return configure(backup);
|
||||
}
|
||||
|
||||
bool Gps::clearBbr() {
|
||||
// Command saving the contents of BBR to flash memory
|
||||
// And wait for UBX-UPD-SOS-ACK
|
||||
UpdSOS sos;
|
||||
sos.cmd = sos.CMD_FLASH_BACKUP_CLEAR;
|
||||
return configure(sos);
|
||||
}
|
||||
|
||||
bool Gps::configUart1(unsigned int baudrate, uint16_t in_proto_mask,
|
||||
uint16_t out_proto_mask) {
|
||||
if (!worker_) return true;
|
||||
|
||||
ROS_DEBUG("Configuring UART1 baud rate: %u, In/Out Protocol: %u / %u",
|
||||
baudrate, in_proto_mask, out_proto_mask);
|
||||
|
||||
CfgPRT port;
|
||||
port.portID = CfgPRT::PORT_ID_UART1;
|
||||
port.baudRate = baudrate;
|
||||
port.mode = CfgPRT::MODE_RESERVED1 | CfgPRT::MODE_CHAR_LEN_8BIT |
|
||||
CfgPRT::MODE_PARITY_NO | CfgPRT::MODE_STOP_BITS_1;
|
||||
port.inProtoMask = in_proto_mask;
|
||||
port.outProtoMask = out_proto_mask;
|
||||
return configure(port);
|
||||
}
|
||||
|
||||
bool Gps::disableUart1(CfgPRT& prev_config) {
|
||||
ROS_DEBUG("Disabling UART1");
|
||||
|
||||
// Poll UART PRT Config
|
||||
std::vector<uint8_t> payload;
|
||||
payload.push_back(CfgPRT::PORT_ID_UART1);
|
||||
if (!poll(CfgPRT::CLASS_ID, CfgPRT::MESSAGE_ID, payload)) {
|
||||
ROS_ERROR("disableUart: Could not poll UART1 CfgPRT");
|
||||
return false;
|
||||
}
|
||||
if(!read(prev_config, default_timeout_)) {
|
||||
ROS_ERROR("disableUart: Could not read polled UART1 CfgPRT message");
|
||||
return false;
|
||||
}
|
||||
// Keep original settings, but disable in/out
|
||||
CfgPRT port;
|
||||
port.portID = CfgPRT::PORT_ID_UART1;
|
||||
port.mode = prev_config.mode;
|
||||
port.baudRate = prev_config.baudRate;
|
||||
port.inProtoMask = 0;
|
||||
port.outProtoMask = 0;
|
||||
port.txReady = prev_config.txReady;
|
||||
port.flags = prev_config.flags;
|
||||
return configure(port);
|
||||
}
|
||||
|
||||
bool Gps::configUsb(uint16_t tx_ready,
|
||||
uint16_t in_proto_mask,
|
||||
uint16_t out_proto_mask) {
|
||||
if (!worker_) return true;
|
||||
|
||||
ROS_DEBUG("Configuring USB tx_ready: %u, In/Out Protocol: %u / %u",
|
||||
tx_ready, in_proto_mask, out_proto_mask);
|
||||
|
||||
CfgPRT port;
|
||||
port.portID = CfgPRT::PORT_ID_USB;
|
||||
port.txReady = tx_ready;
|
||||
port.inProtoMask = in_proto_mask;
|
||||
port.outProtoMask = out_proto_mask;
|
||||
return configure(port);
|
||||
}
|
||||
|
||||
bool Gps::configRate(uint16_t meas_rate, uint16_t nav_rate) {
|
||||
ROS_DEBUG("Configuring measurement rate to %u and nav rate to %u", meas_rate,
|
||||
nav_rate);
|
||||
|
||||
CfgRATE rate;
|
||||
rate.measRate = meas_rate;
|
||||
rate.navRate = nav_rate; // must be fixed at 1 for ublox 5 and 6
|
||||
rate.timeRef = CfgRATE::TIME_REF_GPS;
|
||||
return configure(rate);
|
||||
}
|
||||
|
||||
bool Gps::configRtcm(std::vector<uint8_t> ids, std::vector<uint8_t> rates) {
|
||||
for(size_t i = 0; i < ids.size(); ++i) {
|
||||
ROS_DEBUG("Setting RTCM %d Rate %u", ids[i], rates[i]);
|
||||
if(!setRate(ublox_msgs::Class::RTCM, (uint8_t)ids[i], rates[i])) {
|
||||
ROS_ERROR("Could not set RTCM %d to rate %u", ids[i], rates[i]);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Gps::configSbas(bool enable, uint8_t usage, uint8_t max_sbas) {
|
||||
ROS_DEBUG("Configuring SBAS: usage %u, max_sbas %u", usage, max_sbas);
|
||||
|
||||
ublox_msgs::CfgSBAS msg;
|
||||
msg.mode = (enable ? CfgSBAS::MODE_ENABLED : 0);
|
||||
msg.usage = usage;
|
||||
msg.maxSBAS = max_sbas;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::configTmode3Fixed(bool lla_flag,
|
||||
std::vector<float> arp_position,
|
||||
std::vector<int8_t> arp_position_hp,
|
||||
float fixed_pos_acc) {
|
||||
if(arp_position.size() != 3 || arp_position_hp.size() != 3) {
|
||||
ROS_ERROR("Configuring TMODE3 to Fixed: size of position %s",
|
||||
"& arp_position_hp args must be 3");
|
||||
return false;
|
||||
}
|
||||
|
||||
ROS_DEBUG("Configuring TMODE3 to Fixed");
|
||||
|
||||
CfgTMODE3 tmode3;
|
||||
tmode3.flags = tmode3.FLAGS_MODE_FIXED & tmode3.FLAGS_MODE_MASK;
|
||||
tmode3.flags |= lla_flag ? tmode3.FLAGS_LLA : 0;
|
||||
|
||||
// Set position
|
||||
if(lla_flag) {
|
||||
// Convert from [deg] to [deg * 1e-7]
|
||||
tmode3.ecefXOrLat = (int)round(arp_position[0] * 1e7);
|
||||
tmode3.ecefYOrLon = (int)round(arp_position[1] * 1e7);
|
||||
tmode3.ecefZOrAlt = (int)round(arp_position[2] * 1e7);
|
||||
} else {
|
||||
// Convert from m to cm
|
||||
tmode3.ecefXOrLat = (int)round(arp_position[0] * 1e2);
|
||||
tmode3.ecefYOrLon = (int)round(arp_position[1] * 1e2);
|
||||
tmode3.ecefZOrAlt = (int)round(arp_position[2] * 1e2);
|
||||
}
|
||||
tmode3.ecefXOrLatHP = arp_position_hp[0];
|
||||
tmode3.ecefYOrLonHP = arp_position_hp[1];
|
||||
tmode3.ecefZOrAltHP = arp_position_hp[2];
|
||||
// Convert from m to [0.1 mm]
|
||||
tmode3.fixedPosAcc = (uint32_t)round(fixed_pos_acc * 1e4);
|
||||
return configure(tmode3);
|
||||
}
|
||||
|
||||
bool Gps::configTmode3SurveyIn(unsigned int svin_min_dur,
|
||||
float svin_acc_limit) {
|
||||
CfgTMODE3 tmode3;
|
||||
ROS_DEBUG("Setting TMODE3 to Survey In");
|
||||
tmode3.flags = tmode3.FLAGS_MODE_SURVEY_IN & tmode3.FLAGS_MODE_MASK;
|
||||
tmode3.svinMinDur = svin_min_dur;
|
||||
// Convert from m to [0.1 mm]
|
||||
tmode3.svinAccLimit = (int)round(svin_acc_limit * 1e4);
|
||||
return configure(tmode3);
|
||||
}
|
||||
|
||||
bool Gps::disableTmode3() {
|
||||
ROS_DEBUG("Disabling TMODE3");
|
||||
|
||||
CfgTMODE3 tmode3;
|
||||
tmode3.flags = tmode3.FLAGS_MODE_DISABLED & tmode3.FLAGS_MODE_MASK;
|
||||
return configure(tmode3);
|
||||
}
|
||||
|
||||
bool Gps::setRate(uint8_t class_id, uint8_t message_id, uint8_t rate) {
|
||||
ROS_DEBUG_COND(debug >= 2, "Setting rate 0x%02x, 0x%02x, %u", class_id,
|
||||
message_id, rate);
|
||||
ublox_msgs::CfgMSG msg;
|
||||
msg.msgClass = class_id;
|
||||
msg.msgID = message_id;
|
||||
msg.rate = rate;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::setDynamicModel(uint8_t model) {
|
||||
ROS_DEBUG("Setting dynamic model to %u", model);
|
||||
|
||||
ublox_msgs::CfgNAV5 msg;
|
||||
msg.dynModel = model;
|
||||
msg.mask = ublox_msgs::CfgNAV5::MASK_DYN;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::setFixMode(uint8_t mode) {
|
||||
ROS_DEBUG("Setting fix mode to %u", mode);
|
||||
|
||||
ublox_msgs::CfgNAV5 msg;
|
||||
msg.fixMode = mode;
|
||||
msg.mask = ublox_msgs::CfgNAV5::MASK_FIX_MODE;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::setDeadReckonLimit(uint8_t limit) {
|
||||
ROS_DEBUG("Setting DR Limit to %u", limit);
|
||||
|
||||
ublox_msgs::CfgNAV5 msg;
|
||||
msg.drLimit = limit;
|
||||
msg.mask = ublox_msgs::CfgNAV5::MASK_DR_LIM;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::setPpp(bool enable) {
|
||||
ROS_DEBUG("%s PPP", (enable ? "Enabling" : "Disabling"));
|
||||
|
||||
ublox_msgs::CfgNAVX5 msg;
|
||||
msg.usePPP = enable;
|
||||
msg.mask1 = ublox_msgs::CfgNAVX5::MASK1_PPP;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::setDgnss(uint8_t mode) {
|
||||
CfgDGNSS cfg;
|
||||
ROS_DEBUG("Setting DGNSS mode to %u", mode);
|
||||
cfg.dgnssMode = mode;
|
||||
return configure(cfg);
|
||||
}
|
||||
|
||||
bool Gps::setUseAdr(bool enable) {
|
||||
ROS_DEBUG("%s ADR/UDR", (enable ? "Enabling" : "Disabling"));
|
||||
|
||||
ublox_msgs::CfgNAVX5 msg;
|
||||
msg.useAdr = enable;
|
||||
msg.mask2 = ublox_msgs::CfgNAVX5::MASK2_ADR;
|
||||
return configure(msg);
|
||||
}
|
||||
|
||||
bool Gps::poll(uint8_t class_id, uint8_t message_id,
|
||||
const std::vector<uint8_t>& payload) {
|
||||
if (!worker_) return false;
|
||||
|
||||
std::vector<unsigned char> out(kWriterSize);
|
||||
ublox::Writer writer(out.data(), out.size());
|
||||
if (!writer.write(payload.data(), payload.size(), class_id, message_id))
|
||||
return false;
|
||||
worker_->send(out.data(), writer.end() - out.data());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Gps::waitForAcknowledge(const boost::posix_time::time_duration& timeout,
|
||||
uint8_t class_id, uint8_t msg_id) {
|
||||
ROS_DEBUG_COND(debug >= 2, "Waiting for ACK 0x%02x / 0x%02x",
|
||||
class_id, msg_id);
|
||||
boost::posix_time::ptime wait_until(
|
||||
boost::posix_time::second_clock::local_time() + timeout);
|
||||
|
||||
Ack ack = ack_.load(boost::memory_order_seq_cst);
|
||||
while (boost::posix_time::second_clock::local_time() < wait_until
|
||||
&& (ack.class_id != class_id
|
||||
|| ack.msg_id != msg_id
|
||||
|| ack.type == WAIT)) {
|
||||
worker_->wait(timeout);
|
||||
ack = ack_.load(boost::memory_order_seq_cst);
|
||||
}
|
||||
bool result = ack.type == ACK
|
||||
&& ack.class_id == class_id
|
||||
&& ack.msg_id == msg_id;
|
||||
return result;
|
||||
}
|
||||
} // namespace ublox_gps
|
||||
@@ -1,156 +0,0 @@
|
||||
/* mkgmtime.c - make time corresponding to a GMT timeval struct
|
||||
$Id: mkgmtime.c,v 1.10 2003/10/22 18:50:12 rjs3 Exp $
|
||||
|
||||
* Copyright (c) 1998-2003 Carnegie Mellon University. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. The name "Carnegie Mellon University" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For permission or any other legal
|
||||
* details, please contact
|
||||
* Office of Technology Transfer
|
||||
* Carnegie Mellon University
|
||||
* 5000 Forbes Avenue
|
||||
* Pittsburgh, PA 15213-3890
|
||||
* (412) 268-4387, fax: (412) 268-7395
|
||||
* tech-transfer@andrew.cmu.edu
|
||||
*
|
||||
* 4. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by Computing Services
|
||||
* at Carnegie Mellon University (http://www.cmu.edu/computing/)."
|
||||
*
|
||||
* CARNEGIE MELLON UNIVERSITY DISCLAIMS ALL WARRANTIES WITH REGARD TO
|
||||
* THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||
* AND FITNESS, IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
|
||||
* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
|
||||
* OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* Copyright (c) 1987, 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Arthur David Olson of the National Cancer Institute.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/*
|
||||
** Adapted from code provided by Robert Elz, who writes:
|
||||
** The "best" way to do mktime I think is based on an idea of Bob
|
||||
** Kridle's (so its said...) from a long time ago. (mtxinu!kridle now).
|
||||
** It does a binary search of the time_t space. Since time_t's are
|
||||
** just 32 bits, its a max of 32 iterations (even at 64 bits it
|
||||
** would still be very reasonable).
|
||||
*/
|
||||
|
||||
#include "ublox_gps/mkgmtime.h"
|
||||
#ifndef WRONG
|
||||
#define WRONG (-1)
|
||||
#endif /* !defined WRONG */
|
||||
|
||||
static int tmcomp(register const struct tm * const atmp,
|
||||
register const struct tm * const btmp)
|
||||
{
|
||||
register int result;
|
||||
|
||||
if ((result = (atmp->tm_year - btmp->tm_year)) == 0 &&
|
||||
(result = (atmp->tm_mon - btmp->tm_mon)) == 0 &&
|
||||
(result = (atmp->tm_mday - btmp->tm_mday)) == 0 &&
|
||||
(result = (atmp->tm_hour - btmp->tm_hour)) == 0 &&
|
||||
(result = (atmp->tm_min - btmp->tm_min)) == 0)
|
||||
result = atmp->tm_sec - btmp->tm_sec;
|
||||
return result;
|
||||
}
|
||||
|
||||
time_t mkgmtime(struct tm * const tmp) {
|
||||
register int dir;
|
||||
register int bits;
|
||||
register int saved_seconds;
|
||||
time_t t;
|
||||
struct tm yourtm, *mytm;
|
||||
|
||||
yourtm = *tmp;
|
||||
saved_seconds = yourtm.tm_sec;
|
||||
yourtm.tm_sec = 0;
|
||||
/*
|
||||
** Calculate the number of magnitude bits in a time_t
|
||||
** (this works regardless of whether time_t is
|
||||
** signed or unsigned, though lint complains if unsigned).
|
||||
*/
|
||||
for (bits = 0, t = 1; t > 0; ++bits, t <<= 1)
|
||||
;
|
||||
/*
|
||||
** If time_t is signed, then 0 is the median value,
|
||||
** if time_t is unsigned, then 1 << bits is median.
|
||||
*/
|
||||
t = (t < 0) ? 0 : ((time_t) 1 << bits);
|
||||
|
||||
/* Some gmtime() implementations are broken and will return
|
||||
* NULL for time_ts larger than 40 bits even on 64-bit platforms
|
||||
* so we'll just cap it at 40 bits */
|
||||
if(bits > 40) bits = 40;
|
||||
|
||||
for ( ; ; ) {
|
||||
mytm = gmtime(&t);
|
||||
|
||||
if(!mytm) return WRONG;
|
||||
|
||||
dir = tmcomp(mytm, &yourtm);
|
||||
if (dir != 0) {
|
||||
if (bits-- < 0)
|
||||
return WRONG;
|
||||
if (bits < 0)
|
||||
--t;
|
||||
else if (dir > 0)
|
||||
t -= (time_t) 1 << bits;
|
||||
else t += (time_t) 1 << bits;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
t += saved_seconds;
|
||||
return t;
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,37 +0,0 @@
|
||||
cmake_minimum_required(VERSION 2.8.3)
|
||||
project(ublox_msgs)
|
||||
|
||||
find_package(catkin REQUIRED COMPONENTS message_generation ublox_serialization std_msgs sensor_msgs)
|
||||
|
||||
add_message_files(DIRECTORY msg)
|
||||
generate_messages(DEPENDENCIES std_msgs sensor_msgs)
|
||||
|
||||
catkin_package(
|
||||
INCLUDE_DIRS include
|
||||
LIBRARIES ${PROJECT_NAME}
|
||||
CATKIN_DEPENDS message_runtime ublox_serialization std_msgs sensor_msgs)
|
||||
|
||||
include_directories(${PROJECT_SOURCE_DIR}/include)
|
||||
include_directories(${ublox_serialization_INCLUDE_DIRS})
|
||||
|
||||
add_library(${PROJECT_NAME} src/ublox_msgs.cpp)
|
||||
|
||||
add_dependencies(${PROJECT_NAME}
|
||||
${${PROJECT_NAME}_EXPORTED_TARGETS}
|
||||
${catkin_EXPORTED_TARGETS}
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME}
|
||||
${catkin_LIBRARIES}
|
||||
)
|
||||
|
||||
install(TARGETS ${PROJECT_NAME}
|
||||
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
|
||||
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
|
||||
)
|
||||
|
||||
install(DIRECTORY include/
|
||||
DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION}
|
||||
PATTERN ".svn" EXCLUDE
|
||||
)
|
||||
@@ -1,883 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
|
||||
#ifndef UBLOX_SERIALIZATION_UBLOX_MSGS_H
|
||||
#define UBLOX_SERIALIZATION_UBLOX_MSGS_H
|
||||
|
||||
#include <ros/console.h>
|
||||
#include <ublox/serialization.h>
|
||||
#include <ublox_msgs/ublox_msgs.h>
|
||||
|
||||
///
|
||||
/// This file declares custom serializers for u-blox messages with dynamic
|
||||
/// lengths and messages where the get/set messages have different sizes, but
|
||||
/// share the same parameters, such as CfgDAT.
|
||||
///
|
||||
|
||||
namespace ublox {
|
||||
|
||||
///
|
||||
/// @brief Serializes the CfgDAT message which has a different length for
|
||||
/// get/set.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::CfgDAT_<ContainerAllocator> > {
|
||||
typedef boost::call_traits<ublox_msgs::CfgDAT_<ContainerAllocator> >
|
||||
CallTraits;
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.datumNum);
|
||||
stream.next(m.datumName);
|
||||
stream.next(m.majA);
|
||||
stream.next(m.flat);
|
||||
stream.next(m.dX);
|
||||
stream.next(m.dY);
|
||||
stream.next(m.dZ);
|
||||
stream.next(m.rotX);
|
||||
stream.next(m.rotY);
|
||||
stream.next(m.rotZ);
|
||||
stream.next(m.scale);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
// this is the size of CfgDAT set messages
|
||||
// serializedLength is only used for writes so this is ok
|
||||
return 44;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
// ignores datumNum & datumName
|
||||
stream.next(m.majA);
|
||||
stream.next(m.flat);
|
||||
stream.next(m.dX);
|
||||
stream.next(m.dY);
|
||||
stream.next(m.dZ);
|
||||
stream.next(m.rotX);
|
||||
stream.next(m.rotY);
|
||||
stream.next(m.rotZ);
|
||||
stream.next(m.scale);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the CfgGNSS message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::CfgGNSS_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::CfgGNSS_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.msgVer);
|
||||
stream.next(m.numTrkChHw);
|
||||
stream.next(m.numTrkChUse);
|
||||
stream.next(m.numConfigBlocks);
|
||||
m.blocks.resize(m.numConfigBlocks);
|
||||
for(std::size_t i = 0; i < m.blocks.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.blocks[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 4 + 8 * m.numConfigBlocks;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.blocks.size() != m.numConfigBlocks) {
|
||||
ROS_ERROR("CfgGNSS numConfigBlocks must equal blocks size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.msgVer);
|
||||
stream.next(m.numTrkChHw);
|
||||
stream.next(m.numTrkChUse);
|
||||
stream.next(
|
||||
static_cast<typename Msg::_numConfigBlocks_type>(m.blocks.size()));
|
||||
for(std::size_t i = 0; i < m.blocks.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.blocks[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the CfgInf message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::CfgINF_<ContainerAllocator> > {
|
||||
typedef boost::call_traits<ublox_msgs::CfgINF_<ContainerAllocator> >
|
||||
CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
int num_blocks = count / 10;
|
||||
m.blocks.resize(num_blocks);
|
||||
for(std::size_t i = 0; i < num_blocks; ++i)
|
||||
ros::serialization::deserialize(stream, m.blocks[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 10 * m.blocks.size();
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
for(std::size_t i = 0; i < m.blocks.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.blocks[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the Inf message which has a dynamic length string.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::Inf_<ContainerAllocator> > {
|
||||
typedef boost::call_traits<ublox_msgs::Inf_<ContainerAllocator> > CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
m.str.resize(count);
|
||||
for (int i = 0; i < count; ++i)
|
||||
ros::serialization::deserialize(stream, m.str[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return m.str.size();
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
for(std::size_t i = 0; i < m.str.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.str[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the MonVER message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::MonVER_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::MonVER_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.swVersion);
|
||||
stream.next(m.hwVersion);
|
||||
|
||||
m.extension.clear();
|
||||
int N = (count - 40) / 30;
|
||||
m.extension.reserve(N);
|
||||
typename Msg::_extension_type::value_type ext;
|
||||
for (int i = 0; i < N; i++) {
|
||||
// Read each extension string
|
||||
stream.next(ext);
|
||||
m.extension.push_back(ext);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength(typename CallTraits::param_type m) {
|
||||
return 40 + (30 * m.extension.size());
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.swVersion);
|
||||
stream.next(m.hwVersion);
|
||||
for(std::size_t i = 0; i < m.extension.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.extension[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the NavDGPS message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::NavDGPS_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::NavDGPS_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.age);
|
||||
stream.next(m.baseId);
|
||||
stream.next(m.baseHealth);
|
||||
stream.next(m.numCh);
|
||||
stream.next(m.status);
|
||||
stream.next(m.reserved1);
|
||||
m.sv.resize(m.numCh);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 16 + 12 * m.numCh;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.numCh) {
|
||||
ROS_ERROR("NavDGPS numCh must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.age);
|
||||
stream.next(m.baseId);
|
||||
stream.next(m.baseHealth);
|
||||
stream.next(static_cast<typename Msg::_numCh_type>(m.sv.size()));
|
||||
stream.next(m.status);
|
||||
stream.next(m.reserved1);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
///
|
||||
/// @brief Serializes the NavSBAS message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::NavSBAS_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::NavSBAS_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.geo);
|
||||
stream.next(m.mode);
|
||||
stream.next(m.sys);
|
||||
stream.next(m.service);
|
||||
stream.next(m.cnt);
|
||||
stream.next(m.reserved0);
|
||||
m.sv.resize(m.cnt);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 12 + 12 * m.cnt;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.cnt) {
|
||||
ROS_ERROR("NavSBAS cnt must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.geo);
|
||||
stream.next(m.mode);
|
||||
stream.next(m.sys);
|
||||
stream.next(m.service);
|
||||
stream.next(static_cast<typename Msg::_cnt_type>(m.sv.size()));
|
||||
stream.next(m.reserved0);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the NavSAT message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::NavSAT_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::NavSAT_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.version);
|
||||
stream.next(m.numSvs);
|
||||
stream.next(m.reserved0);
|
||||
m.sv.resize(m.numSvs);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + 12 * m.numSvs;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.numSvs) {
|
||||
ROS_ERROR("NavSAT numSvs must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.version);
|
||||
stream.next(static_cast<typename Msg::_numSvs_type>(m.sv.size()));
|
||||
stream.next(m.reserved0);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the NavDGPS message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::NavSVINFO_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::NavSVINFO_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.numCh);
|
||||
stream.next(m.globalFlags);
|
||||
stream.next(m.reserved2);
|
||||
m.sv.resize(m.numCh);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + 12 * m.numCh;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.numCh) {
|
||||
ROS_ERROR("NavSVINFO numCh must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(static_cast<typename Msg::_numCh_type>(m.sv.size()));
|
||||
stream.next(m.globalFlags);
|
||||
stream.next(m.reserved2);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmRAW message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmRAW_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::RxmRAW_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.rcvTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(m.numSV);
|
||||
stream.next(m.reserved1);
|
||||
m.sv.resize(m.numSV);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + 24 * m.numSV;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.numSV) {
|
||||
ROS_ERROR("RxmRAW numSV must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.rcvTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(static_cast<typename Msg::_numSV_type>(m.sv.size()));
|
||||
stream.next(m.reserved1);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmRAWX message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmRAWX_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::RxmRAWX_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.rcvTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(m.leapS);
|
||||
stream.next(m.numMeas);
|
||||
stream.next(m.recStat);
|
||||
stream.next(m.version);
|
||||
stream.next(m.reserved1);
|
||||
m.meas.resize(m.numMeas);
|
||||
for(std::size_t i = 0; i < m.meas.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.meas[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 16 + 32 * m.numMeas;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.meas.size() != m.numMeas) {
|
||||
ROS_ERROR("RxmRAWX numMeas must equal meas size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.rcvTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(m.leapS);
|
||||
stream.next(static_cast<typename Msg::_numMeas_type>(m.meas.size()));
|
||||
stream.next(m.recStat);
|
||||
stream.next(m.version);
|
||||
stream.next(m.reserved1);
|
||||
for(std::size_t i = 0; i < m.meas.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.meas[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmSFRBX message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmSFRBX_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::RxmSFRBX_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.gnssId);
|
||||
stream.next(m.svId);
|
||||
stream.next(m.reserved0);
|
||||
stream.next(m.freqId);
|
||||
stream.next(m.numWords);
|
||||
stream.next(m.chn);
|
||||
stream.next(m.version);
|
||||
stream.next(m.reserved1);
|
||||
m.dwrd.resize(m.numWords);
|
||||
for(std::size_t i = 0; i < m.dwrd.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.dwrd[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + 4 * m.numWords;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.dwrd.size() != m.numWords) {
|
||||
ROS_ERROR("RxmSFRBX numWords must equal dwrd size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.gnssId);
|
||||
stream.next(m.svId);
|
||||
stream.next(m.reserved0);
|
||||
stream.next(m.freqId);
|
||||
stream.next(static_cast<typename Msg::_numWords_type>(m.dwrd.size()));
|
||||
stream.next(m.chn);
|
||||
stream.next(m.version);
|
||||
stream.next(m.reserved1);
|
||||
for(std::size_t i = 0; i < m.dwrd.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.dwrd[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmSVSI message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmSVSI_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::RxmSVSI_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(m.numVis);
|
||||
stream.next(m.numSV);
|
||||
m.sv.resize(m.numSV);
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sv[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + 6 * m.numSV;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sv.size() != m.numSV) {
|
||||
ROS_ERROR("RxmSVSI numSV must equal sv size");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.week);
|
||||
stream.next(m.numVis);
|
||||
stream.next(static_cast<typename Msg::_numSV_type>(m.sv.size()));
|
||||
for(std::size_t i = 0; i < m.sv.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sv[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmALM message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmALM_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::RxmALM_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.week);
|
||||
|
||||
m.dwrd.clear();
|
||||
if(count == 40) {
|
||||
typename Msg::_dwrd_type::value_type temp;
|
||||
m.dwrd.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp);
|
||||
m.dwrd.push_back(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + (4 * m.dwrd.size());
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.week);
|
||||
for(std::size_t i = 0; i < m.dwrd.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.dwrd[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the RxmEPH message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::RxmEPH_<ContainerAllocator> >
|
||||
{
|
||||
typedef ublox_msgs::RxmEPH_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.how);
|
||||
m.sf1d.clear();
|
||||
m.sf2d.clear();
|
||||
m.sf3d.clear();
|
||||
|
||||
if (count == 104) {
|
||||
typename Msg::_sf1d_type::value_type temp1;
|
||||
typename Msg::_sf2d_type::value_type temp2;
|
||||
typename Msg::_sf3d_type::value_type temp3;
|
||||
|
||||
m.sf1d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp1);
|
||||
m.sf1d.push_back(temp1);
|
||||
}
|
||||
m.sf2d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp2);
|
||||
m.sf2d.push_back(temp2);
|
||||
}
|
||||
m.sf3d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp3);
|
||||
m.sf3d.push_back(temp3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + (4 * m.sf1d.size()) + (4 * m.sf2d.size()) + (4 * m.sf3d.size());
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.how);
|
||||
for(std::size_t i = 0; i < m.sf1d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf1d[i]);
|
||||
for(std::size_t i = 0; i < m.sf2d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf2d[i]);
|
||||
for(std::size_t i = 0; i < m.sf3d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf3d[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the AidALM message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::AidALM_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::AidALM_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.week);
|
||||
|
||||
m.dwrd.clear();
|
||||
if (count == 40) {
|
||||
typename Msg::_dwrd_type::value_type temp;
|
||||
m.dwrd.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp);
|
||||
m.dwrd.push_back(temp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + (4 * m.dwrd.size());
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.week);
|
||||
for(std::size_t i = 0; i < m.dwrd.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.dwrd[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the AidEPH message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::AidEPH_<ContainerAllocator> >
|
||||
{
|
||||
typedef ublox_msgs::AidEPH_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.how);
|
||||
m.sf1d.clear();
|
||||
m.sf2d.clear();
|
||||
m.sf3d.clear();
|
||||
|
||||
if (count == 104) {
|
||||
typename Msg::_sf1d_type::value_type temp1;
|
||||
typename Msg::_sf2d_type::value_type temp2;
|
||||
typename Msg::_sf3d_type::value_type temp3;
|
||||
m.sf1d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp1);
|
||||
m.sf1d.push_back(temp1);
|
||||
}
|
||||
m.sf2d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp2);
|
||||
m.sf2d.push_back(temp2);
|
||||
}
|
||||
m.sf3d.resize(8);
|
||||
for(std::size_t i = 0; i < 8; ++i) {
|
||||
stream.next(temp3);
|
||||
m.sf3d.push_back(temp3);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 8 + (4 * m.sf1d.size()) + (4 * m.sf2d.size()) + (4 * m.sf3d.size());
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.svid);
|
||||
stream.next(m.how);
|
||||
for(std::size_t i = 0; i < m.sf1d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf1d[i]);
|
||||
for(std::size_t i = 0; i < m.sf2d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf2d[i]);
|
||||
for(std::size_t i = 0; i < m.sf3d.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sf3d[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the EsfMEAS message which has a repeated block and an
|
||||
/// optional block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::EsfMEAS_<ContainerAllocator> > {
|
||||
typedef boost::call_traits<ublox_msgs::EsfMEAS_<ContainerAllocator> >
|
||||
CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.timeTag);
|
||||
stream.next(m.flags);
|
||||
stream.next(m.id);
|
||||
|
||||
bool calib_valid = m.flags & m.FLAGS_CALIB_T_TAG_VALID;
|
||||
int data_size = (count - (calib_valid ? 12 : 8)) / 4;
|
||||
// Repeating block
|
||||
m.data.resize(data_size);
|
||||
for(std::size_t i = 0; i < data_size; ++i)
|
||||
ros::serialization::deserialize(stream, m.data[i]);
|
||||
// Optional block
|
||||
if(calib_valid) {
|
||||
m.calibTtag.resize(1);
|
||||
ros::serialization::deserialize(stream, m.calibTtag[0]);
|
||||
}
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 4 + 8 * m.data.size() + 4 * m.calibTtag.size();
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.timeTag);
|
||||
stream.next(m.flags);
|
||||
stream.next(m.id);
|
||||
for(std::size_t i = 0; i < m.data.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.data[i]);
|
||||
for(std::size_t i = 0; i < m.calibTtag.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.calibTtag[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the EsfRAW message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::EsfRAW_<ContainerAllocator> > {
|
||||
typedef boost::call_traits<ublox_msgs::EsfRAW_<ContainerAllocator> >
|
||||
CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.reserved0);
|
||||
m.blocks.clear();
|
||||
int num_blocks = (count - 4) / 8;
|
||||
m.blocks.resize(num_blocks);
|
||||
for(std::size_t i = 0; i < num_blocks; ++i)
|
||||
ros::serialization::deserialize(stream, m.blocks[i]);
|
||||
}
|
||||
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 4 + 8 * m.blocks.size();
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.reserved0);
|
||||
for(std::size_t i = 0; i < m.blocks.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.blocks[i]);
|
||||
}
|
||||
};
|
||||
|
||||
///
|
||||
/// @brief Serializes the EsfSTATUS message which has a repeated block.
|
||||
///
|
||||
template <typename ContainerAllocator>
|
||||
struct Serializer<ublox_msgs::EsfSTATUS_<ContainerAllocator> > {
|
||||
typedef ublox_msgs::EsfSTATUS_<ContainerAllocator> Msg;
|
||||
typedef boost::call_traits<Msg> CallTraits;
|
||||
|
||||
static void read(const uint8_t *data, uint32_t count,
|
||||
typename CallTraits::reference m) {
|
||||
ros::serialization::IStream stream(const_cast<uint8_t *>(data), count);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.version);
|
||||
stream.next(m.fusionMode);
|
||||
stream.next(m.reserved2);
|
||||
stream.next(m.numSens);
|
||||
m.sens.resize(m.numSens);
|
||||
for(std::size_t i = 0; i < m.sens.size(); ++i)
|
||||
ros::serialization::deserialize(stream, m.sens[i]);
|
||||
}
|
||||
|
||||
static uint32_t serializedLength (typename CallTraits::param_type m) {
|
||||
return 16 + 4 * m.numSens;
|
||||
}
|
||||
|
||||
static void write(uint8_t *data, uint32_t size,
|
||||
typename CallTraits::param_type m) {
|
||||
if(m.sens.size() != m.numSens) {
|
||||
ROS_ERROR("Writing EsfSTATUS message: numSens must equal size of sens");
|
||||
}
|
||||
ros::serialization::OStream stream(data, size);
|
||||
stream.next(m.iTOW);
|
||||
stream.next(m.version);
|
||||
stream.next(m.fusionMode);
|
||||
stream.next(m.reserved2);
|
||||
stream.next(static_cast<typename Msg::_numSens_type>(m.sens.size()));
|
||||
for(std::size_t i = 0; i < m.sens.size(); ++i)
|
||||
ros::serialization::serialize(stream, m.sens[i]);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
} // namespace ublox
|
||||
|
||||
#endif // UBLOX_SERIALIZATION_UBLOX_MSGS_H
|
||||
@@ -1,251 +0,0 @@
|
||||
//==============================================================================
|
||||
// Copyright (c) 2012, Johannes Meyer, TU Darmstadt
|
||||
// All rights reserved.
|
||||
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above copyright
|
||||
// notice, this list of conditions and the following disclaimer in the
|
||||
// documentation and/or other materials provided with the distribution.
|
||||
// * Neither the name of the Flight Systems and Automatic Control group,
|
||||
// TU Darmstadt, nor the names of its contributors may be used to
|
||||
// endorse or promote products derived from this software without
|
||||
// specific prior written permission.
|
||||
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
|
||||
// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
//==============================================================================
|
||||
|
||||
#ifndef UBLOX_MSGS_H
|
||||
#define UBLOX_MSGS_H
|
||||
|
||||
#include <ublox_msgs/NavATT.h>
|
||||
#include <ublox_msgs/NavCLOCK.h>
|
||||
#include <ublox_msgs/NavDGPS.h>
|
||||
#include <ublox_msgs/NavDOP.h>
|
||||
#include <ublox_msgs/NavPOSECEF.h>
|
||||
#include <ublox_msgs/NavPOSLLH.h>
|
||||
#include <ublox_msgs/NavRELPOSNED.h>
|
||||
#include <ublox_msgs/NavSBAS.h>
|
||||
#include <ublox_msgs/NavSOL.h>
|
||||
#include <ublox_msgs/NavPVT.h>
|
||||
#include <ublox_msgs/NavPVT7.h>
|
||||
#include <ublox_msgs/NavSTATUS.h>
|
||||
#include <ublox_msgs/NavSAT.h>
|
||||
#include <ublox_msgs/NavSVIN.h>
|
||||
#include <ublox_msgs/NavSVINFO.h>
|
||||
#include <ublox_msgs/NavTIMEGPS.h>
|
||||
#include <ublox_msgs/NavTIMEUTC.h>
|
||||
#include <ublox_msgs/NavVELECEF.h>
|
||||
#include <ublox_msgs/NavVELNED.h>
|
||||
|
||||
#include <ublox_msgs/RxmALM.h>
|
||||
#include <ublox_msgs/RxmEPH.h>
|
||||
#include <ublox_msgs/RxmRAW.h>
|
||||
#include <ublox_msgs/RxmRAW_SV.h>
|
||||
#include <ublox_msgs/RxmRAWX.h>
|
||||
#include <ublox_msgs/RxmRAWX_Meas.h>
|
||||
#include <ublox_msgs/RxmRTCM.h>
|
||||
#include <ublox_msgs/RxmSFRB.h>
|
||||
#include <ublox_msgs/RxmSFRBX.h>
|
||||
#include <ublox_msgs/RxmSVSI.h>
|
||||
|
||||
#include <ublox_msgs/Inf.h>
|
||||
#include <ublox_msgs/Ack.h>
|
||||
|
||||
#include <ublox_msgs/CfgANT.h>
|
||||
#include <ublox_msgs/CfgCFG.h>
|
||||
#include <ublox_msgs/CfgDAT.h>
|
||||
#include <ublox_msgs/CfgDGNSS.h>
|
||||
#include <ublox_msgs/CfgGNSS.h>
|
||||
#include <ublox_msgs/CfgHNR.h>
|
||||
#include <ublox_msgs/CfgINF.h>
|
||||
#include <ublox_msgs/CfgINF_Block.h>
|
||||
#include <ublox_msgs/CfgMSG.h>
|
||||
#include <ublox_msgs/CfgNAV5.h>
|
||||
#include <ublox_msgs/CfgNAVX5.h>
|
||||
#include <ublox_msgs/CfgNMEA.h>
|
||||
#include <ublox_msgs/CfgNMEA6.h>
|
||||
#include <ublox_msgs/CfgNMEA7.h>
|
||||
#include <ublox_msgs/CfgPRT.h>
|
||||
#include <ublox_msgs/CfgRATE.h>
|
||||
#include <ublox_msgs/CfgRST.h>
|
||||
#include <ublox_msgs/CfgSBAS.h>
|
||||
#include <ublox_msgs/CfgTMODE3.h>
|
||||
#include <ublox_msgs/CfgUSB.h>
|
||||
|
||||
#include <ublox_msgs/UpdSOS.h>
|
||||
#include <ublox_msgs/UpdSOS_Ack.h>
|
||||
|
||||
#include <ublox_msgs/MonGNSS.h>
|
||||
#include <ublox_msgs/MonHW.h>
|
||||
#include <ublox_msgs/MonHW6.h>
|
||||
#include <ublox_msgs/MonVER.h>
|
||||
|
||||
#include <ublox_msgs/AidALM.h>
|
||||
#include <ublox_msgs/AidEPH.h>
|
||||
#include <ublox_msgs/AidHUI.h>
|
||||
|
||||
#include <ublox_msgs/EsfINS.h>
|
||||
#include <ublox_msgs/EsfMEAS.h>
|
||||
#include <ublox_msgs/EsfRAW.h>
|
||||
#include <ublox_msgs/EsfSTATUS.h>
|
||||
#include <ublox_msgs/EsfSTATUS_Sens.h>
|
||||
|
||||
#include <ublox_msgs/MgaGAL.h>
|
||||
|
||||
#include <ublox_msgs/HnrPVT.h>
|
||||
|
||||
namespace ublox_msgs {
|
||||
|
||||
namespace Class {
|
||||
static const uint8_t NAV = 0x01; //!< Navigation Result Messages: Position,
|
||||
//!< Speed, Time, Acceleration, Heading,
|
||||
//!< DOP, SVs used
|
||||
static const uint8_t RXM = 0x02; //!< Receiver Manager Messages:
|
||||
//!< Satellite Status, RTC Status
|
||||
static const uint8_t INF = 0x04; //!< Information Messages:
|
||||
//!< Printf-Style Messages, with IDs such as
|
||||
//!< Error, Warning, Notice
|
||||
static const uint8_t ACK = 0x05; //!< Ack/Nack Messages: Acknowledge or Reject
|
||||
//!< messages to CFG input messages
|
||||
static const uint8_t CFG = 0x06; //!< Configuration Input Messages: Set
|
||||
//!< Dynamic Model, Set DOP Mask, Set Baud
|
||||
//!< Rate, etc.
|
||||
static const uint8_t UPD = 0x09; //!< Firmware Update Messages: i.e.
|
||||
//!< Memory/Flash erase/write, Reboot, Flash
|
||||
//!< identification, etc.
|
||||
//!< Used to update the firmware and identify
|
||||
//!< any attached flash device
|
||||
static const uint8_t MON = 0x0A; //!< Monitoring Messages: Communication
|
||||
//!< Status, CPU Load, Stack Usage,
|
||||
//!< Task Status
|
||||
static const uint8_t AID = 0x0B; //!< AssistNow Aiding Messages: Ephemeris,
|
||||
//!< Almanac, other A-GPS data input
|
||||
static const uint8_t TIM = 0x0D; //!< Timing Messages: Timepulse Output,
|
||||
//!< Timemark Results
|
||||
static const uint8_t ESF = 0x10; //!< External Sensor Fusion Messages:
|
||||
//!< External sensor measurements and status
|
||||
//!< information
|
||||
static const uint8_t MGA = 0x13; //!< Multiple GNSS Assistance Messages:
|
||||
//!< Assistance data for various GNSS
|
||||
static const uint8_t LOG = 0x21; //!< Logging Messages: Log creation,
|
||||
//!< deletion, info and retrieval
|
||||
static const uint8_t SEC = 0x27; //!< Security Feature Messages
|
||||
static const uint8_t HNR = 0x28; //!< High Rate Navigation Results Messages:
|
||||
//!< High rate time, position, speed, heading
|
||||
static const uint8_t RTCM = 0xF5; //!< RTCM Configuration Messages
|
||||
}
|
||||
|
||||
namespace Message {
|
||||
namespace NAV {
|
||||
static const uint8_t ATT = NavATT::MESSAGE_ID;
|
||||
static const uint8_t CLOCK = NavCLOCK::MESSAGE_ID;
|
||||
static const uint8_t DGPS = NavDGPS::MESSAGE_ID;
|
||||
static const uint8_t DOP = NavDOP::MESSAGE_ID;
|
||||
static const uint8_t POSECEF = NavPOSECEF::MESSAGE_ID;
|
||||
static const uint8_t POSLLH = NavPOSLLH::MESSAGE_ID;
|
||||
static const uint8_t RELPOSNED = NavRELPOSNED::MESSAGE_ID;
|
||||
static const uint8_t SBAS = NavSBAS::MESSAGE_ID;
|
||||
static const uint8_t SOL = NavSOL::MESSAGE_ID;
|
||||
static const uint8_t PVT = NavPVT::MESSAGE_ID;
|
||||
static const uint8_t SAT = NavSAT::MESSAGE_ID;
|
||||
static const uint8_t STATUS = NavSTATUS::MESSAGE_ID;
|
||||
static const uint8_t SVINFO = NavSVINFO::MESSAGE_ID;
|
||||
static const uint8_t SVIN = NavSVIN::MESSAGE_ID;
|
||||
static const uint8_t TIMEGPS = NavTIMEGPS::MESSAGE_ID;
|
||||
static const uint8_t TIMEUTC = NavTIMEUTC::MESSAGE_ID;
|
||||
static const uint8_t VELECEF = NavVELECEF::MESSAGE_ID;
|
||||
static const uint8_t VELNED = NavVELNED::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace RXM {
|
||||
static const uint8_t ALM = RxmALM::MESSAGE_ID;
|
||||
static const uint8_t EPH = RxmEPH::MESSAGE_ID;
|
||||
static const uint8_t RAW = RxmRAW::MESSAGE_ID;
|
||||
static const uint8_t RAWX = RxmRAWX::MESSAGE_ID;
|
||||
static const uint8_t RTCM = RxmRTCM::MESSAGE_ID;
|
||||
static const uint8_t SFRB = RxmSFRB::MESSAGE_ID;
|
||||
static const uint8_t SFRBX = RxmSFRBX::MESSAGE_ID;
|
||||
static const uint8_t SVSI = RxmSVSI::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace INF {
|
||||
static const uint8_t ERROR = 0x00;
|
||||
static const uint8_t WARNING = 0x01;
|
||||
static const uint8_t NOTICE = 0x02;
|
||||
static const uint8_t TEST = 0x03;
|
||||
static const uint8_t DEBUG = 0x04;
|
||||
}
|
||||
|
||||
namespace ACK {
|
||||
static const uint8_t NACK = 0x00;
|
||||
static const uint8_t ACK = 0x01;
|
||||
}
|
||||
|
||||
namespace AID {
|
||||
static const uint8_t ALM = AidALM::MESSAGE_ID;
|
||||
static const uint8_t EPH = AidEPH::MESSAGE_ID;
|
||||
static const uint8_t HUI = AidHUI::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace CFG {
|
||||
static const uint8_t ANT = CfgANT::MESSAGE_ID;
|
||||
static const uint8_t CFG = CfgCFG::MESSAGE_ID;
|
||||
static const uint8_t DAT = CfgDAT::MESSAGE_ID;
|
||||
static const uint8_t GNSS = CfgGNSS::MESSAGE_ID;
|
||||
static const uint8_t HNR = CfgHNR::MESSAGE_ID;
|
||||
static const uint8_t INF = CfgINF::MESSAGE_ID;
|
||||
static const uint8_t DGNSS = CfgDGNSS::MESSAGE_ID;
|
||||
static const uint8_t MSG = CfgMSG::MESSAGE_ID;
|
||||
static const uint8_t NAV5 = CfgNAV5::MESSAGE_ID;
|
||||
static const uint8_t NAVX5 = CfgNAVX5::MESSAGE_ID;
|
||||
static const uint8_t NMEA = CfgNMEA::MESSAGE_ID;
|
||||
static const uint8_t PRT = CfgPRT::MESSAGE_ID;
|
||||
static const uint8_t RATE = CfgRATE::MESSAGE_ID;
|
||||
static const uint8_t RST = CfgRST::MESSAGE_ID;
|
||||
static const uint8_t SBAS = CfgSBAS::MESSAGE_ID;
|
||||
static const uint8_t TMODE3 = CfgTMODE3::MESSAGE_ID;
|
||||
static const uint8_t USB = CfgUSB::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace UPD {
|
||||
//! SOS and SOS_Ack have the same message ID, but different lengths
|
||||
static const uint8_t SOS = UpdSOS::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace MON {
|
||||
static const uint8_t GNSS = MonGNSS::MESSAGE_ID;
|
||||
static const uint8_t HW = MonHW::MESSAGE_ID;
|
||||
static const uint8_t VER = MonVER::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace ESF {
|
||||
static const uint8_t INS = EsfINS::MESSAGE_ID;
|
||||
static const uint8_t MEAS = EsfMEAS::MESSAGE_ID;
|
||||
static const uint8_t RAW = EsfRAW::MESSAGE_ID;
|
||||
static const uint8_t STATUS = EsfSTATUS::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace MGA {
|
||||
static const uint8_t GAL = MgaGAL::MESSAGE_ID;
|
||||
}
|
||||
|
||||
namespace HNR {
|
||||
static const uint8_t PVT = HnrPVT::MESSAGE_ID;
|
||||
}
|
||||
}
|
||||
|
||||
} //!< namespace ublox_msgs
|
||||
|
||||
#endif //!< UBLOX_MSGS_H
|
||||
@@ -1,12 +0,0 @@
|
||||
# ACK (0x05)
|
||||
# Message Acknowledged / Not-Acknowledged
|
||||
#
|
||||
# Output upon processing of an input message
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 5
|
||||
uint8 NACK_MESSAGE_ID = 0
|
||||
uint8 ACK_MESSAGE_ID = 1
|
||||
|
||||
uint8 clsID # Class ID of the (Not-)Acknowledged Message
|
||||
uint8 msgID # Message ID of the (Not-)Acknowledged Message
|
||||
@@ -1,28 +0,0 @@
|
||||
# AID-ALM (0x0B 0x30)
|
||||
# GPS Aiding Almanach Input/Output Message
|
||||
#
|
||||
# All UBX-AID messages are deprecated; use UBX-MGA messages instead
|
||||
# - If the WEEK Value is 0, DWRD0 to DWRD7 are not sent as the almanach is not
|
||||
# available for the given SV. This may happen even if NAV-SVINFO and RXM-SVSI
|
||||
# are indicating almanac availability as the internal data may not represent
|
||||
# the content of an original broadcast almanac (or only parts thereof).
|
||||
# - DWORD0 to DWORD7 contain the 8 words following the Hand-Over Word ( HOW )
|
||||
# from the GPS navigation message, either pages 1 to 24 of sub-frame 5 or
|
||||
# pages 2 to 10 of subframe 4. See IS-GPS-200 for a full description of the
|
||||
# contents of the Almanac pages.
|
||||
# - In DWORD0 to DWORD7, the parity bits have been removed, and the 24 bits of
|
||||
# data are located in Bits 0 to 23. Bits 24 to 31 shall be ignored.
|
||||
# - Example: Parameter e (Eccentricity) from Almanach Subframe 4/5, Word 3,
|
||||
# Bits 69-84 within the subframe can be found in DWRD0, Bits 15-0 whereas
|
||||
# Bit 0 is the LSB.
|
||||
|
||||
uint8 CLASS_ID = 11
|
||||
uint8 MESSAGE_ID = 48
|
||||
|
||||
uint32 svid # SV ID for which the receiver shall return its
|
||||
# Almanac Data (Valid Range: 1 .. 32 or 51, 56, 63).
|
||||
uint32 week # Issue Date of Almanach (GPS week number)
|
||||
|
||||
# Start of optional block
|
||||
uint32[] dwrd # Almanach Words
|
||||
# End of optional block
|
||||
@@ -1,33 +0,0 @@
|
||||
# AID-EPH (0x0B 0x31)
|
||||
# GPS Aiding Ephemeris Input/Output Message
|
||||
#
|
||||
# All UBX-AID messages are deprecated; use UBX-MGA messages instead
|
||||
# - SF1D0 to SF3D7 is only sent if ephemeris is available for this SV. If not, the payload may
|
||||
# be reduced to 8 Bytes, or all bytes are set to zero, indicating that this SV Number does
|
||||
# not have valid ephemeris for the moment. This may happen even if NAV-SVINFO and
|
||||
# RXM-SVSI are indicating ephemeris availability as the internal data may not represent the
|
||||
# content of an original broadcast ephemeris (or only parts thereof).
|
||||
# - SF1D0 to SF3D7 contain the 24 words following the Hand-Over Word ( HOW ) from the
|
||||
# GPS navigation message, subframes 1 to 3. The Truncated TOW Count is not valid and
|
||||
# cannot be used. See IS-GPS-200 for a full description of the contents of the Subframes.
|
||||
# - In SF1D0 to SF3D7, the parity bits have been removed, and the 24 bits of data are
|
||||
# located in Bits 0 to 23. Bits 24 to 31 shall be ignored.
|
||||
# - When polled, the data contained in this message does not represent the full original
|
||||
# ephemeris broadcast. Some fields that are irrelevant to u-blox receivers may be missing.
|
||||
# The week number in Subframe 1 has already been modified to match the Time Of
|
||||
# Ephemeris (TOE).
|
||||
|
||||
uint8 CLASS_ID = 11
|
||||
uint8 MESSAGE_ID = 49
|
||||
|
||||
uint32 svid # SV ID for which this ephemeris data is
|
||||
# (Valid Range: 1 .. 32).
|
||||
uint32 how # Hand-Over Word of first Subframe. This is
|
||||
# required if data is sent to the receiver.
|
||||
# 0 indicates that no Ephemeris Data is following.
|
||||
|
||||
# Start of optional block
|
||||
uint32[] sf1d # Subframe 1 Words 3..10 (SF1D0..SF1D7)
|
||||
uint32[] sf2d # Subframe 2 Words 3..10 (SF2D0..SF2D7)
|
||||
uint32[] sf3d # Subframe 3 Words 3..10 (SF3D0..SF3D7)
|
||||
# End of optional block
|
||||
@@ -1,35 +0,0 @@
|
||||
# AID-HUI (0x0B 0x02)
|
||||
# GPS Health, UTC and ionosphere parameters
|
||||
#
|
||||
# All UBX-AID messages are deprecated; use UBX-MGA messages instead.
|
||||
# This message contains a health bit mask, UTC time and Klobuchar parameters. For more
|
||||
# information on these parameters, please see the ICD-GPS-200 documentation.
|
||||
|
||||
uint8 CLASS_ID = 11
|
||||
uint8 MESSAGE_ID = 2
|
||||
|
||||
uint32 health # Bitmask, every bit represents a GPS SV (1-32).
|
||||
# If the bit is set the SV is healthy.
|
||||
float64 utcA0 # UTC - parameter A0
|
||||
float64 utcA1 # UTC - parameter A1
|
||||
int32 utcTOW # UTC - reference time of week
|
||||
int16 utcWNT # UTC - reference week number
|
||||
int16 utcLS # UTC - time difference due to leap seconds before event
|
||||
int16 utcWNF # UTC - week number when next leap second event occurs
|
||||
int16 utcDN # UTC - day of week when next leap second event occurs
|
||||
int16 utcLSF # UTC - time difference due to leap seconds after event
|
||||
int16 utcSpare # UTC - Spare to ensure structure is a multiple of 4
|
||||
# bytes
|
||||
float32 klobA0 # Klobuchar - alpha 0 [s]
|
||||
float32 klobA1 # Klobuchar - alpha 1 [s/semicircle]
|
||||
float32 klobA2 # Klobuchar - alpha 2 [s/semicircle^2]
|
||||
float32 klobA3 # Klobuchar - alpha 3 [s/semicircle^3]
|
||||
float32 klobB0 # Klobuchar - beta 0 [s]
|
||||
float32 klobB1 # Klobuchar - beta 1 [s/semicircle]
|
||||
float32 klobB2 # Klobuchar - beta 2 [s/semicircle^2]
|
||||
float32 klobB3 # Klobuchar - beta 3 [s/semicircle^3]
|
||||
uint32 flags # flags
|
||||
uint32 FLAGS_HEALTH = 1 # Healthmask field in this message is valid
|
||||
uint32 FLAGS_UTC = 2 # UTC parameter fields in this message are valid
|
||||
uint32 FLAGS_KLOB = 4 # Klobuchar parameter fields in this message are
|
||||
# valid
|
||||
@@ -1,25 +0,0 @@
|
||||
# CFG-ANT (0x06 0x13)
|
||||
# Antenna Control Settings
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 19
|
||||
|
||||
uint16 flags # Antenna Flag Mask
|
||||
uint16 FLAGS_SVCS = 1 # Enable Antenna Supply Voltage Control Signal
|
||||
uint16 FLAGS_SCD = 2 # Enable Short Circuit Detection
|
||||
uint16 FLAGS_OCD = 4 # Enable Open Circuit Detection
|
||||
uint16 FLAGS_PDWN_ON_SCD = 8 # Power Down Antenna supply if Short Circuit is
|
||||
# detected. (only in combination with Bit 1)
|
||||
uint16 FLAGS_RECOVERY = 16 # Enable automatic recovery from short state
|
||||
|
||||
uint16 pins # Antenna Pin Configuration
|
||||
uint16 PIN_SWITCH_MASK = 31 # PIO-Pin used for switching antenna supply
|
||||
# (internal to TIM-LP/TIM-LF)
|
||||
uint16 PIN_SCD_MASK = 992 # PIO-Pin used for detecting a short in the
|
||||
# antenna supply
|
||||
uint16 PIN_OCD_MASK = 31744 # PIO-Pin used for detecting open/not connected
|
||||
# antenna
|
||||
uint16 PIN_RECONFIG = 32678 # if set to one, and this command is sent to the
|
||||
# receiver, the receiver will reconfigure the
|
||||
# pins as specified.
|
||||
@@ -1,38 +0,0 @@
|
||||
# CFG-CFG (0x06 0x09)
|
||||
# Clear, Save and Load configurations
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 9
|
||||
|
||||
uint32 clearMask # Mask with configuration sub-sections to Clear
|
||||
# (=Load Default Configurations to Permanent
|
||||
# Configurations in non-volatile memory)
|
||||
uint32 saveMask # Mask with configuration sub-section to Save
|
||||
# (=Save Current Configuration to Non-volatile
|
||||
# Memory)
|
||||
uint32 loadMask # Mask with configuration sub-sections to Load
|
||||
# (=Load Permanent Configurations from
|
||||
# Non-volatile Memory to Current Configurations)
|
||||
|
||||
uint32 MASK_IO_PORT = 1 # Communications port settings. Modifying this
|
||||
# sub-section results in an IO system reset.
|
||||
# Because of this undefined data may be output
|
||||
# for a short period of time after receiving the
|
||||
# message.
|
||||
uint32 MASK_MSG_CONF = 2 # Message Configuration
|
||||
uint32 MASK_INF_MSG = 4 # INF Message Configuration
|
||||
uint32 MASK_NAV_CONF = 8 # Navigation Configuration
|
||||
uint32 MASK_RXM_CONF = 16 # Receiver Manager Configuration
|
||||
uint32 MASK_SEN_CONF = 256 # Sensor Interface Configuration, protocol >= 19
|
||||
uint32 MASK_RINV_CONF = 512 # Remote Inventory Configuration
|
||||
uint32 MASK_ANT_CONF = 1024 # Antenna Configuration
|
||||
uint32 MASK_LOG_CONF = 2048 # Logging Configuration
|
||||
uint32 MASK_FTS_CONF = 4096 # FTS Configuration. Only applicable to the
|
||||
# FTS product variant.
|
||||
|
||||
uint8 deviceMask # Mask which selects the devices for this command
|
||||
uint8 DEV_BBR = 1 # device battery backed RAM
|
||||
uint8 DEV_FLASH = 2 # device Flash
|
||||
uint8 DEV_EEPROM = 4 # device EEPROM
|
||||
uint8 DEV_SPI_FLASH = 16 # device SPI Flash
|
||||
@@ -1,37 +0,0 @@
|
||||
# CFG-DAT (0x06 0x06)
|
||||
# Set User-defined Datum
|
||||
#
|
||||
# For more information see the description of Geodetic Systems and Frames.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 6
|
||||
|
||||
# Only for GET, these values are not used for write
|
||||
uint16 datumNum # Datum Number: 0 = WGS84, 0xFFFF = user-defined
|
||||
uint16 DATUM_NUM_WGS84 = 0
|
||||
uint16 DATUM_NUM_USER = 65535
|
||||
|
||||
uint8[6] datumName # ASCII String: WGS84 or USER
|
||||
|
||||
float64 majA # Semi-major Axis [m]
|
||||
# accepted range = 6,300,000.0 to 6,500,000.0 meters
|
||||
float64 flat # 1.0 / Flattening
|
||||
# accepted range is 0.0 to 500.0
|
||||
|
||||
float32 dX # X Axis shift at the origin [m]
|
||||
# accepted range is +/- 5000.0 meters
|
||||
float32 dY # Y Axis shift at the origin [m]
|
||||
# accepted range is +/- 5000.0 meters
|
||||
float32 dZ # Z Axis shift at the origin [m]
|
||||
# accepted range is +/- 5000.0 meters
|
||||
|
||||
float32 rotX # Rotation about the X Axis [s]
|
||||
# accepted range is +/- 20.0 milli-arc seconds
|
||||
float32 rotY # Rotation about the Y Axis [s]
|
||||
# accepted range is +/- 20.0 milli-arc seconds
|
||||
float32 rotZ # Rotation about the Z Axis [s]
|
||||
# accepted range is +/- 20.0 milli-arc seconds
|
||||
|
||||
float32 scale # Scale change [ppm]
|
||||
# accepted range is 0.0 to 50.0 parts per million
|
||||
@@ -1,18 +0,0 @@
|
||||
# CFG-DGNSS (0x06 0x70)
|
||||
# DGNSS configuration
|
||||
#
|
||||
# This message allows the user to configure the DGNSS configuration of the
|
||||
# receiver.
|
||||
# Supported on:
|
||||
# - u-blox 8 / u-blox M8 from protocol version 20.01 up to version 23.01 (only
|
||||
# with High Precision GNSS products)
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 112
|
||||
|
||||
uint8 dgnssMode # Specifies differential mode:
|
||||
uint8 DGNSS_MODE_RTK_FLOAT = 2 # RTK float: No attempts are made to fix
|
||||
# ambiguities.
|
||||
uint8 DGNSS_MODE_RTK_FIXED = 3 # RTK fixed: Ambiguities are fixed whenever
|
||||
# possible.
|
||||
uint8[3] reserved0 # Reserved
|
||||
@@ -1,44 +0,0 @@
|
||||
# CFG-GNSS (0x06 0x3E)
|
||||
# GNSS Configuration
|
||||
#
|
||||
# Gets or sets the GNSS system channel sharing configuration.
|
||||
# If the receiver is sent a valid new configuration, it will respond with a
|
||||
# UBX-ACK-ACK message and immediately change to the new configuration. Otherwise
|
||||
# the receiver will reject the request, by issuing a UBX-ACK-NAK and continuing
|
||||
# operation with the previous configuration.
|
||||
# Configuration requirements:
|
||||
# - It is necessary for at least one major GNSS to be enabled, after applying
|
||||
# the new configuration to the current one.
|
||||
# - It is also required that at least 4 tracking channels are available to each
|
||||
# enabled major GNSS, i.e. maxTrkCh must have a minimum value of 4 for each
|
||||
# enabled major GNSS.
|
||||
# - The number of tracking channels in use must not exceed the number of
|
||||
# tracking channels available in hardware, and the sum of all reserved
|
||||
# tracking channels needs to be less than or equal to the number of tracking
|
||||
# channels in use.
|
||||
# Notes:
|
||||
# - To avoid cross-correlation issues, it is recommended that GPS and QZSS are
|
||||
# always both enabled or both disabled.
|
||||
# - Polling this message returns the configuration of all supported GNSS,
|
||||
# whether enabled or not; it may also include GNSS unsupported by the
|
||||
# particular product, but in such cases the enable flag will always be unset.
|
||||
# - See section GNSS Configuration for a discussion of the use of this message
|
||||
# and section Satellite Numbering for a description of the GNSS IDs available
|
||||
# - Configuration specific to the GNSS system can be done via other messages
|
||||
# (e.g. UBX-CFG-SBAS).
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 62
|
||||
|
||||
uint8 msgVer # Message version (= 0 for this version)
|
||||
uint8 numTrkChHw # Number of tracking channels in hardware (read only)
|
||||
uint8 numTrkChUse # (Read only in protocol versions greater than 23)
|
||||
# Number of tracking channels to use (<= numTrkChHw)
|
||||
# If 0xFF, then number of tracking channels to use will
|
||||
# be set to numTrkChHw
|
||||
uint8 numConfigBlocks # Number of configuration blocks following
|
||||
|
||||
# Start of repeated block (numConfigBlocks times)
|
||||
CfgGNSS_Block[] blocks
|
||||
# End of repeated block
|
||||
@@ -1,54 +0,0 @@
|
||||
# see Cfg-GNSS message
|
||||
#
|
||||
|
||||
uint8 gnssId # System identifier (see Satellite Numbering)
|
||||
|
||||
uint8 GNSS_ID_GPS = 0
|
||||
uint8 GNSS_ID_SBAS = 1
|
||||
uint8 GNSS_ID_GALILEO = 2
|
||||
uint8 GNSS_ID_BEIDOU = 3
|
||||
uint8 GNSS_ID_IMES = 4
|
||||
uint8 GNSS_ID_QZSS = 5
|
||||
uint8 GNSS_ID_GLONASS = 6
|
||||
|
||||
uint8 resTrkCh # (Read only in protocol versions greater than 23)
|
||||
# Number of reserved (minimum) tracking channels
|
||||
# for this GNSS system
|
||||
uint8 RES_TRK_CH_GPS = 8
|
||||
uint8 RES_TRK_CH_QZSS = 0
|
||||
uint8 RES_TRK_CH_SBAS = 0
|
||||
uint8 RES_TRK_CH_GLONASS = 8
|
||||
uint8 maxTrkCh # (Read only in protocol versions greater than 23)
|
||||
# Maximum number of tracking channels used for this
|
||||
# system. Must be > 0, >= resTrkChn, <= numTrkChUse and
|
||||
# <= maximum number of tracking channels supported for
|
||||
# this system
|
||||
uint8 MAX_TRK_CH_MAJOR_MIN = 4 # maxTrkCh must have this minimum value
|
||||
# for each enabled major GNSS
|
||||
uint8 MAX_TRK_CH_GPS = 16
|
||||
uint8 MAX_TRK_CH_GLONASS = 14
|
||||
uint8 MAX_TRK_CH_QZSS = 3
|
||||
uint8 MAX_TRK_CH_SBAS = 3
|
||||
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
uint32 flags # Bitfield of flags. At least one signal must be
|
||||
# configured in every enabled system.
|
||||
uint32 FLAGS_ENABLE = 1 # Enable this system
|
||||
uint32 FLAGS_SIG_CFG_MASK = 16711680 # Signal configuration mask
|
||||
uint32 SIG_CFG_GPS_L1CA = 65536 # When gnssId is 0 (GPS)
|
||||
# * 0x01 = GPS L1C/A
|
||||
uint32 SIG_CFG_SBAS_L1CA = 65536 # When gnssId is 1 (SBAS)
|
||||
# * 0x01 = SBAS L1C/A
|
||||
uint32 SIG_CFG_GALILEO_E1OS = 65536 # When gnssId is 2 (Galileo)
|
||||
# * 0x01 = Galileo E1OS (not supported in
|
||||
# protocol versions less than 18)
|
||||
uint32 SIG_CFG_BEIDOU_B1I = 65536 # When gnssId is 3 (BeiDou)
|
||||
# * 0x01 = BeiDou B1I
|
||||
uint32 SIG_CFG_IMES_L1 = 65536 # When gnssId is 4 (IMES)
|
||||
# * 0x01 = IMES L1
|
||||
uint32 SIG_CFG_QZSS_L1CA = 65536 # When gnssId is 5 (QZSS)
|
||||
# * 0x01 = QZSS L1C/A
|
||||
uint32 SIG_CFG_QZSS_L1SAIF = 262144 # * 0x04 = QZSS L1SAIF
|
||||
uint32 SIG_CFG_GLONASS_L1OF = 65536 # When gnssId is 6 (GLONASS)
|
||||
# * 0x01 = GLONASS L1OF
|
||||
@@ -1,19 +0,0 @@
|
||||
# CFG-HNR (0x06 0x5C)
|
||||
# High Navigation Rate Settings
|
||||
#
|
||||
# The u-blox receivers support high rates of navigation update up to 30 Hz.
|
||||
# The navigation solution output (NAV-HNR) will not be aligned to the top of a
|
||||
# second.
|
||||
# The update rate has a direct influence on the power consumption. The more
|
||||
# fixes that are required, the more CPU power and communication resources are
|
||||
# required.
|
||||
# For most applications a 1 Hz update rate would be sufficient.
|
||||
#
|
||||
# (only with ADR or UDR products)
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 92
|
||||
|
||||
uint8 highNavRate # Rate of navigation solution output [Hz]
|
||||
uint8[3] reserved0 # Reserved
|
||||
@@ -1,19 +0,0 @@
|
||||
# CFG-INF (0x06 0x02)
|
||||
# Information message configuration
|
||||
#
|
||||
# The value of infMsgMask[x] below are that each bit represents one of the INF
|
||||
# class messages (Bit 0 for ERROR, Bit 1 for WARNING and so on.). For a complete
|
||||
# list, see the Message Class INF. Several configurations can be concatenated to
|
||||
# one input message.
|
||||
# In this case the payload length can be a multiple of the normal length. Output
|
||||
# messages from the module contain only one configuration unit. Note that I/O
|
||||
# Ports 1 and 2 correspond to serial ports 1 and 2. I/O port 0 is DDC. I/O port
|
||||
# 3 is USB. I/O port 4 is SPI. I/O port 5 is reserved for future use
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 2
|
||||
|
||||
# start of repeated block
|
||||
CfgINF_Block[] blocks
|
||||
# end of repeated block
|
||||
@@ -1,21 +0,0 @@
|
||||
# See CfgINF message
|
||||
#
|
||||
|
||||
uint8 protocolID # Protocol Identifier, identifying for which
|
||||
# protocol the configuration is set/get. The
|
||||
# following are valid Protocol Identifiers:
|
||||
# 0: UBX Protocol
|
||||
# 1: NMEA Protocol
|
||||
# 2-255: Reserved
|
||||
uint8 PROTOCOL_ID_UBX = 0
|
||||
uint8 PROTOCOL_ID_NMEA = 1
|
||||
|
||||
uint8[3] reserved1 # Reserved
|
||||
|
||||
uint8[6] infMsgMask # A bit mask, saying which information messages
|
||||
# are enabled on each I/O port
|
||||
uint8 INF_MSG_ERROR = 1 # enable ERROR
|
||||
uint8 INF_MSG_WARNING = 2 # enable WARNING
|
||||
uint8 INF_MSG_NOTICE = 4 # enable NOTICE
|
||||
uint8 INF_MSG_TEST = 8 # enable TEST
|
||||
uint8 INF_MSG_DEBUG = 16 # enable DEBUG
|
||||
@@ -1,12 +0,0 @@
|
||||
# CFG-MSG (0x06 0x01)
|
||||
# Message Rate(s)
|
||||
#
|
||||
# Set message rate for the current port
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 1
|
||||
|
||||
uint8 msgClass # Message Class
|
||||
uint8 msgID # Message Identifier
|
||||
uint8 rate # Send rate on current port
|
||||
# [number of navigation solutions]
|
||||
@@ -1,66 +0,0 @@
|
||||
# CFG-NAV5 (0x06 0x24)
|
||||
# Navigation Engine Settings
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 36
|
||||
|
||||
uint16 mask # Parameters Bitmask. Only the masked
|
||||
# parameters will be applied.
|
||||
uint16 MASK_DYN = 1 # Apply dynamic model settings
|
||||
uint16 MASK_MIN_EL = 2 # Apply minimum elevation settings
|
||||
uint16 MASK_FIX_MODE = 4 # Apply fix mode settings
|
||||
uint16 MASK_DR_LIM = 8 # Apply DR limit settings
|
||||
uint16 MASK_POS_MASK = 16 # Apply position mask settings
|
||||
uint16 MASK_TIME_MASK = 32 # Apply time mask settings
|
||||
uint16 MASK_STATIC_HOLD_MASK = 64 # Apply static hold settings
|
||||
uint16 MASK_DGPS_MASK = 128 # Apply DGPS settings, firmware >= 7 only
|
||||
uint16 MASK_CNO = 256 # Apply CNO threshold settings
|
||||
uint16 MASK_UTC = 1024 # Apply UTC settings, protocol >= 16 only
|
||||
|
||||
uint8 dynModel # Dynamic Platform model:
|
||||
uint8 DYN_MODEL_PORTABLE = 0 # Portable
|
||||
uint8 DYN_MODEL_STATIONARY = 2 # Stationary
|
||||
uint8 DYN_MODEL_PEDESTRIAN = 3 # Pedestrian
|
||||
uint8 DYN_MODEL_AUTOMOTIVE = 4 # Automotive
|
||||
uint8 DYN_MODEL_SEA = 5 # Sea
|
||||
uint8 DYN_MODEL_AIRBORNE_1G = 6 # Airborne with <1g Acceleration
|
||||
uint8 DYN_MODEL_AIRBORNE_2G = 7 # Airborne with <2g Acceleration
|
||||
uint8 DYN_MODEL_AIRBORNE_4G = 8 # Airborne with <4g Acceleration
|
||||
uint8 DYN_MODEL_WRIST_WATCH = 9 # Wrist watch, protocol >= 18
|
||||
|
||||
uint8 fixMode # Position Fixing Mode.
|
||||
uint8 FIX_MODE_2D_ONLY = 1 # 2D only
|
||||
uint8 FIX_MODE_3D_ONLY = 2 # 3D only
|
||||
uint8 FIX_MODE_AUTO = 3 # Auto 2D/3D
|
||||
|
||||
int32 fixedAlt # Fixed altitude (mean sea level) for 2D fix mode.
|
||||
# [m / 0.01]
|
||||
uint32 fixedAltVar # Fixed altitude variance for 2D mode. [m^2 / 0.0001]
|
||||
int8 minElev # Minimum Elevation for a GNSS satellite to be used in
|
||||
# NAV [deg]
|
||||
uint8 drLimit # Maximum time to perform dead reckoning [s]
|
||||
# (linear extrapolation) in case of GPS signal loss
|
||||
uint16 pDop # Position DOP Mask to use [1 / 0.1]
|
||||
uint16 tDop # Time DOP Mask to use [1 / 0.1]
|
||||
uint16 pAcc # Position Accuracy Mask [m]
|
||||
uint16 tAcc # Time Accuracy Mask [m]
|
||||
uint8 staticHoldThresh # Static hold threshold [cm/s]
|
||||
uint8 dgnssTimeOut # DGNSS timeout, firmware 7 and newer only [s]
|
||||
|
||||
uint8 cnoThreshNumSvs # Number of satellites required to have C/N0 above
|
||||
# cnoThresh for a fix to be attempted
|
||||
uint8 cnoThresh # C/N0 threshold for deciding whether to attempt a fix
|
||||
# [dBHz]
|
||||
uint8[2] reserved1 # Reserved
|
||||
|
||||
uint16 staticHoldMaxDist # Static hold distance threshold (before quitting
|
||||
# static hold) [m]
|
||||
uint8 utcStandard # UTC standard to be used:
|
||||
uint8 UTC_STANDARD_AUTOMATIC = 0 # receiver selects based on GNSS configuration
|
||||
uint8 UTC_STANDARD_GPS = 3 # UTC as operated by the U.S. Naval Observatory
|
||||
# (USNO); derived from GPS time
|
||||
uint8 UTC_STANDARD_GLONASS = 6 # UTC as operated by the former Soviet Union;
|
||||
# derived from GLONASS time
|
||||
uint8 UTC_STANDARD_BEIDOU = 7 # UTC as operated by the National Time Service
|
||||
# Center, China; derived from BeiDou time
|
||||
uint8[5] reserved2 # Reserved
|
||||
@@ -1,67 +0,0 @@
|
||||
# CFG-NAVX5 (0x06 0x23)
|
||||
# Navigation Engine Expert Settings
|
||||
#
|
||||
# Warning: Refer to u-blox protocol spec before changing these settings.
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 35
|
||||
|
||||
uint16 version # Message version (set to 0)
|
||||
|
||||
uint16 mask1 # First parameters bitmask (possible values below)
|
||||
uint16 MASK1_MIN_MAX = 4 # apply min/max SVs settings
|
||||
uint16 MASK1_MIN_CNO = 8 # apply minimum C/N0 setting
|
||||
uint16 MASK1_INITIAL_FIX_3D = 64 # apply initial 3D fix settings
|
||||
uint16 MASK1_WKN_ROLL = 512 # apply GPS week number rollover settings
|
||||
uint16 MASK1_ACK_AID = 1024 # apply assistance acknowledgment
|
||||
# settings
|
||||
uint16 MASK1_PPP = 8192 # apply usePPP flag
|
||||
uint16 MASK1_AOP = 16384 # apply aopCfg (useAOP flag) and
|
||||
# aopOrbMaxErr settings
|
||||
# (AssistNow Autonomous)
|
||||
|
||||
uint32 mask2 # Second parameters bitmask (possible values below)
|
||||
# Firmware >=8 only
|
||||
uint32 MASK2_ADR = 64 # Apply ADR sensor fusion on/off
|
||||
# setting
|
||||
uint32 MASK2_SIG_ATTEN_COMP_MODE = 128 # Apply signal attenuation
|
||||
# compensation feature settings
|
||||
|
||||
uint8[2] reserved1 # Always set to zero
|
||||
|
||||
uint8 minSVs # Minimum number of satellites for navigation
|
||||
uint8 maxSVs # Maximum number of satellites for navigation
|
||||
uint8 minCNO # Minimum satellite signal level for navigation [dBHz]
|
||||
|
||||
uint8 reserved2 # Always set to zero
|
||||
|
||||
uint8 iniFix3D # If set to 1, initial fix must be 3D
|
||||
|
||||
uint8[2] reserved3 # Always set to zero
|
||||
|
||||
uint8 ackAiding # If set to 1, issue acknowledgments for assistance
|
||||
uint16 wknRollover # GPS week rollover number, GPS week numbers will be set
|
||||
# correctly from this week up to 1024 weeks after this
|
||||
# week
|
||||
uint8 sigAttenCompMode # Permanently attenuated signal compensation [dBHz]
|
||||
# 0 = disabled, 255 = automatic
|
||||
# 1..63 = maximum expected C/N0 value
|
||||
# Firmware 8 only
|
||||
|
||||
uint8[5] reserved4 # Always set to zero
|
||||
|
||||
uint8 usePPP # Enable/disable PPP (on supported units)
|
||||
uint8 aopCfg # AssistNow Autonomous configuration, 1: enabled
|
||||
|
||||
uint8[2] reserved5 # Always set to zero
|
||||
|
||||
uint16 aopOrbMaxErr # Maximum acceptable (modeled) autonomous orbit
|
||||
# error [m]
|
||||
# valid range = 5..1000
|
||||
# 0 = reset to firmware default
|
||||
|
||||
uint8[7] reserved6 # Always set to zero
|
||||
|
||||
uint8 useAdr # Enable/disable ADR sensor fusion
|
||||
# 1: enabled, 0: disabled
|
||||
# Only supported on certain products
|
||||
@@ -1,85 +0,0 @@
|
||||
# CFG-NMEA (0x06 0x17)
|
||||
# NMEA protocol configuration V1
|
||||
#
|
||||
# Set/Get the NMEA protocol configuration. See section NMEA Protocol
|
||||
# Configuration for a detailed description of the configuration effects on
|
||||
# NMEA output
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 23
|
||||
|
||||
uint8 filter # filter flags
|
||||
uint8 FILTER_POS = 1 # Enable position output for failed or
|
||||
# invalid fixes
|
||||
uint8 FILTER_MSK_POS = 2 # Enable position output for invalid fixes
|
||||
uint8 FILTER_TIME = 4 # Enable time output for invalid times
|
||||
uint8 FILTER_DATE = 8 # Enable date output for invalid dates
|
||||
uint8 FILTER_GPS_ONLY = 16 # Restrict output to GPS satellites only
|
||||
uint8 FILTER_TRACK = 32 # Enable COG output even if COG is frozen
|
||||
|
||||
uint8 nmeaVersion # NMEA version
|
||||
uint8 NMEA_VERSION_4_1 = 65 # Version 4.1
|
||||
uint8 NMEA_VERSION_4_0 = 64 # Version 4.0
|
||||
uint8 NMEA_VERSION_2_3 = 35 # Version 2.3
|
||||
uint8 NMEA_VERSION_2_1 = 33 # Version 2.1
|
||||
|
||||
uint8 numSV # Maximum Number of SVs to report per TalkerId:
|
||||
# unlimited (0) or 8, 12, 16
|
||||
uint8 NUM_SV_UNLIMITED = 0
|
||||
|
||||
uint8 flags # flags
|
||||
uint8 FLAGS_COMPAT = 1 # enable compatibility mode.
|
||||
# This might be needed for certain applications
|
||||
# when customer's NMEA parser expects a fixed
|
||||
# number of digits in position coordinates
|
||||
uint8 FLAGS_CONSIDER = 2 # enable considering mode
|
||||
uint8 FLAGS_LIMIT82 = 4 # enable strict limit to 82 characters maximum
|
||||
uint8 FLAGS_HIGH_PREC = 8 # enable high precision mode
|
||||
# This flag cannot be set in conjunction with
|
||||
# either Compatibility Mode or Limit82 Mode.
|
||||
# (not supported in protocol versions < 20.01)
|
||||
|
||||
uint32 gnssToFilter # Filters out satellites based on their GNSS.
|
||||
# If a bitfield is enabled, the corresponding
|
||||
# satellites will be not output.
|
||||
uint32 GNSS_TO_FILTER_GPS = 1 # Disable reporting of GPS satellites
|
||||
uint32 GNSS_TO_FILTER_SBAS = 2 # Disable reporting of SBAS satellites
|
||||
uint32 GNSS_TO_FILTER_QZSS = 16 # Disable reporting of QZSS satellites
|
||||
uint32 GNSS_TO_FILTER_GLONASS = 32 # Disable reporting of GLONASS satellites
|
||||
uint32 GNSS_TO_FILTER_BEIDOU = 64 # Disable reporting of BeiDou satellites
|
||||
|
||||
uint8 svNumbering # Configures the display of satellites that do not
|
||||
# have an NMEA-defined value. Note: this does not
|
||||
# apply to satellites with an unknown ID.
|
||||
uint8 SV_NUMBERING_STRICT = 0 # Strict - Satellites are not output
|
||||
uint8 SV_NUMBERING_EXTENDED = 1 # Extended - Use proprietary numbering
|
||||
|
||||
uint8 mainTalkerId # By default the main Talker ID (i.e. the Talker
|
||||
# ID used for all messages other than GSV) is
|
||||
# determined by the GNSS assignment of the
|
||||
# receiver's channels (see CfgGNSS).
|
||||
# This field enables the main Talker ID to be
|
||||
# overridden
|
||||
uint8 MAIN_TALKER_ID_NOT_OVERRIDDEN = 0 # Main Talker ID is not overridden
|
||||
uint8 MAIN_TALKER_ID_GP = 1 # Set main Talker ID to 'GP'
|
||||
uint8 MAIN_TALKER_ID_GL = 2 # Set main Talker ID to 'GL'
|
||||
uint8 MAIN_TALKER_ID_GN = 3 # Set main Talker ID to 'GN'
|
||||
uint8 MAIN_TALKER_ID_GA = 4 # Set main Talker ID to 'GA'
|
||||
uint8 MAIN_TALKER_ID_GB = 5 # Set main Talker ID to 'GB'
|
||||
|
||||
uint8 gsvTalkerId # By default the Talker ID for GSV messages is
|
||||
# GNSS specific (as defined by NMEA). This field
|
||||
# enables the GSV Talker ID to be overridden.
|
||||
uint8 GSV_TALKER_ID_GNSS_SPECIFIC = 0 # Use GNSS specific Talker ID
|
||||
# (as defined by NMEA)
|
||||
uint8 GSV_TALKER_ID_MAIN = 1 # Use the main Talker ID
|
||||
|
||||
uint8 version # Message version (set to 1 for this version)
|
||||
uint8 VERSION = 1
|
||||
|
||||
uint8[2] bdsTalkerId # Sets the two characters that should be used
|
||||
# for the BeiDou Talker ID. If these are set to
|
||||
# zero, the default BeiDou TalkerId will be used
|
||||
|
||||
uint8[6] reserved1 # Reserved
|
||||
@@ -1,39 +0,0 @@
|
||||
# CFG-NMEA (0x06 0x17)
|
||||
# NMEA protocol configuration
|
||||
#
|
||||
# Set/Get the NMEA protocol configuration. See section NMEA Protocol
|
||||
# Configuration for a detailed description of the configuration effects on
|
||||
# NMEA output
|
||||
#
|
||||
# Supported on u-blox 6 from firmware version 6.00 up to version 7.03.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 23
|
||||
|
||||
uint8 filter # filter flags
|
||||
uint8 FILTER_POS = 1 # Disable position filtering
|
||||
uint8 FILTER_MSK_POS = 2 # Disable masked position filtering
|
||||
uint8 FILTER_TIME = 4 # Disable time filtering
|
||||
uint8 FILTER_DATE = 8 # Disable date filtering
|
||||
uint8 FILTER_SBAS_FILT = 16 # Enable SBAS filtering
|
||||
uint8 FILTER_TRACK = 32 # Disable track filtering
|
||||
|
||||
uint8 version # NMEA version
|
||||
uint8 NMEA_VERSION_2_3 = 35 # Version 2.3
|
||||
uint8 NMEA_VERSION_2_1 = 33 # Version 2.1
|
||||
|
||||
uint8 numSV # Maximum Number of SVs to report in NMEA
|
||||
# protocol.
|
||||
# This does not affect the receiver's operation.
|
||||
# It only limits the number of SVs reported in
|
||||
# NMEA mode (this might be needed with older
|
||||
# mapping applications which only support 8- or
|
||||
# 12-channel receivers)
|
||||
|
||||
uint8 flags # flags
|
||||
uint8 FLAGS_COMPAT = 1 # enable compatibility mode.
|
||||
# This might be needed for certain applications
|
||||
# when customer's NMEA parser expects a fixed
|
||||
# number of digits in position coordinates
|
||||
uint8 FLAGS_CONSIDER = 2 # enable considering mode
|
||||
@@ -1,70 +0,0 @@
|
||||
# CFG-NMEA (0x06 0x17)
|
||||
# NMEA protocol configuration V0
|
||||
#
|
||||
# Set/Get the NMEA protocol configuration. See section NMEA Protocol
|
||||
# Configuration for a detailed description of the configuration effects on
|
||||
# NMEA output
|
||||
#
|
||||
# Supported on: u-blox 7 firmware version 1.00
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 23
|
||||
|
||||
uint8 filter # filter flags
|
||||
uint8 FILTER_POS = 1 # Enable position output for failed or
|
||||
# invalid fixes
|
||||
uint8 FILTER_MSK_POS = 2 # Enable position output for invalid fixes
|
||||
uint8 FILTER_TIME = 4 # Enable time output for invalid times
|
||||
uint8 FILTER_DATE = 8 # Enable date output for invalid dates
|
||||
uint8 FILTER_GPS_ONLY = 16 # Restrict output to GPS satellites only
|
||||
uint8 FILTER_TRACK = 32 # Enable COG output even if COG is frozen
|
||||
|
||||
uint8 nmeaVersion # NMEA version
|
||||
uint8 NMEA_VERSION_2_3 = 35 # Version 2.3
|
||||
uint8 NMEA_VERSION_2_1 = 33 # Version 2.1
|
||||
|
||||
uint8 numSV # Maximum Number of SVs to report per TalkerId:
|
||||
# unlimited (0) or 8, 12, 16
|
||||
uint8 NUM_SV_UNLIMITED = 0
|
||||
|
||||
uint8 flags # flags
|
||||
uint8 FLAGS_COMPAT = 1 # enable compatibility mode.
|
||||
# This might be needed for certain applications
|
||||
# when customer's NMEA parser expects a fixed
|
||||
# number of digits in position coordinates
|
||||
uint8 FLAGS_CONSIDER = 2 # enable considering mode
|
||||
|
||||
uint32 gnssToFilter # Filters out satellites based on their GNSS.
|
||||
# If a bitfield is enabled, the corresponding
|
||||
# satellites will be not output.
|
||||
uint32 GNSS_TO_FILTER_GPS = 1 # Disable reporting of GPS satellites
|
||||
uint32 GNSS_TO_FILTER_SBAS = 2 # Disable reporting of SBAS satellites
|
||||
uint32 GNSS_TO_FILTER_QZSS = 16 # Disable reporting of QZSS satellites
|
||||
uint32 GNSS_TO_FILTER_GLONASS = 32 # Disable reporting of GLONASS satellites
|
||||
|
||||
uint8 svNumbering # Configures the display of satellites that do not
|
||||
# have an NMEA-defined value. Note: this does not
|
||||
# apply to satellites with an unknown ID.
|
||||
uint8 SV_NUMBERING_STRICT = 0 # Strict - Satellites are not output
|
||||
uint8 SV_NUMBERING_EXTENDED = 1 # Extended - Use proprietary numbering
|
||||
|
||||
uint8 mainTalkerId # By default the main Talker ID (i.e. the Talker
|
||||
# ID used for all messages other than GSV) is
|
||||
# determined by the GNSS assignment of the
|
||||
# receiver's channels (see CfgGNSS).
|
||||
# This field enables the main Talker ID to be
|
||||
# overridden
|
||||
uint8 MAIN_TALKER_ID_NOT_OVERRIDDEN = 0 # Main Talker ID is not overridden
|
||||
uint8 MAIN_TALKER_ID_GP = 1 # Set main Talker ID to 'GP'
|
||||
uint8 MAIN_TALKER_ID_GL = 2 # Set main Talker ID to 'GL'
|
||||
uint8 MAIN_TALKER_ID_GN = 3 # Set main Talker ID to 'GN'
|
||||
|
||||
uint8 gsvTalkerId # By default the Talker ID for GSV messages is
|
||||
# GNSS specific (as defined by NMEA). This field
|
||||
# enables the GSV Talker ID to be overridden.
|
||||
uint8 GSV_TALKER_ID_GNSS_SPECIFIC = 0 # Use GNSS specific Talker ID
|
||||
# (as defined by NMEA)
|
||||
uint8 GSV_TALKER_ID_MAIN = 1 # Use the main Talker ID
|
||||
|
||||
uint8 reserved # Reserved
|
||||
@@ -1,105 +0,0 @@
|
||||
# CFG-PRT (0x06 0x00)
|
||||
# Port Configuration for DDC, UART, USB, SPI
|
||||
#
|
||||
# Several configurations can be concatenated to one input message. In this case
|
||||
# the payload length can be a multiple of the normal length (see the other
|
||||
# versions of CFG-PRT). Output messages from the module contain only one
|
||||
# configuration unit.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 0
|
||||
|
||||
uint8 portID # Port Identifier Number
|
||||
uint8 PORT_ID_DDC = 0
|
||||
uint8 PORT_ID_UART1 = 1
|
||||
uint8 PORT_ID_UART2 = 2
|
||||
uint8 PORT_ID_USB = 3
|
||||
uint8 PORT_ID_SPI = 4
|
||||
|
||||
uint8 reserved0 # Reserved
|
||||
|
||||
uint16 txReady # TX ready PIN configuration (since Firmware 7.01)
|
||||
# reserved (Always set to zero) up to Firmware 7.01
|
||||
|
||||
uint16 TX_READY_EN = 1 # Enable TX ready feature for this
|
||||
# port
|
||||
uint16 TX_READY_POLARITY_HIGH_ACTIVE = 0 # Polarity High-active
|
||||
uint16 TX_READY_POLARITY_LOW_ACTIVE = 2 # Polarity Low-active
|
||||
uint16 TX_READY_PIN_SHIFT = 2 # PIO to be used (must not be in use
|
||||
# already by another function)
|
||||
uint16 TX_READY_PIN_MASK = 124 #
|
||||
uint16 TX_READY_THRES_SHIFT = 7 # Threshold
|
||||
uint16 TX_READY_THRES_MASK = 65408 # The given threshold is multiplied by
|
||||
# 8 bytes.
|
||||
# The TX ready PIN goes active
|
||||
# after >= thres*8 bytes are pending
|
||||
# for the port and going inactive
|
||||
# after the last pending bytes have
|
||||
# been written to hardware (0-4 bytes
|
||||
# before end of stream).
|
||||
|
||||
uint32 mode # A bit mask describing the DDC, UART or SPI mode
|
||||
# Reserved for USB
|
||||
# DDC Mode Constants
|
||||
uint32 MODE_DDC_SLAVE_ADDR_SHIFT = 1
|
||||
uint32 MODE_DDC_SLAVE_ADDR_MASK = 254 # Slave address
|
||||
# Range: 0x07 < slaveAddr < 0x78.
|
||||
# UART Mode Constants
|
||||
uint32 MODE_RESERVED1 = 16 # Default 1 for compatibility with A4
|
||||
uint32 MODE_CHAR_LEN_MASK = 192 # Character Length
|
||||
uint32 MODE_CHAR_LEN_5BIT = 0 # 5bit (not supported)
|
||||
uint32 MODE_CHAR_LEN_6BIT = 64 # 6bit (not supported)
|
||||
uint32 MODE_CHAR_LEN_7BIT = 128 # 7bit (supported only with parity)
|
||||
uint32 MODE_CHAR_LEN_8BIT = 192 # 8bit
|
||||
uint32 MODE_PARITY_MASK = 3584 #
|
||||
uint32 MODE_PARITY_EVEN = 0 # Even Parity
|
||||
uint32 MODE_PARITY_ODD = 512 # Odd Parity
|
||||
uint32 MODE_PARITY_NO = 2048 # No Parity (even/odd ignored)
|
||||
uint32 MODE_STOP_BITS_MASK = 12288 # Number of Stop Bits
|
||||
uint32 MODE_STOP_BITS_1 = 0 # 1 Stop Bit
|
||||
uint32 MODE_STOP_BITS_15 = 4096 # 1.5 Stop Bit
|
||||
uint32 MODE_STOP_BITS_2 = 8192 # 2 Stop Bit
|
||||
uint32 MODE_STOP_BITS_05 = 12288 # 0.5 Stop Bit
|
||||
# SPI Mode Constants
|
||||
uint32 MODE_SPI_SPI_MODE_CPOL = 4 # SPI Mode CPOL (0/1)
|
||||
uint32 MODE_SPI_SPI_MODE_CPHA = 2 # SPI Mode CPH (0/1)
|
||||
# (both CPOL/CPHA) can be = 1
|
||||
uint32 MODE_SPI_FLOW_CONTROL = 64 # (u-blox 6 only)
|
||||
# 0 Flow control disabled
|
||||
# 1 Flow control enabled (9-bit mode)
|
||||
uint32 MODE_SPI_FF_COUNT_SHIFT = 8
|
||||
uint32 MODE_SPI_FF_COUNT_MASK = 16128 # Number of bytes containing 0xFF to
|
||||
# receive before switching off
|
||||
# reception.
|
||||
# Range: 0(mechanism off)-63
|
||||
|
||||
uint32 baudRate # UART Baudrate in bits/second [bits/s]
|
||||
# Reserved for USB, SPI, DDC
|
||||
# Possible values: 4800, 9600, 19200, 38400, 57600,
|
||||
# 115200, 230400, 460800
|
||||
|
||||
uint16 inProtoMask # A mask describing which input protocols are active.
|
||||
# Each bit of this mask is used for a protocol.
|
||||
# Through that, multiple protocols can be defined
|
||||
# on a single port.
|
||||
|
||||
uint16 outProtoMask # A mask describing which output protocols are active.
|
||||
# Each bit of this mask is used for a protocol.
|
||||
# Through that, multiple protocols can be defined
|
||||
# on a single port.
|
||||
|
||||
uint16 PROTO_UBX = 1
|
||||
uint16 PROTO_NMEA = 2
|
||||
uint16 PROTO_RTCM = 4 # only for inProtoMask
|
||||
uint16 PROTO_RTCM3 = 32 # (not supported in protocol versions less than 20)
|
||||
|
||||
uint16 flags # Flags for UART & SPI, Reserved for USB
|
||||
uint16 FLAGS_EXTENDED_TX_TIMEOUT = 2 # if set, the port will timeout if
|
||||
# allocated TX memory >=4 kB and no
|
||||
# activity for 1.5s. If not set the port
|
||||
# will timoout if no activity for 1.5s
|
||||
# regardless on the amount of allocated
|
||||
# TX memory.
|
||||
|
||||
uint16 reserved1 # Always set to zero
|
||||
@@ -1,33 +0,0 @@
|
||||
# CFG-RATE (0x06 0x08)
|
||||
# Navigation/Measurement Rate Settings
|
||||
#
|
||||
# This message allows the user to alter the rate at which navigation solutions
|
||||
# (and the measurements that they depend on) are generated by the receiver. The
|
||||
# calculation of the navigation solution will always be aligned to the top of a
|
||||
# second zero (first second of the week) of the configured reference time
|
||||
# system. For protocol version 18 and later the navigation period is an integer
|
||||
# multiple of the measurement period.
|
||||
# - Each measurement triggers the measurements generation and raw data output.
|
||||
# - The navRate value defines that every nth measurement triggers a navigation
|
||||
# epoch.
|
||||
# - The update rate has a direct influence on the power consumption. The more
|
||||
# fixes that are required, the more CPU power and communication resources
|
||||
# are required.
|
||||
# - For most applications a 1 Hz update rate would be sufficient.
|
||||
# - When using Power Save Mode, measurement and navigation rate can differ from
|
||||
# the values configured here
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 8
|
||||
|
||||
uint16 measRate # Measurement Rate, GPS measurements are
|
||||
# taken every measRate milliseconds [ms]
|
||||
uint16 navRate # Navigation Rate, in number of measurement
|
||||
# cycles. On u-blox 5 and u-blox 6, this parameter
|
||||
# cannot be changed, and always equals 1.
|
||||
uint16 timeRef # The time system to which measurements are aligned
|
||||
uint16 TIME_REF_UTC = 0
|
||||
uint16 TIME_REF_GPS = 1
|
||||
uint16 TIME_REF_GLONASS = 2 # not supported in protocol versions less than 18
|
||||
uint16 TIME_REF_BEIDOU = 3 # not supported in protocol versions less than 18
|
||||
uint16 TIME_REF_GALILEO = 4 # not supported in protocol versions less than 18
|
||||
@@ -1,38 +0,0 @@
|
||||
# CFG-RST (0x06 0x04)
|
||||
# Reset Receiver / Clear Backup Data Structures
|
||||
#
|
||||
# Don't expect this message to be acknowledged by the receiver.
|
||||
# - Newer FW version won't acknowledge this message at all.
|
||||
# - Older FW version will acknowledge this message but the acknowledge may not
|
||||
# be sent completely before the receiver is reset.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 4
|
||||
|
||||
uint16 navBbrMask # BBR Sections to clear.
|
||||
# The following Special Sets apply:
|
||||
uint16 NAV_BBR_HOT_START = 0 # Hot start the device
|
||||
uint16 NAV_BBR_WARM_START = 1 # Warm start the device
|
||||
uint16 NAV_BBR_COLD_START = 65535 # Cold start the device
|
||||
uint16 NAV_BBR_EPH = 1 # Ephemeris
|
||||
uint16 NAV_BBR_ALM = 2 # Almanac
|
||||
uint16 NAV_BBR_HEALTH = 4 # Health
|
||||
uint16 NAV_BBR_KLOB = 8 # Klobuchar parameters
|
||||
uint16 NAV_BBR_POS = 16 # Position
|
||||
uint16 NAV_BBR_CLKD = 32 # Clock Drift
|
||||
uint16 NAV_BBR_OSC = 64 # Oscillator Parameter
|
||||
uint16 NAV_BBR_UTC = 128 # UTC Correction + GPS Leap Seconds Parameters
|
||||
uint16 NAV_BBR_RTC = 256 # RTC
|
||||
uint16 NAV_BBR_AOP = 32768 # Autonomous Orbit Parameters
|
||||
|
||||
uint8 resetMode # Reset Type:
|
||||
uint8 RESET_MODE_HW_IMMEDIATE = 0 # Hardware reset (Watchdog) immediately
|
||||
uint8 RESET_MODE_SW = 1 # Controlled Software reset
|
||||
uint8 RESET_MODE_GNSS = 2 # Controlled Software reset (GNSS only)
|
||||
uint8 RESET_MODE_HW_AFTER_SHUTDOWN = 4 # Hardware reset (Watchdog) after
|
||||
# shutdown
|
||||
uint8 RESET_MODE_GNSS_STOP = 8 # Controlled GNSS stop
|
||||
uint8 RESET_MODE_GNSS_START = 9 # Controlled GNSS start
|
||||
|
||||
uint8 reserved1 # Reserved
|
||||
@@ -1,36 +0,0 @@
|
||||
# CFG-SBAS (0x06 0x16)
|
||||
# SBAS Configuration
|
||||
#
|
||||
# This message configures the SBAS receiver subsystem (i.e. WAAS, EGNOS, MSAS).
|
||||
# See the SBAS Configuration Settings Description for a detailed description of
|
||||
# how these settings affect receiver operation
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 22
|
||||
|
||||
uint8 mode # SBAS Mode
|
||||
uint8 MODE_ENABLED = 1 # SBAS Enabled (1) / Disabled (0)
|
||||
# This field is deprecated; use UBX-CFG-GNSS to
|
||||
# enable/disable SBAS operation
|
||||
uint8 MODE_TEST = 2 # SBAS Testbed: Use data anyhow (1) / Ignore data when
|
||||
# in Test Mode (SBAS Msg 0)
|
||||
|
||||
uint8 usage # SBAS Usage
|
||||
uint8 USAGE_RANGE = 1 # Use SBAS GEOs as a ranging source (for navigation)
|
||||
uint8 USAGE_DIFF_CORR = 2 # Use SBAS Differential Corrections
|
||||
uint8 USAGE_INTEGRITY = 4 # Use SBAS Integrity Information
|
||||
|
||||
uint8 maxSBAS # Maximum Number of SBAS prioritized tracking
|
||||
# channels (valid range: 0 - 3) to use
|
||||
# (obsolete and superseeded by UBX-CFG-GNSS in protocol
|
||||
# versions 14+).
|
||||
|
||||
|
||||
uint8 scanmode2 # Continuation of scanmode bitmask below
|
||||
# PRN 152...158
|
||||
uint32 scanmode1 # Which SBAS PRN numbers to search for (Bitmask)
|
||||
# If all Bits are set to zero, auto-scan (i.e. all valid
|
||||
# PRNs) are searched. Every bit corresponds to a PRN
|
||||
# number.
|
||||
# PRN 120..151
|
||||
@@ -1,68 +0,0 @@
|
||||
# CFG-TMODE3 (0x06, 0x71)
|
||||
# Time Mode Settings 3
|
||||
#
|
||||
# Configures the receiver to be in Time Mode. The position referred to in this
|
||||
# message is that of the Antenna Reference Point (ARP). See the Time Mode
|
||||
# Description for details.
|
||||
#
|
||||
# Supported on:
|
||||
# - u-blox 8 / u-blox M8 with protocol version 20 (only with High Precision
|
||||
# GNSS products)
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 113
|
||||
|
||||
uint8 version # Message version (0x00 for this version)
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
uint16 flags
|
||||
uint16 FLAGS_MODE_MASK = 255 # Receiver Mode:
|
||||
uint16 FLAGS_MODE_DISABLED = 0 # Disabled
|
||||
uint16 FLAGS_MODE_SURVEY_IN = 1 # Survey In
|
||||
uint16 FLAGS_MODE_FIXED = 2 # Fixed Mode (true ARP position required)
|
||||
uint16 FLAGS_LLA = 256 # Position is given in LAT/LON/ALT
|
||||
# (default is ECEF)
|
||||
|
||||
int32 ecefXOrLat # WGS84 ECEF X coordinate (or latitude) of
|
||||
# the ARP position, depending on flags above
|
||||
# [cm] or [deg / 1e-7]
|
||||
int32 ecefYOrLon # WGS84 ECEF Y coordinate (or longitude) of
|
||||
# the ARP position, depending on flags above
|
||||
# [cm] or [deg / 1e-7]
|
||||
int32 ecefZOrAlt # WGS84 ECEF Z coordinate (or altitude) of
|
||||
# the ARP position, depending on flags above
|
||||
# [cm]
|
||||
int8 ecefXOrLatHP # High-precision WGS84 ECEF X coordinate (or
|
||||
# latitude) of the ARP position, depending on
|
||||
# flags above. Must be in the range -99..+99.
|
||||
# The precise WGS84 ECEF X coordinate in units
|
||||
# of cm, or the precise WGS84 ECEF latitude in
|
||||
# units of 1e-7 degrees, is given by
|
||||
# ecefXOrLat + (ecefXOrLatHP * 1e-2)
|
||||
# [0.1 mm] or [deg * 1e-9]
|
||||
int8 ecefYOrLonHP # High-precision WGS84 ECEF Y coordinate (or
|
||||
# longitude) of the ARP position, depending on
|
||||
# flags above. Must be in the range -99..+99.
|
||||
# The precise WGS84 ECEF Y coordinate in units
|
||||
# of cm, or the precise WGS84 ECEF longitude
|
||||
# in units of 1e-7 degrees, is given by
|
||||
# ecefYOrLon + (ecefYOrLonHP * 1e-2)
|
||||
# [0.1 mm] or [deg * 1e-9]
|
||||
int8 ecefZOrAltHP # High-precision WGS84 ECEF Z coordinate (or
|
||||
# altitude) of the ARP position, depending on
|
||||
# flags above. Must be in the range -99..+99.
|
||||
# The precise WGS84 ECEF Z coordinate, or
|
||||
# altitude coordinate, in units of cm is given
|
||||
# by ecefZOrAlt + (ecefZOrAltHP * 1e-2)
|
||||
# [0.1 mm]
|
||||
uint8 reserved2 # Reserved
|
||||
|
||||
uint32 fixedPosAcc # Fixed position 3D accuracy
|
||||
# [0.1 mm]
|
||||
uint32 svinMinDur # Survey-in minimum duration
|
||||
# [s]
|
||||
uint32 svinAccLimit # Survey-in position accuracy limit
|
||||
# [0.1 mm]
|
||||
|
||||
uint8[8] reserved3 # Reserved
|
||||
@@ -1,30 +0,0 @@
|
||||
# UBX-CFG-USB (0x06 0x1B)
|
||||
# USB Configuration
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 6
|
||||
uint8 MESSAGE_ID = 27
|
||||
|
||||
uint16 vendorID # Only set to registered Vendor IDs.
|
||||
# Changing this field requires special Host drivers.
|
||||
|
||||
uint16 productID # Product ID. Changing this field requires special
|
||||
# Host drivers.
|
||||
|
||||
uint8[2] reserved1 # Reserved
|
||||
uint8[2] reserved2 # Reserved
|
||||
|
||||
uint16 powerConsumption # Power consumed by the device [mA]
|
||||
|
||||
uint16 flags # various configuration flags (see graphic below)
|
||||
uint16 FLAGS_RE_ENUM = 0 # force re-enumeration
|
||||
uint16 FLAGS_POWER_MODE = 2 # self-powered (1), bus-powered (0)
|
||||
|
||||
int8[32] vendorString # String containing the vendor name.
|
||||
# 32 ASCII bytes including 0-termination.
|
||||
int8[32] productString # String containing the product name.
|
||||
# 32 ASCII bytes including 0-termination.
|
||||
int8[32] serialNumber # String containing the serial number.
|
||||
# 32 ASCII bytes including 0-termination.
|
||||
# Changing the String fields requires special Host
|
||||
# drivers.
|
||||
@@ -1,38 +0,0 @@
|
||||
# ESF-INS (0x10 0x15)
|
||||
# Vehicle dynamics information
|
||||
#
|
||||
# This message outputs information about vehicle dynamics computed by the
|
||||
# Inertial Navigation System (INS) during ESF-based navigation.
|
||||
# For ADR products, the output dynamics information (angular rates and
|
||||
# accelerations) is expressed with respect to the vehicle-frame.
|
||||
# For UDR products, the output dynamics information (angular rates and
|
||||
# accelerations) is expressed with respect to the body-frame.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 16
|
||||
uint8 MESSAGE_ID = 21
|
||||
|
||||
uint32 bitfield0 # Bitfield (see graphic below)
|
||||
uint32 BITFIELD0_VERSION = 255 # Message version (1 for this version).
|
||||
uint32 BITFIELD0_X_ANG_RATE_VALID = 256 # Compensated x-axis angular rate data
|
||||
# validity flag
|
||||
uint32 BITFIELD0_Y_ANG_RATE_VALID = 512 # Compensated y-axis angular rate data
|
||||
# validity flag
|
||||
uint32 BITFIELD0_Z_ANG_RATE_VALID = 1024 # Compensated z-axis angular rate data
|
||||
# validity flag
|
||||
uint32 BITFIELD0_X_ACCEL_VALID = 2048 # Compensated x-axis acceleration data
|
||||
# validity flag
|
||||
uint32 BITFIELD0_Y_ACCEL_VALID = 4096 # Compensated y-axis acceleration data
|
||||
# validity flag
|
||||
uint32 BITFIELD0_Z_ACCEL_VALID = 8192 # Compensated z-axis acceleration data
|
||||
# validity flag
|
||||
|
||||
uint8[4] reserved1 # Reserved
|
||||
|
||||
uint32 iTOW # GPS time of week of the navigation epoch [ms]
|
||||
int32 xAngRate # Compensated x-axis angular rate [deg/s / 1e-3]
|
||||
int32 yAngRate # Compensated y-axis angular rate [deg/s / 1e-3]
|
||||
int32 zAngRate # Compensated z-axis angular rate [deg/s / 1e-3]
|
||||
int32 xAccel # Compensated x-axis acceleration (gravity-free) [mg]
|
||||
int32 yAccel # Compensated y-axis acceleration (gravity-free) [mg]
|
||||
int32 zAccel # Compensated z-axis acceleration (gravity-free) [mg]
|
||||
@@ -1,77 +0,0 @@
|
||||
# ESF-MEAS (0x10 0x02)
|
||||
# External Sensor Fusion Measurements
|
||||
#
|
||||
# Possible data types for the data field are described in the ESF Measurement
|
||||
# Data section
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 16
|
||||
uint8 MESSAGE_ID = 2
|
||||
|
||||
uint32 timeTag # Time tag of measurement generated by external
|
||||
# sensor
|
||||
|
||||
uint16 flags # Flags. Set all unused bits to zero:
|
||||
uint16 FLAGS_TIME_MARK_SENT_MASK = 3 # Time mark signal was supplied just
|
||||
# prior to sending this message: 0 =
|
||||
uint16 TIME_MARK_NONE = 0
|
||||
uint16 TIME_MARK_EXT0 = 1
|
||||
uint16 TIME_MARK_EXT = 2
|
||||
uint16 FLAGS_TIME_MARK_EDGE = 4 # Trigger on rising (0) or falling
|
||||
# (1) edge of time mark signal
|
||||
uint16 FLAGS_CALIB_T_TAG_VALID = 8 # Calibration time tag available.
|
||||
# Always set to zero.
|
||||
|
||||
uint16 id # Identification number of data provider
|
||||
|
||||
# Start of repeated block (N times)
|
||||
uint32[] data # data, see mask below
|
||||
uint32 DATA_FIELD_MASK = 16777215 # data
|
||||
uint32 DATA_TYPE_MASK = 1056964608 # type of data (1..63)
|
||||
uint32 DATA_TYPE_SHIFT = 24
|
||||
uint32 DATA_TYPE_NONE = 0 # data field contains no data
|
||||
uint32 DATA_TYPE_Z_AXIS_GYRO = 5 # z-axis gyroscope angular rate
|
||||
# [deg/s *2^-12 signed]
|
||||
uint32 DATA_TYPE_WHEEL_TICKS_FRONT_LEFT = 6 # front-left wheel ticks
|
||||
# Bits 0-22: unsigned tick value.
|
||||
# Bit 23: direction indicator
|
||||
# (0=forward, 1=backward)
|
||||
uint32 DATA_TYPE_WHEEL_TICKS_FRONT_RIGHT = 7 # front-right wheel ticks
|
||||
# Bits 0-22: unsigned tick value.
|
||||
# Bit 23: direction indicator
|
||||
# (0=forward, 1=backward)
|
||||
uint32 DATA_TYPE_WHEEL_TICKS_REAR_LEFT = 8 # rear-left wheel ticks
|
||||
# Bits 0-22: unsigned tick value.
|
||||
# Bit 23: direction indicator
|
||||
# (0=forward, 1=backward)
|
||||
uint32 DATA_TYPE_WHEEL_TICKS_REAR_RIGHT = 9 # rear-right wheel ticks
|
||||
# Bits 0-22: unsigned tick value.
|
||||
# Bit 23: direction indicator
|
||||
# (0=forward, 1=backward)
|
||||
uint32 DATA_TYPE_SINGLE_TICK = 10 # single tick (speed tick)
|
||||
# Bits 0-22: unsigned tick value.
|
||||
# Bit 23: direction indicator
|
||||
# (0=forward, 1=backward)
|
||||
uint32 DATA_TYPE_SPEED = 11 # speed m/s * 1e-3 signed
|
||||
uint32 DATA_TYPE_GYRO_TEMPERATURE = 12 # gyroscope temperature
|
||||
# [deg Celsius * 1e-2 signed]
|
||||
uint32 DATA_TYPE_GYRO_ANG_RATE_Y = 13 # y-axis gyroscope angular rate
|
||||
# [deg/s *2^-12 signed]
|
||||
uint32 DATA_TYPE_GYRO_ANG_RATE_X = 14 # x-axis gyroscope angular rate
|
||||
# [deg/s *2^-12 signed]
|
||||
uint32 DATA_TYPE_ACCELEROMETER_X = 16 # x-axis accelerometer specific
|
||||
# [force m/s^2 *2^-10 signed]
|
||||
uint32 DATA_TYPE_ACCELEROMETER_Y = 17 # y-axis accelerometer specific
|
||||
# [force m/s^2 *2^-10 signed]
|
||||
uint32 DATA_TYPE_ACCELEROMETER_Z = 18 # z-axis accelerometer specific
|
||||
# [force m/s^2 *2^-10 signed]
|
||||
|
||||
|
||||
|
||||
# End of repeated block
|
||||
|
||||
# Start of optional block (size is either 0 or 1)
|
||||
uint32[] calibTtag # Receiver local time calibrated.
|
||||
# This field must not be supplied when
|
||||
# calibTtagValid is set to 0 [ms]
|
||||
# End of optional block
|
||||
@@ -1,18 +0,0 @@
|
||||
# ESF-RAW (0x10 0x03)
|
||||
# Raw sensor measurements
|
||||
#
|
||||
# The message contains measurements from the active inertial sensors connected
|
||||
# to the GNSS chip. Possible data types for the data field are accelerometer,
|
||||
# gyroscope and temperature readings as described in the ESF Measurement Data
|
||||
# section. Note that the rate selected in CFG-MSG is not respected. If a
|
||||
# positive rate is selected then all raw measurements will be output.
|
||||
#
|
||||
# Supported on ADR/UDR products.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 16
|
||||
uint8 MESSAGE_ID = 3
|
||||
|
||||
uint8[4] reserved0 # Reserved
|
||||
|
||||
EsfRAW_Block[] blocks
|
||||
@@ -1,8 +0,0 @@
|
||||
# See ESF-RAW
|
||||
|
||||
uint32 data # Its scaling and unit depends on the type and is
|
||||
# the same as in ESF-MEAS
|
||||
uint32 DATA_FIELD_MASK = 16777215
|
||||
uint32 DATA_TYPE_MASK = 4278190080 # type of data
|
||||
# (0 = no data; 1..255 = data type)
|
||||
uint32 sTtag # sensor time tag
|
||||
@@ -1,34 +0,0 @@
|
||||
# ESF-STATUS (0x10 0x10)
|
||||
# External Sensor Fusion (ESF) status information
|
||||
#
|
||||
# Supported on UDR/ADR products
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 16
|
||||
uint8 MESSAGE_ID = 16
|
||||
|
||||
uint32 iTOW # GPS time of week of the navigation epoch [ms]
|
||||
uint8 version # Message version (2 for this version)
|
||||
|
||||
uint8[7] reserved1 # Reserved
|
||||
|
||||
uint8 fusionMode # Fusion mode:
|
||||
uint8 FUSION_MODE_INIT = 0 # receiver is initializing some unknown values
|
||||
# required for doing sensor fusion
|
||||
uint8 FUSION_MODE_FUSION = 1 # GNSS and sensor data are
|
||||
# used for navigation solution computation
|
||||
uint8 FUSION_MODE_SUSPENDED = 2 # sensor fusion is temporarily disabled
|
||||
# due to e.g. invalid sensor data or detected
|
||||
# ferry
|
||||
uint8 FUSION_MODE_DISABLED = 3 # sensor fusion is permanently disabled
|
||||
# until receiver reset due e.g. to sensor
|
||||
# error
|
||||
|
||||
uint8[2] reserved2 # Reserved
|
||||
|
||||
uint8 numSens # Number of sensors
|
||||
|
||||
|
||||
# Start of repeated block (numSens times)
|
||||
EsfSTATUS_Sens[] sens
|
||||
# End of repeated block
|
||||
@@ -1,7 +0,0 @@
|
||||
# See Esf-STATUS
|
||||
#
|
||||
|
||||
uint8 sensStatus1 # Sensor status, part 1 (see graphic below)
|
||||
uint8 sensStatus2 # Sensor status, part 2 (see graphic below)
|
||||
uint8 freq # Observation frequency [Hz]
|
||||
uint8 faults # Sensor faults (see graphic below)
|
||||
@@ -1,67 +0,0 @@
|
||||
# HNR-PVT (0x28 0x00)
|
||||
# High Rate Output of PVT Solution
|
||||
#
|
||||
# Note that during a leap second there may be more (or less) than 60 seconds in
|
||||
# a minute; see the description of leap seconds for details.
|
||||
#
|
||||
# This message provides the position, velocity and time solution with high
|
||||
# output rate.
|
||||
#
|
||||
# Supported on ADR and UDR products.
|
||||
#
|
||||
uint8 CLASS_ID = 40
|
||||
uint8 MESSAGE_ID = 0
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
uint16 year # Year (UTC)
|
||||
uint8 month # Month, range 1..12 (UTC)
|
||||
uint8 day # Day of month, range 1..31 (UTC)
|
||||
uint8 hour # Hour of day, range 0..23 (UTC)
|
||||
uint8 min # Minute of hour, range 0..59 (UTC)
|
||||
uint8 sec # Seconds of minute, range 0..60 (UTC)
|
||||
|
||||
uint8 valid # Validity flags
|
||||
uint8 VALID_DATE = 1 # Valid UTC Date
|
||||
uint8 VALID_TIME = 2 # Valid
|
||||
uint8 VALID_FULLY_RESOLVED = 4 # UTC time of day has been fully resolved
|
||||
# (no seconds uncertainty)
|
||||
uint8 VALID_MAG = 8 # Valid Magnetic Declination
|
||||
|
||||
int32 nano # fraction of a second [ns], range -1e9 .. 1e9 (UTC)
|
||||
|
||||
uint8 gpsFix # GPS fix Type, range 0..5
|
||||
uint8 FIX_TYPE_NO_FIX = 0
|
||||
uint8 FIX_TYPE_DEAD_RECKONING_ONLY = 1
|
||||
uint8 FIX_TYPE_2D = 2 # Signal from only 3 SVs,
|
||||
# constant altitude assumed
|
||||
uint8 FIX_TYPE_3D = 3
|
||||
uint8 FIX_TYPE_GPS_DEAD_RECKONING_COMBINED = 4 # GPS + Dead reckoning
|
||||
uint8 FIX_TYPE_TIME_ONLY = 5 # Time only fix
|
||||
|
||||
uint8 flags # Fix Status Flags
|
||||
uint8 FLAGS_GNSS_FIX_OK = 1 # i.e. within DOP & accuracy masks
|
||||
uint8 FLAGS_DIFF_SOLN = 2 # DGPS used
|
||||
uint8 FLAGS_WKN_SET = 4 # Valid GPS week number
|
||||
uint8 FLAGS_TOW_SET = 8 # Valid GPS time of week (iTOW & fTOW)
|
||||
uint8 FLAGS_HEAD_VEH_VALID = 32 # heading of vehicle is valid
|
||||
|
||||
uint8[2] reserved0 # Reserved
|
||||
|
||||
int32 lon # Longitude [deg / 1e-7]
|
||||
int32 lat # Latitude [deg / 1e-7]
|
||||
int32 height # Height above Ellipsoid [mm]
|
||||
int32 hMSL # Height above mean sea level [mm]
|
||||
|
||||
int32 gSpeed # Ground Speed (2-D) [mm/s]
|
||||
int32 speed # Speed (3-D) [mm/s]
|
||||
|
||||
int32 headMot # Heading of motion (2-D) [deg / 1e-5]
|
||||
int32 headVeh # Heading of vehicle (2-D) [deg / 1e-5]
|
||||
|
||||
uint32 hAcc # Horizontal Accuracy Estimate [mm]
|
||||
uint32 vAcc # Vertical Accuracy Estimate [mm]
|
||||
uint32 sAcc # Speed Accuracy Estimate [mm/s]
|
||||
uint32 headAcc # Heading Accuracy Estimate (both motion & vehicle)
|
||||
# [deg / 1e-5]
|
||||
|
||||
uint8[4] reserved1 # Reserved
|
||||
@@ -1,9 +0,0 @@
|
||||
# UBX-INF (0x04, 0x00...0x04)
|
||||
# ASCII output
|
||||
#
|
||||
# This message has a variable length payload, representing an ASCII string.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 4
|
||||
|
||||
char[] str
|
||||
@@ -1,61 +0,0 @@
|
||||
# MGA-GAL (0x13 0x02)
|
||||
# Galileo Ephemeris Assistance
|
||||
#
|
||||
# This message allows the delivery of Galileo ephemeris assistance to a
|
||||
# receiver. See the description of AssistNow Online for details.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 19
|
||||
uint8 MESSAGE_ID = 2
|
||||
|
||||
uint8 type # Message type (0x01 for this type)
|
||||
uint8 version # Message version (0x00 for this version)
|
||||
uint8 svid # Galileo Satellite identifier
|
||||
|
||||
uint8 reserved0 # Reserved
|
||||
|
||||
uint16 iodNav # Ephemeris and clock correction issue of Data
|
||||
int16 deltaN # Mean motion difference from computed value
|
||||
# [semi-cir cles/s * 2^-43]
|
||||
int32 m0 # Mean anomaly at reference time [semi-cir cles 2^-31]
|
||||
uint32 e # Eccentricity [2^-33]
|
||||
uint32 sqrtA # Square root of the semi-major axis [m^0.5 * 2^-19]
|
||||
int32 omega0 # Longitude of ascending node of orbital plane at weekly
|
||||
# epoch [semi-cir cles 2^-31]
|
||||
int32 i0 # inclination angle at reference time
|
||||
# [semi-cir cles 2^-31]
|
||||
int32 omega # Argument of perigee [semi-cir cles 2^-31]
|
||||
int32 omegaDot # Rate of change of right ascension
|
||||
# [semi-cir cles/s 2^-43]
|
||||
int16 iDot # Rate of change of inclination angle
|
||||
# [semi-cir cles/s 2^-43]
|
||||
int16 cuc # Amplitude of the cosine harmonic correction term to
|
||||
# the argument of latitude [radians * 2^-29]
|
||||
int16 cus # Amplitude of the sine harmonic correction term to
|
||||
# the argument of latitude [radians * 2^-29]
|
||||
int16 crc # Amplitude of the cosine harmonic correction term
|
||||
# to the orbit radius [radians * 2^-5]
|
||||
int16 crs # Amplitude of the sine harmonic correction term to the
|
||||
# orbit radius [radians * 2^-5]
|
||||
int16 cic # Amplitude of the cosine harmonic correction term to
|
||||
# the angle of inclination [radians * 2^-29]
|
||||
int16 cis # Amplitude of the sine harmonic correction term to the
|
||||
# angle of inclination [radians * 2^-29]
|
||||
uint16 toe # Ephemeris reference time [60 * s]
|
||||
int32 af0 # clock bias correction coefficient [s * 2^-34]
|
||||
int32 af1 # SV clock drift correction coefficient [s/s * 2^-46]
|
||||
int8 af2 # SV clock drift rate correction coefficient
|
||||
# [s/s^2 * 2^-59]
|
||||
uint8 sisaindexE1E5b # Signal-in-Space Accuracy index for dual frequency
|
||||
# E1-E5b
|
||||
uint16 toc # Clock correction data reference Time of Week [60 * s]
|
||||
int16 bgdE1E5b # E1-E5b Broadcast Group Delay
|
||||
|
||||
uint8[2] reserved1 # Reserved
|
||||
|
||||
uint8 healthE1B # E1-B Signal Health Status
|
||||
uint8 dataValidityE1B # E1-B Data Validity Status
|
||||
uint8 healthE5b # E5b Signal Health Status
|
||||
uint8 dataValidityE5b # E5b Data Validity Status
|
||||
|
||||
uint8[4] reserved2 # Reserved
|
||||
@@ -1,31 +0,0 @@
|
||||
# MON-GNSS (0x0A 0x28)
|
||||
# Information message major GNSS selection
|
||||
#
|
||||
# This message reports major GNSS selection. Augmentation systems are not
|
||||
# reported.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 10
|
||||
uint8 MESSAGE_ID = 40
|
||||
|
||||
uint8 version # Message version (0x01 for this version)
|
||||
|
||||
uint8 BIT_MASK_GPS = 1
|
||||
uint8 BIT_MASK_GLONASS = 2
|
||||
uint8 BIT_MASK_BEIDOU = 4
|
||||
uint8 BIT_MASK_GALILEO = 8
|
||||
|
||||
uint8 supported # The major GNSS that can be supported by this receiver
|
||||
uint8 defaultGnss # Default major GNSS selection. If the default major GNSS
|
||||
# selection is currently configured in the efuse for this
|
||||
# receiver, it takes precedence over the default major
|
||||
# GNSS selection configured in the executing firmware of
|
||||
# this receiver.
|
||||
# see bit mask constants
|
||||
uint8 enabled # Current major GNSS selection enabled for this receiver
|
||||
# see bit mask constants
|
||||
|
||||
uint8 simultaneous # Maximum number of concurrent major GNSS that can be
|
||||
# supported by this receiver
|
||||
|
||||
uint8[3] reserved1 # Reserved
|
||||
@@ -1,57 +0,0 @@
|
||||
# MON-HW (0x0A 0x09)
|
||||
# Hardware Status
|
||||
#
|
||||
# Status of different aspect of the hardware, such as Antenna, PIO/Peripheral
|
||||
# Pins, Noise Level, Automatic Gain Control (AGC)
|
||||
#
|
||||
# WARNING: this message is a different length than the MonHW message for
|
||||
# firmware version 6
|
||||
|
||||
uint8 CLASS_ID = 10
|
||||
uint8 MESSAGE_ID = 9
|
||||
|
||||
uint32 pinSel # Mask of Pins Set as Peripheral/PIO
|
||||
uint32 pinBank # Mask of Pins Set as Bank A/B
|
||||
uint32 pinDir # Mask of Pins Set as Input/Output
|
||||
uint32 pinVal # Mask of Pins Value Low/High
|
||||
uint16 noisePerMS # Noise Level as measured by the GPS Core
|
||||
uint16 agcCnt # AGC Monitor (counts SIGHI xor SIGLO,
|
||||
# range 0 to 8191)
|
||||
uint8 aStatus # Status of the Antenna Supervisor State Machine
|
||||
uint8 A_STATUS_INIT = 0
|
||||
uint8 A_STATUS_UNKNOWN = 1
|
||||
uint8 A_STATUS_OK = 2
|
||||
uint8 A_STATUS_SHORT = 3
|
||||
uint8 A_STATUS_OPEN = 4
|
||||
|
||||
uint8 aPower # Current PowerStatus of Antenna
|
||||
uint8 A_POWER_OFF = 0
|
||||
uint8 A_POWER_ON = 1
|
||||
uint8 A_POWER_UNKNOWN = 2
|
||||
|
||||
uint8 flags # Flags:
|
||||
uint8 FLAGS_RTC_CALIB = 1 # RTC is calibrated
|
||||
uint8 FLAGS_SAFE_BOOT = 2 # Safe boot mode (0 = inactive, 1 = active)
|
||||
uint8 FLAGS_JAMMING_STATE_MASK = 12 # output from Jamming/Interference Monitor:
|
||||
uint8 JAMMING_STATE_UNKNOWN_OR_DISABLED = 0 # unknown or feature disabled
|
||||
uint8 JAMMING_STATE_OK = 4 # ok - no significant jamming
|
||||
uint8 JAMMING_STATE_WARNING = 8 # interference visible but fix OK
|
||||
uint8 JAMMING_STATE_CRITICAL = 12 # interference visible and no fix
|
||||
uint8 FLAGS_XTAL_ABSENT = 16 # RTC XTAL is absent
|
||||
# (not supported in protocol versions < 18)
|
||||
uint8 reserved0 # Reserved
|
||||
uint32 usedMask # Mask of Pins that are used by the Virtual Pin
|
||||
# Manager
|
||||
uint8[17] VP # Array of Pin Mappings for each of the 17
|
||||
# Physical Pins
|
||||
uint8 jamInd # CW Jamming indicator, scaled:
|
||||
uint8 JAM_IND_NONE = 0 # No CW Jamming
|
||||
uint8 JAM_IND_STRONG = 255 # Strong CW Jamming
|
||||
|
||||
uint8[2] reserved1 # Reserved
|
||||
|
||||
uint32 pinIrq # Mask of Pins Value using the PIO Irq
|
||||
uint32 pullH # Mask of Pins Value using the PIO Pull High
|
||||
# Resistor
|
||||
uint32 pullL # Mask of Pins Value using the PIO Pull Low
|
||||
# Resistor
|
||||
@@ -1,58 +0,0 @@
|
||||
# MON-HW (0x0A 0x09)
|
||||
# Hardware Status
|
||||
# Firmware 6
|
||||
#
|
||||
# Status of different aspect of the hardware, such as Antenna, PIO/Peripheral
|
||||
# Pins, Noise Level, Automatic Gain Control (AGC)
|
||||
#
|
||||
# WARNING: this message is a different length than the MonHW message for
|
||||
# firmware version 7 & 8
|
||||
|
||||
uint8 CLASS_ID = 10
|
||||
uint8 MESSAGE_ID = 9
|
||||
|
||||
uint32 pinSel # Mask of Pins Set as Peripheral/PIO
|
||||
uint32 pinBank # Mask of Pins Set as Bank A/B
|
||||
uint32 pinDir # Mask of Pins Set as Input/Output
|
||||
uint32 pinVal # Mask of Pins Value Low/High
|
||||
uint16 noisePerMS # Noise Level as measured by the GPS Core
|
||||
uint16 agcCnt # AGC Monitor (counts SIGHI xor SIGLO,
|
||||
# range 0 to 8191)
|
||||
uint8 aStatus # Status of the Antenna Supervisor State Machine
|
||||
uint8 A_STATUS_INIT = 0
|
||||
uint8 A_STATUS_UNKNOWN = 1
|
||||
uint8 A_STATUS_OK = 2
|
||||
uint8 A_STATUS_SHORT = 3
|
||||
uint8 A_STATUS_OPEN = 4
|
||||
|
||||
uint8 aPower # Current PowerStatus of Antenna
|
||||
uint8 A_POWER_OFF = 0
|
||||
uint8 A_POWER_ON = 1
|
||||
uint8 A_POWER_UNKNOWN = 2
|
||||
|
||||
uint8 flags # Flags:
|
||||
uint8 FLAGS_RTC_CALIB = 1 # RTC is calibrated
|
||||
uint8 FLAGS_SAFE_BOOT = 2 # Safe boot mode (0 = inactive, 1 = active)
|
||||
uint8 FLAGS_JAMMING_STATE_MASK = 12 # output from Jamming/Interference Monitor:
|
||||
uint8 JAMMING_STATE_UNKNOWN_OR_DISABLED = 0 # unknown or feature disabled
|
||||
uint8 JAMMING_STATE_OK = 4 # ok - no significant jamming
|
||||
uint8 JAMMING_STATE_WARNING = 8 # interference visible but fix OK
|
||||
uint8 JAMMING_STATE_CRITICAL = 12 # interference visible and no fix
|
||||
uint8 FLAGS_XTAL_ABSENT = 16 # RTC XTAL is absent
|
||||
# (not supported in protocol versions < 18)
|
||||
uint8 reserved0 # Reserved
|
||||
uint32 usedMask # Mask of Pins that are used by the Virtual Pin
|
||||
# Manager
|
||||
uint8[25] VP # Array of Pin Mappings for each of the 25
|
||||
# Physical Pins
|
||||
uint8 jamInd # CW Jamming indicator, scaled:
|
||||
uint8 JAM_IND_NONE = 0 # No CW Jamming
|
||||
uint8 JAM_IND_STRONG = 255 # Strong CW Jamming
|
||||
|
||||
uint8[2] reserved1 # Reserved
|
||||
|
||||
uint32 pinIrq # Mask of Pins Value using the PIO Irq
|
||||
uint32 pullH # Mask of Pins Value using the PIO Pull High
|
||||
# Resistor
|
||||
uint32 pullL # Mask of Pins Value using the PIO Pull Low
|
||||
# Resistor
|
||||
@@ -1,14 +0,0 @@
|
||||
# MON-VER (0x0A 0x04)
|
||||
#
|
||||
# Receiver/Software Version
|
||||
# Returned when the version is polled.
|
||||
|
||||
uint8 CLASS_ID = 10
|
||||
uint8 MESSAGE_ID = 4
|
||||
|
||||
char[30] swVersion # Zero-terminated software version string.
|
||||
char[10] hwVersion # Zero-terminated hardware version string.
|
||||
|
||||
# Start of repeated block (N times)
|
||||
MonVER_Extension[] extension
|
||||
# End of repeated block
|
||||
@@ -1,4 +0,0 @@
|
||||
# see MonVER message
|
||||
#
|
||||
|
||||
char[30] field
|
||||
@@ -1,23 +0,0 @@
|
||||
# NAV-ATT (0x01 0x05)
|
||||
# Attitude Solution
|
||||
#
|
||||
# This message outputs the attitude solution as roll, pitch and heading angles.
|
||||
# Supported on ADR and UDR products.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 5
|
||||
|
||||
uint32 iTOW # GPS time of week of the navigation epoch [ms]
|
||||
uint8 version # Message version (0 for this version)
|
||||
|
||||
uint8[3] reserved0 # Reserved
|
||||
|
||||
int32 roll # Vehicle roll. [deg / 1e-5]
|
||||
int32 pitch # Vehicle pitch. [deg / 1e-5]
|
||||
int32 heading # Vehicle heading. [deg / 1e-5]
|
||||
uint32 accRoll # Vehicle roll accuracy (if null, roll angle is not
|
||||
# available). [deg / 1e-5]
|
||||
uint32 accPitch # Vehicle pitch accuracy (if null, pitch angle is not
|
||||
# available). [deg / 1e-5]
|
||||
uint32 accHeading # Vehicle heading accuracy [deg / 1e-5]
|
||||
@@ -1,13 +0,0 @@
|
||||
# NAV-CLOCK (0x01 0x22)
|
||||
# Clock Solution
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 34
|
||||
|
||||
uint32 iTOW # GPS Millisecond Time of week [ms]
|
||||
|
||||
int32 clkB # Clock bias in nanoseconds [ns]
|
||||
int32 clkD # Clock drift in nanoseconds per second [ns/s]
|
||||
uint32 tAcc # Time Accuracy Estimate [ns]
|
||||
uint32 fAcc # Frequency Accuracy Estimate [ps/s]
|
||||
@@ -1,25 +0,0 @@
|
||||
# NAV-DGPS (0x01 0x31)
|
||||
# DGPS Data Used for NAV
|
||||
#
|
||||
# This message outputs the Correction data as it has been applied to the current
|
||||
# NAV Solution. See also the notes on the RTCM protocol.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 49
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
int32 age # Age of newest correction data [ms]
|
||||
int16 baseId # DGPS Base Station ID
|
||||
int16 baseHealth # DGPS Base Station Health Status
|
||||
int8 numCh # Number of channels for which correction data is
|
||||
# following
|
||||
|
||||
uint8 status # DGPS Correction Type Status
|
||||
uint8 DGPS_CORRECTION_NONE = 0
|
||||
uint8 DGPS_CORRECTION_PR_PRR = 1
|
||||
|
||||
uint16 reserved1 # Reserved
|
||||
|
||||
NavDGPS_SV[] sv
|
||||
@@ -1,13 +0,0 @@
|
||||
# see message NavDGPS
|
||||
|
||||
uint8 svid # Satellite ID
|
||||
|
||||
uint8 flags # Bitmask / Channel Number and Usage:
|
||||
uint8 FLAGS_CHANNEL_MASK = 15 # Bitmask for channel number, range 0..15
|
||||
# Channel numbers > 15 marked as 15
|
||||
uint8 FLAGS_DGPS = 16 # DGPS Used for this SV
|
||||
|
||||
uint16 ageC # Age of latest correction data [ms]
|
||||
float32 prc # Pseudo Range Correction [m]
|
||||
float32 prrc # Pseudo Range Rate Correction [m/s]
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
# NAV-DOP (0x01 0x04)
|
||||
# Dilution of precision
|
||||
#
|
||||
# - DOP values are dimensionless.
|
||||
# - All DOP values are scaled by a factor of 100. If the unit transmits a value
|
||||
# of e.g. 156, the DOP value is 1.56.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 4
|
||||
|
||||
uint32 iTOW # GPS Millisecond Time of Week [ms]
|
||||
|
||||
uint16 gDOP # Geometric DOP [1 / 0.01]
|
||||
uint16 pDOP # Position DOP [1 / 0.01]
|
||||
uint16 tDOP # Time DOP [1 / 0.01]
|
||||
uint16 vDOP # Vertical DOP [1 / 0.01]
|
||||
uint16 hDOP # Horizontal DOP [1 / 0.01]
|
||||
uint16 nDOP # Northing DOP [1 / 0.01]
|
||||
uint16 eDOP # Easting DOP [1 / 0.01]
|
||||
@@ -1,16 +0,0 @@
|
||||
# NAV-POSECEF (0x01 0x01)
|
||||
# Position Solution in ECEF
|
||||
#
|
||||
# See important comments concerning validity of position given in section
|
||||
# Navigation Output Filters.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 1
|
||||
|
||||
uint32 iTOW # GPS Millisecond Time of Week [ms]
|
||||
|
||||
int32 ecefX # ECEF X coordinate [cm]
|
||||
int32 ecefY # ECEF Y coordinate [cm]
|
||||
int32 ecefZ # ECEF Z coordinate [cm]
|
||||
uint32 pAcc # Position Accuracy Estimate [cm]
|
||||
@@ -1,21 +0,0 @@
|
||||
# NAV-POSLLH (0x01 0x02)
|
||||
# Geodetic Position Solution
|
||||
#
|
||||
# See important comments concerning validity of position given in section
|
||||
# Navigation Output Filters.
|
||||
# This message outputs the Geodetic position in the currently selected
|
||||
# Ellipsoid. The default is the WGS84 Ellipsoid, but can be changed with the
|
||||
# message CFG-DAT.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 2
|
||||
|
||||
uint32 iTOW # GPS Millisecond Time of Week [ms]
|
||||
|
||||
int32 lon # Longitude [deg / 1e-7]
|
||||
int32 lat # Latitude [deg / 1e-7]
|
||||
int32 height # Height above Ellipsoid [mm]
|
||||
int32 hMSL # Height above mean sea level [mm]
|
||||
uint32 hAcc # Horizontal Accuracy Estimate [mm]
|
||||
uint32 vAcc # Vertical Accuracy Estimate [mm]
|
||||
@@ -1,92 +0,0 @@
|
||||
# NAV-PVT (0x01 0x07)
|
||||
# Navigation Position Velocity Time Solution
|
||||
#
|
||||
# Note that during a leap second there may be more (or less) than 60 seconds in
|
||||
# a minute; see the description of leap seconds for details.
|
||||
#
|
||||
# This message combines Position, velocity and time solution in LLH,
|
||||
# including accuracy figures
|
||||
#
|
||||
# WARNING: For firmware version 7, this message is a different length.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 7
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
uint16 year # Year (UTC)
|
||||
uint8 month # Month, range 1..12 (UTC)
|
||||
uint8 day # Day of month, range 1..31 (UTC)
|
||||
uint8 hour # Hour of day, range 0..23 (UTC)
|
||||
uint8 min # Minute of hour, range 0..59 (UTC)
|
||||
uint8 sec # Seconds of minute, range 0..60 (UTC)
|
||||
|
||||
uint8 valid # Validity flags
|
||||
uint8 VALID_DATE = 1 # Valid UTC Date
|
||||
uint8 VALID_TIME = 2 # Valid
|
||||
uint8 VALID_FULLY_RESOLVED = 4 # UTC time of day has been fully resolved
|
||||
# (no seconds uncertainty)
|
||||
uint8 VALID_MAG = 8 # Valid Magnetic Declination
|
||||
|
||||
uint32 tAcc # time accuracy estimate [ns] (UTC)
|
||||
int32 nano # fraction of a second [ns], range -1e9 .. 1e9 (UTC)
|
||||
|
||||
uint8 fixType # GNSS fix Type, range 0..5
|
||||
uint8 FIX_TYPE_NO_FIX = 0
|
||||
uint8 FIX_TYPE_DEAD_RECKONING_ONLY = 1
|
||||
uint8 FIX_TYPE_2D = 2 # Signal from only 3 SVs,
|
||||
# constant altitude assumed
|
||||
uint8 FIX_TYPE_3D = 3
|
||||
uint8 FIX_TYPE_GNSS_DEAD_RECKONING_COMBINED = 4 # GNSS + Dead reckoning
|
||||
uint8 FIX_TYPE_TIME_ONLY = 5 # Time only fix (High precision
|
||||
# devices)
|
||||
|
||||
uint8 flags # Fix Status Flags
|
||||
uint8 FLAGS_GNSS_FIX_OK = 1 # i.e. within DOP & accuracy masks
|
||||
uint8 FLAGS_DIFF_SOLN = 2 # DGPS used
|
||||
uint8 FLAGS_PSM_MASK = 28 # Power Save Mode
|
||||
uint8 PSM_OFF = 0 # PSM is off
|
||||
uint8 PSM_ENABLED = 4 # Enabled (state before acquisition)
|
||||
uint8 PSM_ACQUIRED = 8 # Acquisition
|
||||
uint8 PSM_TRACKING = 12 # Tracking
|
||||
uint8 PSM_POWER_OPTIMIZED_TRACKING = 16 # Power Optimized Tracking
|
||||
uint8 PSM_INACTIVE = 20 # Inactive
|
||||
uint8 FLAGS_HEAD_VEH_VALID = 32 # heading of vehicle is valid
|
||||
uint8 FLAGS_CARRIER_PHASE_MASK = 192 # Carrier Phase Range Solution Status
|
||||
uint8 CARRIER_PHASE_NO_SOLUTION = 0 # no carrier phase range solution
|
||||
uint8 CARRIER_PHASE_FLOAT = 64 # carrier phase float solution (no fixed
|
||||
# integer measurements have been used to
|
||||
# calculate the solution)
|
||||
uint8 CARRIER_PHASE_FIXED = 128 # fixed solution (>=1 fixed integer
|
||||
# carrier phase range measurements have
|
||||
# been used to calculate the solution)
|
||||
|
||||
uint8 flags2 # Additional Flags
|
||||
uint8 FLAGS2_CONFIRMED_AVAILABLE = 32 # information about UTC Date and Time of
|
||||
# Day validity confirmation is available
|
||||
uint8 FLAGS2_CONFIRMED_DATE = 64 # UTC Date validity could be confirmed
|
||||
uint8 FLAGS2_CONFIRMED_TIME = 128 # UTC Time of Day could be confirmed
|
||||
|
||||
uint8 numSV # Number of SVs used in Nav Solution
|
||||
int32 lon # Longitude [deg / 1e-7]
|
||||
int32 lat # Latitude [deg / 1e-7]
|
||||
int32 height # Height above Ellipsoid [mm]
|
||||
int32 hMSL # Height above mean sea level [mm]
|
||||
uint32 hAcc # Horizontal Accuracy Estimate [mm]
|
||||
uint32 vAcc # Vertical Accuracy Estimate [mm]
|
||||
|
||||
int32 velN # NED north velocity [mm/s]
|
||||
int32 velE # NED east velocity [mm/s]
|
||||
int32 velD # NED down velocity [mm/s]
|
||||
int32 gSpeed # Ground Speed (2-D) [mm/s]
|
||||
int32 heading # Heading of motion 2-D [deg / 1e-5]
|
||||
uint32 sAcc # Speed Accuracy Estimate [mm/s]
|
||||
uint32 headAcc # Heading Accuracy Estimate (both motion & vehicle)
|
||||
# [deg / 1e-5]
|
||||
|
||||
uint16 pDOP # Position DOP [1 / 0.01]
|
||||
uint8[6] reserved1 # Reserved
|
||||
|
||||
int32 headVeh # Heading of vehicle (2-D) [deg / 1e-5]
|
||||
int16 magDec # Magnetic declination [deg / 1e-2]
|
||||
uint16 magAcc # Magnetic declination accuracy [deg / 1e-2]
|
||||
@@ -1,88 +0,0 @@
|
||||
# NAV-PVT (0x01 0x07)
|
||||
# Navigation Position Velocity Time Solution Firmware version 7
|
||||
#
|
||||
# Note that during a leap second there may be more (or less) than 60 seconds in
|
||||
# a minute; see the description of leap seconds for details.
|
||||
#
|
||||
# This message combines Position, velocity and time solution in LLH,
|
||||
# including accuracy figures
|
||||
#
|
||||
# WARNING: For firmware version 7, this message is a different length.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 7
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
uint16 year # Year (UTC)
|
||||
uint8 month # Month, range 1..12 (UTC)
|
||||
uint8 day # Day of month, range 1..31 (UTC)
|
||||
uint8 hour # Hour of day, range 0..23 (UTC)
|
||||
uint8 min # Minute of hour, range 0..59 (UTC)
|
||||
uint8 sec # Seconds of minute, range 0..60 (UTC)
|
||||
|
||||
uint8 valid # Validity flags
|
||||
uint8 VALID_DATE = 1 # Valid UTC Date
|
||||
uint8 VALID_TIME = 2 # Valid
|
||||
uint8 VALID_FULLY_RESOLVED = 4 # UTC time of day has been fully resolved
|
||||
# (no seconds uncertainty)
|
||||
uint8 VALID_MAG = 8 # Valid Magnetic Declination
|
||||
|
||||
uint32 tAcc # time accuracy estimate [ns] (UTC)
|
||||
int32 nano # fraction of a second [ns], range -1e9 .. 1e9 (UTC)
|
||||
|
||||
uint8 fixType # GNSS fix Type, range 0..5
|
||||
uint8 FIX_TYPE_NO_FIX = 0
|
||||
uint8 FIX_TYPE_DEAD_RECKONING_ONLY = 1
|
||||
uint8 FIX_TYPE_2D = 2 # Signal from only 3 SVs,
|
||||
# constant altitude assumed
|
||||
uint8 FIX_TYPE_3D = 3
|
||||
uint8 FIX_TYPE_GNSS_DEAD_RECKONING_COMBINED = 4 # GNSS + Dead reckoning
|
||||
uint8 FIX_TYPE_TIME_ONLY = 5 # Time only fix (High precision
|
||||
# devices)
|
||||
|
||||
uint8 flags # Fix Status Flags
|
||||
uint8 FLAGS_GNSS_FIX_OK = 1 # i.e. within DOP & accuracy masks
|
||||
uint8 FLAGS_DIFF_SOLN = 2 # DGPS used
|
||||
uint8 FLAGS_PSM_MASK = 28 # Power Save Mode
|
||||
uint8 PSM_OFF = 0 # PSM is off
|
||||
uint8 PSM_ENABLED = 4 # Enabled (state before acquisition)
|
||||
uint8 PSM_ACQUIRED = 8 # Acquisition
|
||||
uint8 PSM_TRACKING = 12 # Tracking
|
||||
uint8 PSM_POWER_OPTIMIZED_TRACKING = 16 # Power Optimized Tracking
|
||||
uint8 PSM_INACTIVE = 20 # Inactive
|
||||
uint8 FLAGS_HEAD_VEH_VALID = 32 # heading of vehicle is valid
|
||||
uint8 FLAGS_CARRIER_PHASE_MASK = 192 # Carrier Phase Range Solution Status
|
||||
uint8 CARRIER_PHASE_NO_SOLUTION = 0 # no carrier phase range solution
|
||||
uint8 CARRIER_PHASE_FLOAT = 64 # carrier phase float solution (no fixed
|
||||
# integer measurements have been used to
|
||||
# calculate the solution)
|
||||
uint8 CARRIER_PHASE_FIXED = 128 # fixed solution (>=1 fixed integer
|
||||
# carrier phase range measurements have
|
||||
# been used to calculate the solution)
|
||||
|
||||
uint8 flags2 # Additional Flags
|
||||
uint8 FLAGS2_CONFIRMED_AVAILABLE = 32 # information about UTC Date and Time of
|
||||
# Day validity confirmation is available
|
||||
uint8 FLAGS2_CONFIRMED_DATE = 64 # UTC Date validity could be confirmed
|
||||
uint8 FLAGS2_CONFIRMED_TIME = 128 # UTC Time of Day could be confirmed
|
||||
|
||||
uint8 numSV # Number of SVs used in Nav Solution
|
||||
int32 lon # Longitude [deg / 1e-7]
|
||||
int32 lat # Latitude [deg / 1e-7]
|
||||
int32 height # Height above Ellipsoid [mm]
|
||||
int32 hMSL # Height above mean sea level [mm]
|
||||
uint32 hAcc # Horizontal Accuracy Estimate [mm]
|
||||
uint32 vAcc # Vertical Accuracy Estimate [mm]
|
||||
|
||||
int32 velN # NED north velocity [mm/s]
|
||||
int32 velE # NED east velocity [mm/s]
|
||||
int32 velD # NED down velocity [mm/s]
|
||||
int32 gSpeed # Ground Speed (2-D) [mm/s]
|
||||
int32 heading # Heading of motion 2-D [deg / 1e-5]
|
||||
uint32 sAcc # Speed Accuracy Estimate [mm/s]
|
||||
uint32 headAcc # Heading Accuracy Estimate (both motion & vehicle)
|
||||
# [deg / 1e-5]
|
||||
|
||||
uint16 pDOP # Position DOP [1 / 0.01]
|
||||
uint8[6] reserved1 # Reserved
|
||||
@@ -1,85 +0,0 @@
|
||||
# NAV-RELPOSNED (0x01 0x3C)
|
||||
# Relative Positioning Information in NED frame
|
||||
#
|
||||
# The NED frame is defined as the local topological system at the reference
|
||||
# station. The relative position vector components in this message, along with
|
||||
# their associated accuracies, are given in that local topological system
|
||||
# This message contains the relative position vector from the Reference Station
|
||||
# to the Rover, including accuracy figures, in the local topological system
|
||||
# defined at the reference station
|
||||
#
|
||||
# Supported on:
|
||||
# - u-blox 8 / u-blox M8 from protocol version 20 up to version 23.01 (only
|
||||
# with High Precision GNSS products)
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 60
|
||||
|
||||
uint8 version # Message version (0x00 for this version)
|
||||
uint8 reserved0 # Reserved
|
||||
uint16 refStationId # Reference Station ID. Must be in the range
|
||||
# 0..4095
|
||||
uint32 iTow # GPS time of week of the navigation epoch
|
||||
# [ms]
|
||||
|
||||
int32 relPosN # North component of relative position vector
|
||||
# [cm]
|
||||
int32 relPosE # East component of relative position vector
|
||||
# [cm]
|
||||
int32 relPosD # Down component of relative position vector
|
||||
# [cm]
|
||||
|
||||
int8 relPosHPN # High-precision North component of relative
|
||||
# position vector. [0.1 mm]
|
||||
# Must be in the range -99 to +99.
|
||||
# The full North component of the relative
|
||||
# position vector, in units of cm, is given by
|
||||
# relPosN + (relPosHPN * 1e-2)
|
||||
int8 relPosHPE # High-precision East component of relative
|
||||
# position vector. [0.1 mm]
|
||||
# Must be in the range -99 to +99.
|
||||
# The full East component of the relative
|
||||
# position vector, in units of cm, is given by
|
||||
# relPosE + (relPosHPE * 1e-2)
|
||||
int8 relPosHPD # High-precision Down component of relative
|
||||
# position vector. [0.1 mm]
|
||||
# Must be in the range -99 to +99.
|
||||
# The full Down component of the relative
|
||||
# position vector, in units of cm, is given by
|
||||
# relPosD + (relPosHPD * 1e-2)
|
||||
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
uint32 accN # Accuracy of relative position North
|
||||
# component [0.1 mm]
|
||||
uint32 accE # Accuracy of relative position East component
|
||||
# [0.1 mm]
|
||||
uint32 accD # Accuracy of relative position Down component
|
||||
# [0.1 mm]
|
||||
|
||||
uint32 flags
|
||||
uint32 FLAGS_GNSS_FIX_OK = 1 # A valid fix (i.e within DOP & accuracy
|
||||
# masks)
|
||||
uint32 FLAGS_DIFF_SOLN = 2 # Set if differential corrections were applied
|
||||
uint32 FLAGS_REL_POS_VALID = 4 # Set if relative position components and
|
||||
# accuracies are valid
|
||||
uint32 FLAGS_CARR_SOLN_MASK = 24 # Carrier phase range solution status:
|
||||
uint32 FLAGS_CARR_SOLN_NONE = 0 # No carrier phase range solution
|
||||
uint32 FLAGS_CARR_SOLN_FLOAT = 8 # Float solution. No fixed integer carrier
|
||||
# phase measurements have been used to
|
||||
# calculate the solution
|
||||
uint32 FLAGS_CARR_SOLN_FIXED = 16 # Fixed solution. One or more fixed
|
||||
# integer carrier phase range measurements
|
||||
# have been used to calculate the solution
|
||||
uint32 FLAGS_IS_MOVING = 32 # if the receiver is operating in moving
|
||||
# baseline mode (not supported in protocol
|
||||
# versions less than 20.3)
|
||||
uint32 FLAGS_REF_POS_MISS = 64 # Set if extrapolated reference position was
|
||||
# used to compute moving baseline solution
|
||||
# this epoch (not supported in protocol
|
||||
# versions less than 20.3)
|
||||
uint32 FLAGS_REF_OBS_MISS = 128 # Set if extrapolated reference observations
|
||||
# were used to compute moving baseline
|
||||
# solution this epoch (not supported in
|
||||
# protocol versions less than 20.3)
|
||||
@@ -1,18 +0,0 @@
|
||||
# NAV-SAT (0x01 0x35)
|
||||
# Satellite Information
|
||||
#
|
||||
# This message displays information about SVs which are either known to be
|
||||
# visible or currently tracked by the receiver.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 53
|
||||
|
||||
uint32 iTOW # GPS time of week of the navigation epoch. [ms]
|
||||
uint8 version # Message version (1 for this version)
|
||||
uint8 numSvs # Number of satellites
|
||||
uint8[2] reserved0 # Reserved
|
||||
|
||||
# start of repeated block (numSvs times)
|
||||
NavSAT_SV[] sv
|
||||
# end of repeated block
|
||||
@@ -1,80 +0,0 @@
|
||||
# see NAV-SAT message
|
||||
#
|
||||
|
||||
uint8 gnssId # GNSS identifier
|
||||
uint8 svId # Satellite identifier
|
||||
|
||||
uint8 cno # Carrier to noise ratio (signal strength) ]dBHz
|
||||
int8 elev # Elevation (range: +/-90), unknown if out of range [deg]
|
||||
int16 azim # Azimuth (range 0-360), unknown if elevation is out of range
|
||||
# [deg]
|
||||
int16 prRes # Pseudo range residual [0.1 m]
|
||||
|
||||
uint32 flags # Bitmask
|
||||
uint32 FLAGS_QUALITY_IND_MASK = 7 # Signal quality indicator:
|
||||
uint8 QUALITY_IND_NO_SIGNAL = 0 # no signal
|
||||
uint8 QUALITY_IND_SEARCHING_SIGNAL = 1 # searching signal
|
||||
uint8 QUALITY_IND_SIGNAL_ACQUIRED = 2 # signal acquired
|
||||
uint8 QUALITY_IND_SIGNAL_DETECTED_BUT_UNUSABLE = 3 # signal detected but
|
||||
# unusable
|
||||
uint8 QUALITY_IND_CODE_LOCKED_AND_TIME_SYNC = 4 # code locked and time
|
||||
# synchronized
|
||||
uint8 QUALITY_IND_CODE_AND_CARR_LOCK_AND_TIME_SYNC1 = 5 # code and carrier
|
||||
# locked and time
|
||||
# synchronized,
|
||||
# quality = 1
|
||||
uint8 QUALITY_IND_CODE_AND_CARR_LOCK_AND_TIME_SYNC2 = 6 # code and carrier
|
||||
# locked and time
|
||||
# synchronized,
|
||||
# quality = 2
|
||||
uint8 QUALITY_IND_CODE_AND_CARR_LOCK_AND_TIME_SYNC3 = 7 # code and carrier
|
||||
# locked and time
|
||||
# synchronized,
|
||||
# quality = 3
|
||||
# Note: Since IMES signals are not time synchronized, a channel tracking an IMES
|
||||
# signal can never reach a quality indicator value of higher than 3.
|
||||
uint32 FLAGS_SV_USED = 8 # whether SV is currently being
|
||||
# used for navigation
|
||||
uint32 FLAGS_HEALTH_MASK = 48 # SV health flag:
|
||||
uint32 HEALTH_UNKNOWN = 0 # unknown
|
||||
uint32 HEALTH_HEALTHY = 1 # healthy
|
||||
uint32 HEALTH_UNHEALTHY = 2 # unhealthy
|
||||
uint32 FLAGS_DIFF_CORR = 64 # whether differential correction
|
||||
# data is available for this SV
|
||||
uint32 FLAGS_SMOOTHED = 128 # whether carrier smoothed
|
||||
# pseudorange used
|
||||
uint32 FLAGS_ORBIT_SOURCE_MASK = 1792 # Orbit source:
|
||||
uint32 ORBIT_SOURCE_UNAVAILABLE = 0 # no orbit information is
|
||||
# available for this SV
|
||||
uint32 ORBIT_SOURCE_EPH = 256 # ephemeris is used
|
||||
uint32 ORBIT_SOURCE_ALM = 512 # almanac is used
|
||||
uint32 ORBIT_SOURCE_ASSIST_OFFLINE = 768 # AssistNow Offline orbit is
|
||||
# used
|
||||
uint32 ORBIT_SOURCE_ASSIST_AUTONOMOUS = 1024 # AssistNow Autonomous orbit is
|
||||
# used
|
||||
uint32 ORBIT_SOURCE_OTHER1 = 1280 # other orbit information is
|
||||
# used
|
||||
uint32 ORBIT_SOURCE_OTHER2 = 1536 # other orbit information is
|
||||
# used
|
||||
uint32 ORBIT_SOURCE_OTHER3 = 1792 # other orbit information is
|
||||
# used
|
||||
uint32 FLAGS_EPH_AVAIL = 2048 # whether ephemeris is available
|
||||
# for this SV
|
||||
uint32 FLAGS_ALM_AVAIL = 4096 # whether almanac is available for
|
||||
# this SV
|
||||
uint32 FLAGS_ANO_AVAIL = 8192 # whether AssistNow Offline data
|
||||
# is available for this SV
|
||||
uint32 FLAGS_AOP_AVAIL = 16384 # whether AssistNow Autonomous
|
||||
# data is available for this SV
|
||||
uint32 FLAGS_SBAS_CORR_USED = 65536 # whether SBAS corrections have
|
||||
# been used for this SV
|
||||
uint32 FLAGS_RTCM_CORR_USED = 131072 # whether RTCM corrections have
|
||||
# been used for this SV
|
||||
uint32 FLAGS_PR_CORR_USED = 1048576 # whether Pseudorange corrections
|
||||
# have been used for this SV
|
||||
uint32 FLAGS_CR_CORR_USED = 2097152 # whether Carrier range
|
||||
# corrections have been used for
|
||||
# this SV
|
||||
uint32 FLAGS_DO_CORR_USED = 4194304 # whether Range rate (Doppler)
|
||||
# corrections have been used for
|
||||
# this SV
|
||||
@@ -1,37 +0,0 @@
|
||||
# NAV-SBAS (0x01 0x32)
|
||||
# SBAS Status Data
|
||||
#
|
||||
# This message outputs the status of the SBAS sub system
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 50
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
uint8 geo # PRN Number of the GEO where correction and integrity
|
||||
# data is used from
|
||||
|
||||
uint8 mode # SBAS Mode
|
||||
uint8 MODE_DISABLED = 0
|
||||
uint8 MODE_ENABLED_INTEGRITY = 1
|
||||
uint8 MODE_ENABLED_TESTMODE = 3
|
||||
|
||||
int8 sys # SBAS System (WAAS/EGNOS/...)
|
||||
int8 SYS_UNKNOWN = -1
|
||||
int8 SYS_WAAS = 0
|
||||
int8 SYS_EGNOS = 1
|
||||
int8 SYS_MSAS = 2
|
||||
int8 SYS_GAGAN = 3
|
||||
int8 SYS_GPS = 16
|
||||
|
||||
uint8 service # SBAS Services available
|
||||
uint8 SERVICE_RANGING = 1
|
||||
uint8 SERVICE_CORRECTIONS = 2
|
||||
uint8 SERVICE_INTEGRITY = 4
|
||||
uint8 SERVICE_TESTMODE = 8
|
||||
|
||||
uint8 cnt # Number of SV data following
|
||||
uint8[3] reserved0 # Reserved
|
||||
|
||||
NavSBAS_SV[] sv
|
||||
@@ -1,12 +0,0 @@
|
||||
# see message NavSBAS
|
||||
#
|
||||
|
||||
uint8 svid # SV Id
|
||||
uint8 flags # Flags for this SV
|
||||
uint8 udre # Monitoring status
|
||||
uint8 svSys # System (WAAS/EGNOS/...), same as SYS
|
||||
uint8 svService # Services available, same as SERVICE
|
||||
uint8 reserved1 # Reserved
|
||||
int16 prc # Pseudo Range correction in [cm]
|
||||
uint16 reserved2 # Reserved
|
||||
int16 ic # Ionosphere correction in [cm]
|
||||
@@ -1,43 +0,0 @@
|
||||
# NAV-SOL (0x01 0x06)
|
||||
# Navigation Solution Information
|
||||
#
|
||||
# This message combines Position, velocity and time solution in ECEF, including
|
||||
# accuracy figures
|
||||
# This message has only been retained for backwards compatibility; users are
|
||||
# recommended to use the UBX-NAV-PVT message in preference.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 6
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
int32 fTOW # Fractional Nanoseconds remainder of rounded
|
||||
# ms above, range -500000 .. 500000 [ns]
|
||||
int16 week # GPS week (GPS time)
|
||||
|
||||
uint8 gpsFix # GPSfix Type, range 0..5
|
||||
uint8 GPS_NO_FIX = 0
|
||||
uint8 GPS_DEAD_RECKONING_ONLY = 1
|
||||
uint8 GPS_2D_FIX = 2
|
||||
uint8 GPS_3D_FIX = 3
|
||||
uint8 GPS_GPS_DEAD_RECKONING_COMBINED = 4
|
||||
uint8 GPS_TIME_ONLY_FIX = 5
|
||||
|
||||
uint8 flags # Fix Status Flags
|
||||
uint8 FLAGS_GPS_FIX_OK = 1 # Fix within limits i.e. within DOP & ACC Masks
|
||||
uint8 FLAGS_DIFF_SOLN = 2 # DGPS used
|
||||
uint8 FLAGS_WKNSET = 4 # Week Number valid
|
||||
uint8 FLAGS_TOWSET = 8 # Time of Week valid
|
||||
|
||||
int32 ecefX # ECEF X coordinate [cm]
|
||||
int32 ecefY # ECEF Y coordinate [cm]
|
||||
int32 ecefZ # ECEF Z coordinate [cm]
|
||||
uint32 pAcc # 3D Position Accuracy Estimate [cm]
|
||||
int32 ecefVX # ECEF X velocity [cm/s]
|
||||
int32 ecefVY # ECEF Y velocity [cm/s]
|
||||
int32 ecefVZ # ECEF Z velocity [cm/s]
|
||||
uint32 sAcc # Speed Accuracy Estimate [cm/s]
|
||||
uint16 pDOP # Position DOP [1 / 0.01]
|
||||
uint8 reserved1 # Reserved
|
||||
uint8 numSV # Number of SVs used in Nav Solution
|
||||
uint32 reserved2 # Reserved
|
||||
@@ -1,65 +0,0 @@
|
||||
# NAV-STATUS (0x01 0x03)
|
||||
# Receiver Navigation Status
|
||||
#
|
||||
# See important comments concerning validity of position and velocity given in
|
||||
# section Navigation Output Filters.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 3
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
uint8 gpsFix # GPSfix Type, this value does not qualify a fix as
|
||||
# valid and within the limits. See note on flag gpsFixOk
|
||||
# below
|
||||
uint8 GPS_NO_FIX = 0
|
||||
uint8 GPS_DEAD_RECKONING_ONLY = 1
|
||||
uint8 GPS_2D_FIX = 2
|
||||
uint8 GPS_3D_FIX = 3
|
||||
uint8 GPS_GPS_DEAD_RECKONING_COMBINED = 4
|
||||
uint8 GPS_TIME_ONLY_FIX = 5
|
||||
|
||||
uint8 flags # Navigation Status Flags
|
||||
uint8 FLAGS_GPS_FIX_OK = 1 # position & velocity valid & within DOP & ACC
|
||||
# Masks
|
||||
uint8 FLAGS_DIFF_SOLN = 2 # Differential corrections were applied
|
||||
uint8 FLAGS_WKNSET = 4 # Week Number valid
|
||||
uint8 FLAGS_TOWSET = 8 # Time of Week valid
|
||||
|
||||
uint8 fixStat # Fix Status Information
|
||||
uint8 FIX_STAT_DIFF_CORR_MASK = 1 # 1 = differential corrections available
|
||||
# map matching status:
|
||||
uint8 FIX_STAT_MAP_MATCHING_MASK = 192
|
||||
uint8 MAP_MATCHING_NONE = 0 # none
|
||||
uint8 MAP_MATCHING_VALID = 64 # valid but not used, i.e. map matching data
|
||||
# was received, but was too old
|
||||
uint8 MAP_MATCHING_USED = 128 # valid and used, map matching data was applied
|
||||
uint8 MAP_MATCHING_DR = 192 # valid and used, map matching data was
|
||||
# applied. In case of sensor unavailability map
|
||||
# matching data enables dead reckoning.
|
||||
# This requires map matched latitude/longitude
|
||||
# or heading data.
|
||||
|
||||
uint8 flags2 # further information about navigation output
|
||||
# power safe mode state (Only for FW version >= 7.01; undefined otherwise)
|
||||
uint8 FLAGS2_PSM_STATE_MASK = 3
|
||||
uint8 PSM_STATE_ACQUISITION = 0 # ACQUISITION
|
||||
# [or when psm disabled]
|
||||
uint8 PSM_STATE_TRACKING = 1 # TRACKING
|
||||
uint8 PSM_STATE_POWER_OPTIMIZED_TRACKING = 2 # POWER OPTIMIZED TRACKING
|
||||
uint8 PSM_STATE_INACTIVE = 3 # INACTIVE
|
||||
# Note that the spoofing state value only reflects the detector state for the
|
||||
# current navigation epoch. As spoofing can be detected most easily at the
|
||||
# transition from real signal to spoofing signal, this is also where the
|
||||
# detector is triggered the most. I.e. a value of 1 - No spoofing indicated does
|
||||
# not mean that the receiver is not spoofed, it #simply states that the detector
|
||||
# was not triggered in this epoch.
|
||||
uint8 FLAGS2_SPOOF_DET_STATE_MASK = 24
|
||||
uint8 SPOOF_DET_STATE_UNKNOWN = 0 # Unknown or deactivated
|
||||
uint8 SPOOF_DET_STATE_NONE = 8 # No spoofing indicated
|
||||
uint8 SPOOF_DET_STATE_SPOOFING = 16 # Spoofing indicated
|
||||
uint8 SPOOF_DET_STATE_MULTIPLE = 24 # Multiple spoofing indication
|
||||
|
||||
uint32 ttff # Time to first fix (millisecond time tag) [ms]
|
||||
uint32 msss # Milliseconds since Startup / Reset [ms]
|
||||
@@ -1,51 +0,0 @@
|
||||
# NAV-SVIN (0x01 0x3B)
|
||||
# Survey-in data
|
||||
#
|
||||
# This message contains information about survey-in parameters.
|
||||
# Supported on:
|
||||
# - u-blox 8 / u-blox M8 with protocol version 20 (only with High Precision
|
||||
# GNSS products)
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 59
|
||||
|
||||
uint8 version # Message version (0x00 for this version)
|
||||
uint8[3] reserved0 # Reserved
|
||||
|
||||
uint32 iTOW # GPS time of week of the navigation epoch [ms]
|
||||
|
||||
uint32 dur # Passed survey-in observation time [s]
|
||||
|
||||
int32 meanX # Current survey-in mean position ECEF X coordinate [cm]
|
||||
int32 meanY # Current survey-in mean position ECEF Y coordinate [cm]
|
||||
int32 meanZ # Current survey-in mean position ECEF Z coordinate [cm]
|
||||
|
||||
int8 meanXHP # Current high-precision survey-in mean position
|
||||
# ECEF X coordinate. 0.1_mm
|
||||
# Must be in the range -99..+99.
|
||||
# The current survey-in mean position ECEF X
|
||||
# coordinate, in units of cm, is given by
|
||||
# meanX + (0.01 * meanXHP)
|
||||
int8 meanYHP # Current high-precision survey-in mean position
|
||||
# ECEF Y coordinate. [0.1 mm]
|
||||
# Must be in the range -99..+99.
|
||||
# The current survey-in mean position ECEF Y
|
||||
# coordinate, in units of cm, is given by
|
||||
# meanY + (0.01 * meanYHP)
|
||||
int8 meanZHP # Current high-precision survey-in mean position
|
||||
# ECEF Z coordinate. [0.1 mm]
|
||||
# Must be in the range -99..+99.
|
||||
# The current survey-in mean position ECEF Z
|
||||
# coordinate, in units of cm, is given by
|
||||
# meanZ + (0.01 * meanZHP)
|
||||
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
uint32 meanAcc # Current survey-in mean position accuracy [0.1 mm]
|
||||
uint32 obs # Number of position observations used during survey-in
|
||||
uint8 valid # Survey-in position validity flag, 1 = valid
|
||||
# otherwise 0
|
||||
uint8 active # Survey-in in progress flag, 1 = in-progress
|
||||
# otherwise 0
|
||||
|
||||
uint8[2] reserved3 # Reserved
|
||||
@@ -1,22 +0,0 @@
|
||||
# NAV-SVINFO (0x01 0x30)
|
||||
# Space Vehicle Information
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 48
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
uint8 numCh # Number of channels
|
||||
|
||||
uint8 globalFlags # Bitmask
|
||||
# Chip Hardware generation flags
|
||||
uint8 CHIPGEN_ANTARIS = 0 # Antaris, Antaris 4
|
||||
uint8 CHIPGEN_UBLOX5 = 1 # u-blox 5
|
||||
uint8 CHIPGEN_UBLOX6 = 2 # u-blox 6
|
||||
uint8 CHIPGEN_UBLOX7 = 3 # u-blox 7
|
||||
uint8 CHIPGEN_UBLOX8 = 4 # u-blox 8 / u-blox M8
|
||||
|
||||
uint16 reserved2 # Reserved
|
||||
|
||||
NavSVINFO_SV[] sv
|
||||
@@ -1,41 +0,0 @@
|
||||
# see message NavSVINFO
|
||||
#
|
||||
|
||||
uint8 chn # Channel number, 255 for SVs not assigned to a channel
|
||||
uint8 svid # Satellite ID
|
||||
|
||||
uint8 flags # Bitmask
|
||||
uint8 FLAGS_SV_USED = 1 # SV is used for navigation
|
||||
uint8 FLAGS_DIFF_CORR = 2 # Differential correction data
|
||||
# is available for this SV
|
||||
uint8 FLAGS_ORBIT_AVAIL = 4 # Orbit information is available for
|
||||
# this SV (Ephemeris or Almanach)
|
||||
uint8 FLAGS_ORBIT_EPH = 8 # Orbit information is Ephemeris
|
||||
uint8 FLAGS_UNHEALTHY = 16 # SV is unhealthy / shall not be
|
||||
# used
|
||||
uint8 FLAGS_ORBIT_ALM = 32 # Orbit information is Almanac Plus
|
||||
uint8 FLAGS_ORBIT_AOP = 64 # Orbit information is AssistNow
|
||||
# Autonomous
|
||||
uint8 FLAGS_SMOOTHED = 128 # Carrier smoothed pseudorange used
|
||||
|
||||
uint8 quality # Bitfield
|
||||
# qualityInd: Signal Quality indicator (range 0..7). The following list shows
|
||||
# the meaning of the different QI values:
|
||||
# Note: Since IMES signals are not time synchronized, a channel tracking an IMES
|
||||
# signal can never reach a quality indicator value of higher than 3.
|
||||
uint8 QUALITY_IDLE = 0 # This channel is idle
|
||||
uint8 QUALITY_SEARCHING = 1 # Channel is searching
|
||||
uint8 QUALITY_ACQUIRED = 2 # Signal acquired
|
||||
uint8 QUALITY_DETECTED = 3 # Signal detected but unusable
|
||||
uint8 QUALITY_CODE_LOCK = 4 # Code Lock on Signal
|
||||
uint8 QUALITY_CODE_AND_CARRIER_LOCKED1 = 5 # Code and Carrier locked
|
||||
# and time synchronized
|
||||
uint8 QUALITY_CODE_AND_CARRIER_LOCKED2 = 6 # Code and Carrier locked
|
||||
# and time synchronized
|
||||
uint8 QUALITY_CODE_AND_CARRIER_LOCKED3 = 7 # Code and Carrier locked
|
||||
# and time synchronized
|
||||
|
||||
uint8 cno # Carrier to Noise Ratio (Signal Strength) [dBHz]
|
||||
int8 elev # Elevation in integer degrees [deg]
|
||||
int16 azim # Azimuth in integer degrees [deg]
|
||||
int32 prRes # Pseudo range residual in centimetres [cm]
|
||||
@@ -1,20 +0,0 @@
|
||||
# NAV-TIMEGPS (0x01 0x20)
|
||||
# GPS Time Solution
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 32
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
int32 fTOW # Fractional Nanoseconds remainder of rounded
|
||||
# ms above, range -500000 .. 500000 [ns]
|
||||
int16 week # GPS week (GPS time)
|
||||
|
||||
int8 leapS # Leap Seconds (GPS-UTC) [s]
|
||||
|
||||
uint8 valid # Validity Flags
|
||||
uint8 VALID_TOW = 1 # Valid Time of Week
|
||||
uint8 VALID_WEEK = 2 # Valid Week Number
|
||||
uint8 VALID_LEAP_S = 4 # Valid Leap Seconds
|
||||
|
||||
uint32 tAcc # Time Accuracy Estimate [ns]
|
||||
@@ -1,35 +0,0 @@
|
||||
# NAV-TIMEUTC (0x01 0x21)
|
||||
# UTC Time Solution
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 33
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
uint32 tAcc # Time Accuracy Estimate [ns]
|
||||
int32 nano # Fraction of second, range -1e9 .. 1e9 (UTC) [ns]
|
||||
uint16 year # Year, range 1999..2099 (UTC) [y]
|
||||
uint8 month # Month, range 1..12 (UTC) [month]
|
||||
uint8 day # Day of Month, range 1..31 (UTC) [d]
|
||||
uint8 hour # Hour of Day, range 0..23 (UTC) [h]
|
||||
uint8 min # Minute of Hour, range 0..59 (UTC) [min]
|
||||
uint8 sec # Seconds of Minute, range 0..60 (UTC) [s] (60 for
|
||||
# leap second)
|
||||
|
||||
uint8 valid # Validity Flags
|
||||
uint8 VALID_TOW = 1 # Valid Time of Week
|
||||
uint8 VALID_WKN = 2 # Valid Week Number
|
||||
uint8 VALID_UTC = 4 # Valid Leap Seconds, i.e. Leap Seconds already known
|
||||
uint8 VALID_UTC_STANDARD_MASK = 240 # UTC standard Identifier Bit mask:
|
||||
uint8 UTC_STANDARD_NOT_AVAILABLE = 0 # Information not available
|
||||
uint8 UTC_STANDARD_CRL = 16 # Communications Research Labratory
|
||||
uint8 UTC_STANDARD_NIST = 32 # National Institute of Standards and
|
||||
# Technology (NIST)
|
||||
uint8 UTC_STANDARD_USNO = 48 # U.S. Naval Observatory (USNO)
|
||||
uint8 UTC_STANDARD_BIPM = 64 # International Bureau of Weights and
|
||||
# Measures (BIPM)
|
||||
uint8 UTC_STANDARD_EL = 80 # European Laboratory (tbd)
|
||||
uint8 UTC_STANDARD_SU = 96 # Former Soviet Union (SU)
|
||||
uint8 UTC_STANDARD_NTSC = 112 # National Time Service Center, China
|
||||
uint8 UTC_STANDARD_UNKNOWN = 240
|
||||
@@ -1,16 +0,0 @@
|
||||
# NAV-VELECEF (0x01 0x11)
|
||||
# Velocity Solution in ECEF
|
||||
#
|
||||
# See important comments concerning validity of velocity given in section
|
||||
# Navigation Output Filters.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 17
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
int32 ecefVX # ECEF X velocity [cm/s]
|
||||
int32 ecefVY # ECEF Y velocity [cm/s]
|
||||
int32 ecefVZ # ECEF Z velocity [cm/s]
|
||||
uint32 sAcc # Speed Accuracy Estimate [cm/s]
|
||||
@@ -1,20 +0,0 @@
|
||||
# NAV-VELNED (0x01 0x12)
|
||||
# Velocity Solution in NED
|
||||
#
|
||||
# See important comments concerning validity of velocity given in section
|
||||
# Navigation Output Filters.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 1
|
||||
uint8 MESSAGE_ID = 18
|
||||
|
||||
uint32 iTOW # GPS Millisecond time of week [ms]
|
||||
|
||||
int32 velN # NED north velocity [cm/s]
|
||||
int32 velE # NED east velocity [cm/s]
|
||||
int32 velD # NED down velocity [cm/s]
|
||||
uint32 speed # Speed (3-D) [cm/s]
|
||||
uint32 gSpeed # Ground Speed (2-D) [cm/s]
|
||||
int32 heading # Heading of motion 2-D [deg / 1e-5]
|
||||
uint32 sAcc # Speed Accuracy Estimate [cm/s]
|
||||
uint32 cAcc # Course / Heading Accuracy Estimate [deg / 1e-5]
|
||||
@@ -1,27 +0,0 @@
|
||||
# RXM-ALM (0x02 0x30)
|
||||
# GPS Aiding Almanach Input/Output Message
|
||||
#
|
||||
# This message is provided considered obsolete, please use AID-ALM instead!
|
||||
# - If the WEEK Value is 0, DWRD0 to DWRD7 are not sent as the almanach is not
|
||||
# available for the given SV.
|
||||
# - DWORD0 to DWORD7 contain the 8 words following the Hand-Over Word ( HOW )
|
||||
# from the GPS navigation message, either pages 1 to 24 of sub-frame 5 or
|
||||
# pages 2 to 10 of subframe 4. See IS-GPS-200 for a full description of the
|
||||
# contents of the Almanac pages.
|
||||
# - In DWORD0 to DWORD7, the parity bits have been removed, and the 24 bits of
|
||||
# data are located in Bits 0 to 23. Bits 24 to 31 shall be ignored.
|
||||
# - Example: Parameter e (Eccentricity) from Almanach Subframe 4/5, Word 3,
|
||||
# Bits 69-84 within the subframe can be found in DWRD0, Bits 15-0 whereas
|
||||
# Bit 0 is the LSB.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 48
|
||||
|
||||
uint32 svid # SV ID for which this Almanach Data is
|
||||
# (Valid Range: 1 .. 32 or 51, 56, 63).
|
||||
uint32 week # Issue Date of Almanach (GPS week number)
|
||||
|
||||
# Start of optional block
|
||||
uint32[] dwrd # Almanach Words
|
||||
# End of optional block
|
||||
@@ -1,27 +0,0 @@
|
||||
# RXM-EPH (0x02 0x31)
|
||||
# GPS Aiding Ephemeris Input/Output Message
|
||||
#
|
||||
# This message is provided considered obsolete, please use AID-EPH instead!
|
||||
# - SF1D0 to SF3D7 is only sent if ephemeris is available for this SV. If not,
|
||||
# the payload may be reduced to 8 Bytes, or all bytes are set to zero,
|
||||
# indicating that this SV Number does not have valid ephemeris for the moment.
|
||||
# - SF1D0 to SF3D7 contain the 24 words following the Hand-Over Word ( HOW )
|
||||
# from the GPS navigation message, subframes 1 to 3. See IS-GPS-200 for a
|
||||
# full description of the contents of the Subframes.
|
||||
# - In SF1D0 to SF3D7, the parity bits have been removed, and the 24 bits of
|
||||
# data are located in Bits 0 to 23. Bits 24 to 31 shall be ignored.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 49
|
||||
|
||||
uint32 svid # SV ID for which this ephemeris data is (Valid Range: 1 .. 32).
|
||||
uint32 how # Hand-Over Word of first Subframe. This is
|
||||
# required if data is sent to the receiver.
|
||||
# 0 indicates that no Ephemeris Data is following.
|
||||
|
||||
# Start of optional block
|
||||
uint32[] sf1d # Subframe 1 Words 3..10 (SF1D0..SF1D7)
|
||||
uint32[] sf2d # Subframe 2 Words 3..10 (SF2D0..SF2D7)
|
||||
uint32[] sf3d # Subframe 3 Words 3..10 (SF3D0..SF3D7)
|
||||
# End of optional block
|
||||
@@ -1,21 +0,0 @@
|
||||
# RXM-RAW (0x02 0x10)
|
||||
# Raw Measurement Data
|
||||
#
|
||||
# Supported up to ublox 7 firmware. See RxmRAWX for ublox 8
|
||||
# This message contains all information needed to be able to generate a RINEX
|
||||
# observation file.
|
||||
# This message outputs pseudorange, doppler and carrier phase measurements for
|
||||
# GPS satellites once signals have been synchronised. No other GNSS types are
|
||||
# currently supported.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 16
|
||||
|
||||
int32 rcvTOW # Measurement time of week in receiver local time [s]
|
||||
int16 week # Measurement week number in receiver local time [weeks]
|
||||
|
||||
uint8 numSV # # of satellites following
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
RxmRAW_SV[] sv # numSV times
|
||||
@@ -1,39 +0,0 @@
|
||||
# RXM-RAWX (0x02 0x15)
|
||||
# Multi-GNSS Raw Measurement Data
|
||||
#
|
||||
# This message contains the information needed to be able to generate a RINEX 3
|
||||
# multi-GNSS observation file.
|
||||
# This message contains pseudorange, Doppler, carrier phase, phase lock and
|
||||
# signal quality information for GNSS satellites once signals have been
|
||||
# synchronized. This message supports all active GNSS.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 21
|
||||
|
||||
float64 rcvTOW # Measurement time of week in receiver local time [s]
|
||||
# approximately aligned to the GPS time system. The
|
||||
# receiver local time of week number and leap second
|
||||
# information can be used to translate the time to other
|
||||
# time systems. More information about the difference in
|
||||
# time systems can be found in RINEX 3 documentation.
|
||||
# For a receiver operating in GLONASS only mode, UTC
|
||||
# time can be determined by subtracting the leapS field
|
||||
# from GPS time regardless of whether the GPS leap
|
||||
# seconds are valid.
|
||||
uint16 week # GPS week number in receiver local time. [weeks]
|
||||
int8 leapS # GPS leap seconds (GPS-UTC). [s]
|
||||
# This field represents the receiver's best knowledge of
|
||||
# the leap seconds offset. A flag is given in the
|
||||
# recStat bitfield to indicate if the leap seconds
|
||||
# are known.
|
||||
uint8 numMeas # # of measurements to follow
|
||||
uint8 recStat # Receiver tracking status bitfield
|
||||
uint8 REC_STAT_LEAP_SEC = 1 # Leap seconds have been determined
|
||||
uint8 REC_STAT_CLK_RESET = 2 # Clock reset applied. Typically the receiver
|
||||
# clock is changed in increments of integer
|
||||
# milliseconds.
|
||||
uint8 version # Message version (0x01 for this version).
|
||||
uint8[2] reserved1 # Reserved
|
||||
|
||||
RxmRAWX_Meas[] meas
|
||||
@@ -1,42 +0,0 @@
|
||||
# see message RxmRAWX
|
||||
#
|
||||
|
||||
float64 prMes # Pseudorange measurement [m]. GLONASS inter frequency
|
||||
# channel delays are compensated with an internal
|
||||
# calibration table.
|
||||
float64 cpMes # Carrier phase measurement [L1 cycles]. The carrier
|
||||
# phase initial ambiguity is initialized using an
|
||||
# approximate value to make the magnitude of
|
||||
# the phase close to the pseudorange
|
||||
# measurement. Clock resets are applied to both
|
||||
# phase and code measurements in accordance
|
||||
# with the RINEX specification.
|
||||
float32 doMes # Doppler measurement [Hz] (positive sign for
|
||||
# approaching satellites)
|
||||
uint8 gnssId # GNSS identifier (see CfgGNSS for constants)
|
||||
|
||||
uint8 svId # Satellite identifier (see Satellite Numbering)
|
||||
|
||||
uint8 reserved0 # Reserved
|
||||
|
||||
uint8 freqId # Only used for GLONASS: This is the frequency
|
||||
# slot + 7 (range from 0 to 13)
|
||||
uint16 locktime # Carrier phase locktime counter [ms]
|
||||
# (maximum 64500 ms)
|
||||
int8 cno # Carrier-to-noise density ratio (signal strength)
|
||||
# [dB-Hz]
|
||||
uint8 prStdev # Estimated pseudorange measurement standard
|
||||
# deviation [m / 0.01*2^n]
|
||||
uint8 cpStdev # Estimated carrier phase measurement standard
|
||||
# deviation (note a raw value of 0x0F indicates the
|
||||
# value is invalid) [cycles / 0.004]
|
||||
uint8 doStdev # Estimated Doppler measurement standard deviation
|
||||
# [Hz / 0.002*2^n]
|
||||
|
||||
uint8 trkStat # Tracking status bitfield
|
||||
uint8 TRK_STAT_PR_VALID = 1 # Pseudorange valid
|
||||
uint8 TRK_STAT_CP_VALID = 2 # Carrier phase valid
|
||||
uint8 TRK_STAT_HALF_CYC = 4 # Half cycle valid
|
||||
uint8 TRK_STAT_SUB_HALF_CYC = 8 # Half cycle subtracted from phase
|
||||
|
||||
uint8 reserved1 # Reserved
|
||||
@@ -1,15 +0,0 @@
|
||||
# see message RxmRAW
|
||||
#
|
||||
|
||||
float64 cpMes # Carrier phase measurement [L1 cycles]
|
||||
float64 prMes # Pseudorange measurement [m]
|
||||
float32 doMes # Doppler measurement [Hz]
|
||||
|
||||
uint8 sv # Space Vehicle Number
|
||||
int8 mesQI # Nav Measurements Quality Indicator
|
||||
# >=4 : PR+DO OK
|
||||
# >=5 : PR+DO+CP OK
|
||||
# <6 : likely loss of carrier lock in previous
|
||||
# interval
|
||||
int8 cno # Signal strength C/No. [dbHz]
|
||||
uint8 lli # Loss of lock indicator (RINEX definition)
|
||||
@@ -1,21 +0,0 @@
|
||||
# RXM-RTCM (0x02 0x32)
|
||||
# RTCM input status
|
||||
#
|
||||
# Output upon processing of an RTCM input message
|
||||
# Supported on:
|
||||
# - u-blox 8 / u-blox M8 from protocol version 20.01 up to version 23.01
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 50
|
||||
|
||||
uint8 version # Message version (0x02 for this version)
|
||||
uint8 flags # RTCM input status flags
|
||||
uint8 FLAGS_CRC_FAILED = 1 # 0 when RTCM message received and passed CRC
|
||||
# check, 1 when failed in which case refStation
|
||||
# and msgType might be corrupted and misleading
|
||||
|
||||
uint8[2] reserved0 # Reserved
|
||||
|
||||
uint16 refStation # Reference station ID
|
||||
uint16 msgType # Message type
|
||||
@@ -1,24 +0,0 @@
|
||||
# RXM-SFRB (0x02 0x11)
|
||||
# Subframe Buffer
|
||||
#
|
||||
# The content of one single subframe buffer
|
||||
# For GPS satellites, the 10 dwrd values contain the parity checked subframe
|
||||
# data for 10 Words. Each dwrd has 24 Bits with valid data (Bits 23 to 0). The
|
||||
# remaining 8 bits (31 to 24) have an undefined value. The direction within the
|
||||
# Word is that the higher order bits are received from the SV first. Example:
|
||||
# The Preamble can be found in dwrd[0], at bit position 23 down to 16. For more
|
||||
# details on the data format please refer to the ICD-GPS-200C
|
||||
# Interface document.
|
||||
# For SBAS satellites, the 250 Bit message block can be found in dwrd[0] to
|
||||
# dwrd[6] for the first 224 bits. The remaining 26 bits are in dwrd[7], whereas
|
||||
# Bits 25 and 24 are the last two data bits, and Bits 23 down to 0 are the
|
||||
# parity bits. For more information on SBAS data format, please refer to
|
||||
# RTCA/DO-229C (MOPS), Appendix A.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 17
|
||||
|
||||
uint8 chn # Channel Number
|
||||
uint8 svid # ID of Satellite transmitting Subframe
|
||||
uint32[10] dwrd # Words of Data
|
||||
@@ -1,28 +0,0 @@
|
||||
# RXM-SFRB (0x02 0x13)
|
||||
# Subframe Buffer
|
||||
#
|
||||
# This message reports a complete subframe of broadcast navigation data decoded
|
||||
# from a single signal. The number of data words reported in each message
|
||||
# depends on the nature of the signal. See the section on Broadcast Navigation
|
||||
# Data for further details.
|
||||
#
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 19
|
||||
|
||||
uint8 gnssId # GNSS identifier (see Cfg GNSS for constants)
|
||||
|
||||
uint8 svId # Satellite identifier within corresponding GNSS system
|
||||
uint8 reserved0 # Reserved
|
||||
uint8 freqId # Only used for GLONASS: This is the frequency
|
||||
# slot + 7 (range from 0 to 13)
|
||||
uint8 numWords # The number of data words contained in this message (up
|
||||
# to 10, for currently supported signals)
|
||||
uint8 chn # The tracking channel number the message was received
|
||||
# on
|
||||
uint8 version # Message version, (0x02 for this version)
|
||||
uint8 reserved1 # Reserved
|
||||
|
||||
# Start of repeated block (numWords times)
|
||||
uint32[] dwrd # The data words
|
||||
# End of repeated block
|
||||
@@ -1,18 +0,0 @@
|
||||
# RXM-SVSI (0x02 0x20)
|
||||
# SV Status Info
|
||||
#
|
||||
# Status of the receiver manager knowledge about GPS Orbit Validity
|
||||
#
|
||||
# This message has only been retained for backwards compatibility; users are
|
||||
# recommended to use the UBX-NAV-ORB message in preference.
|
||||
|
||||
uint8 CLASS_ID = 2
|
||||
uint8 MESSAGE_ID = 32
|
||||
|
||||
int32 iTOW # GPS time of week of the navigation epoch [ms]
|
||||
int16 week # GPS week number of the navigation epoch [weeks]
|
||||
|
||||
uint8 numVis # Number of visible satellites
|
||||
uint8 numSV # Number of per-SV data blocks following
|
||||
|
||||
RxmSVSI_SV[] sv
|
||||
@@ -1,22 +0,0 @@
|
||||
# see message RxmSVSI
|
||||
#
|
||||
|
||||
uint8 svid # Satellite ID
|
||||
|
||||
uint8 svFlag # Information Flags
|
||||
uint8 FLAG_URA_MASK = 15 # Figure of Merit (URA) range 0..15
|
||||
uint8 FLAG_HEALTHY = 16 # SV healthy flag
|
||||
uint8 FLAG_EPH_VAL = 32 # Ephemeris valid
|
||||
uint8 FLAG_ALM_VAL = 64 # Almanac valid
|
||||
uint8 FLAG_NOT_AVAIL = 128 # SV not available
|
||||
|
||||
int16 azim # Azimuth
|
||||
int8 elev # Elevation
|
||||
|
||||
uint8 age # Age of Almanac and Ephemeris
|
||||
uint8 AGE_ALM_MASK = 15 # Age of ALM in days offset by 4
|
||||
# i.e. the reference time may be in the future:
|
||||
# ageOfAlm = (age & 0x0f) - 4
|
||||
uint8 AGE_EPH_MASK = 240 # Age of EPH in hours offset by 4.
|
||||
# i.e. the reference time may be in the future:
|
||||
# ageOfEph = ((age & 0xf0) >> 4) - 4
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user