This commit is contained in:
2018-02-13 13:21:10 -08:00
133 changed files with 645875 additions and 10545 deletions

View File

@@ -0,0 +1,4 @@
# We want board documentation photos in here,
# so we'll allow specific files in this subdirectory
!*.jpg
!*.png

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 411 KiB

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

View File

@@ -0,0 +1,45 @@
# IRIS Node
![Iris](files/iris.jpg)
![Iris Render](files/iris_render.png)
Designed by [Nick McComb](www.nickmccomb.net) for OSURC Mars Rover.
## Summary
Made for MR1718 as part of the OSU Robotics Club.
Enables a single USB port to act as 10 RS485 Transceivers, receive inputs from an S.BUS style RC receiver, and interface with a few switches. Input power is 24V (self powered, no power is drawn from the USB connection). Features a Teensy 3.2 microcontroller.
This design is entirely Open Source and is available on CircuitMaker, see below for a link to the file.
This is a 4-layer design.
The name "Iris" comes from the greek messenger god, [Iris](http://www.theoi.com/Pontios/Iris.html). This is the board that acts as a "messenger god" for our computer, telling the rest of the robot what to do.
### Bill of Materials
[Bill of Materials V1](
https://docs.google.com/spreadsheets/d/1TkVeK_GaS78QLqv8NcE_QGGE-NSj-3agn10lKnISSjQ/edit?usp=sharing
)
#### Design files
[MR1718 IRIS on CircuitMaker](https://workspace.circuitmaker.com/Projects/Details/Nick-McComb/OSURC-Mars-Rover-2017-2018-Iris-Board)
### Downloads
[Schematic V1](files/iris-v1-schematic.pdf)
[3D Model V1 (STEP)](files/iris.step)
### Known Issues
#### Version 1
- Used CAN tx/rx instead of hardware UART
- Connections from FTDI to RS485 transceiver wrong, need to short DE / RE pins together, then this connection goes to FTDI enable. PWREN for the RS485 converted is wrong naming and doesnt reflect its purpose. No connection to PWREN on 4232 needed...
- Missing 3v3 rail connection to VBAT pin on Teensy. Will program without it, but will not boot without it.
- For R46 vs R47 selection, only R47 is needed.
- No invert needed for S.BUS connection (bridge pins)

View File

@@ -0,0 +1,40 @@
# Motor Node
<!-- ![Iris](files/iris.jpg) -->
![Iris Render](files/motor_render.png)
Designed by [Nick McComb](www.nickmccomb.net) for OSURC Mars Rover.
## Summary
Made for MR1718 as part of the OSU Robotics Club.
This board drives one of the Mars Rovers wheels. Its designed to be a breakout board for one of Pololus 21A motor driver boards, allowing it to be controlled over RS485 from the IRIS Node.
Note, if youre using the design, the traces going to the motor driver are only rated for 10A continuous, so be careful with the actual amount of current that you run through the motors. If you need to, bodge a wire in parallel with the XT30 connector to add more current capability. This design limitation was forced because of the space constraint that this board was designed into.
This design is completely open-source, the design files can be found at CircuitMaker, see the link below.
### Bill of Materials
[Bill of Materials V1](
https://docs.google.com/spreadsheets/d/1CobSEg-5mzBy_F1_ASbbnYLLLra0shLwDUG4rKD09mE/edit?usp=sharing
)
#### Design files
[MR1718 Motor Node on CircuitMaker](https://workspace.circuitmaker.com/Projects/Details/Nick-McComb/MR1718-Motor-Node)
### Downloads
[Schematic V1](files/motor-v1-schematic.pdf)
[3D Model V1 (STEP)](files/motor.step)
### Known Issues
#### Version 1
None (yet)

View File

@@ -0,0 +1,29 @@
## Hardware Node Documentation
This page describes the hardware nodes that are present for the 1718 Mars Rover project.
The project contains the following nodes:
- [IRIS](#iris-node)
- [Motor](#motor-node)
- Tower
- Pan-Tilt
- Grasping
- Science
- Arm Breakout 1 / 2
### IRIS node
<img src="files/iris.jpg" width="300">
This node serves as the computer's main interface with the hardware in the rest of the Rover. It features 10 RS485 ports and a Teensy Microcontroller that allows it to perform most of the control and sensing features for the Rover.
[Find more documentation here.](iris.md)
### Motor node
<img src="files/motor_render.png" width="300">
This node controls the motors that turn Rover's wheels.
[Find more documentation here.](motor.md)

View File

@@ -1,7 +1,25 @@
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="rover/ttyDEV0"
# SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="rover/ttyDEV0"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="rover/ttyDEV1"
# SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="rover/ttyDEV1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyCompass"
# SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyCompass"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyGPS"
# SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="FTU9EU0I", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyGPS"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2NFZVA", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="rover/ttyIRIS_0_0"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2NFZVA", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="rover/ttyIRIS_0_1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2NFZVA", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyIRIS_0_2"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2NFZVA", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyIRIS_0_3"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2RJ8G5", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="rover/ttyIRIS_1_0"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2RJ8G5", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="rover/ttyIRIS_1_1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2RJ8G5", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyIRIS_1_2"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2RJ8G5", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyIRIS_1_3"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="00", SYMLINK+="rover/ttyIRIS_2_0"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="01", SYMLINK+="rover/ttyIRIS_2_1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="02", SYMLINK+="rover/ttyIRIS_2_2"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6011", ATTRS{serial}=="NM2UFVE1", ENV{ID_USB_INTERFACE_NUM}=="03", SYMLINK+="rover/ttyIRIS_2_3"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="AH05K2Y8", SYMLINK+="rover/ttyTEST"

View File

@@ -15,11 +15,15 @@ import RoverVideoReceiver
#####################################
CAMERA_TOPIC_PATH = "/cameras/"
EXCLUDED_CAMERAS = ["zed"]
#
PRIMARY_LABEL_MAX = (640, 360)
SECONDARY_LABEL_MAX = (256, 144)
TERTIARY_LABEL_MAX = (256, 144)
# PRIMARY_LABEL_MAX = (1280, 720)
# SECONDARY_LABEL_MAX = (640, 360)
# TERTIARY_LABEL_MAX = (640, 360)
#####################################
# RoverVideoCoordinator Class Definition

View File

@@ -9,6 +9,7 @@ import numpy as np
import qimage2ndarray
import rospy
import dynamic_reconfigure.client
from cv_bridge import CvBridge
from sensor_msgs.msg import CompressedImage
@@ -19,6 +20,9 @@ from sensor_msgs.msg import CompressedImage
#####################################
CAMERA_TOPIC_PATH = "/cameras/"
QUALITY_MAX = 80
QUALITY_MIN = 15
#####################################
# RoverVideoReceiver Class Definition
@@ -51,7 +55,7 @@ class RoverVideoReceiver(QtCore.QThread):
self.current_camera_settings = {
"resolution": None,
"quality_setting": 80,
"quality_setting": QUALITY_MAX,
}
@@ -83,8 +87,13 @@ class RoverVideoReceiver(QtCore.QThread):
self.camera_name_opencv_1280x720_image = None
self.camera_name_opencv_640x360_image = None
# ROS Dynamic Reconfigure Client
self.reconfigure_clients = {}
# Initial class setup to make text images and get camera resolutions
self.__create_camera_name_opencv_images()
self.__get_camera_available_resolutions()
self.__setup_reconfigure_clients()
def run(self):
self.logger.debug("Starting \"%s\" Camera Thread" % self.camera_title_name)
@@ -99,6 +108,18 @@ class RoverVideoReceiver(QtCore.QThread):
self.logger.debug("Stopping \"%s\" Camera Thread" % self.camera_title_name)
def __perform_quality_check_and_adjust(self):
self.__set_jpeg_quality(self.current_camera_settings["quality_setting"])
def __set_jpeg_quality(self, quality_setting):
self.reconfigure_clients[self.current_camera_settings["resolution"]].update_configuration({"jpeg_quality": quality_setting})
def __setup_reconfigure_clients(self):
for resolution_group in self.camera_topics:
image_topic_string = "image_%sx%s" % resolution_group
full_topic = self.topic_base_path + "/" + image_topic_string + "/compressed"
self.reconfigure_clients[resolution_group] = dynamic_reconfigure.client.Client(full_topic)
def __get_camera_available_resolutions(self):
topics = rospy.get_published_topics(self.topic_base_path)
@@ -132,8 +153,10 @@ 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"]:
# if self.raw_image:
self.__perform_quality_check_and_adjust()
opencv_image = self.bridge.compressed_imgmsg_to_cv2(self.raw_image, "rgb8")
self.__create_final_pixmaps(opencv_image)
@@ -212,8 +235,6 @@ class RoverVideoReceiver(QtCore.QThread):
else:
new_topic = self.camera_topics[self.current_camera_settings["resolution"]]
self.video_subscriber = rospy.Subscriber(new_topic, CompressedImage, self.__image_data_received_callback)
# self.video_subscriber = rospy.Subscriber(self.temp_topic_path, CompressedImage,
# self.__image_data_received_callback)
self.video_enabled = True
def connect_signals_and_slots(self):

View File

@@ -0,0 +1,15 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="dict.exit_requested_signal" />
<option value="dict.primary_video_label" />
<option value="dict.secondary_video_label" />
<option value="dict.tertiary_video_label" />
</list>
</option>
</inspection_tool>
</profile>
</component>

View File

@@ -0,0 +1,7 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
<OptionsSetting value="true" id="Remove" />
<OptionsSetting value="true" id="Checkout" />
<OptionsSetting value="true" id="Update" />
<OptionsSetting value="true" id="Status" />
<OptionsSetting value="true" id="Edit" />
<ConfirmationsSetting value="0" id="Add" />
<ConfirmationsSetting value="0" id="Remove" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7" project-jdk-type="Python SDK" />
</project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/rover_drive.iml" filepath="$PROJECT_DIR$/.idea/rover_drive.iml" />
</modules>
</component>
</project>

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="projectConfiguration" value="Nosetests" />
<option name="PROJECT_TEST_RUNNER" value="Nosetests" />
</component>
</module>

View File

@@ -1,7 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
<list default="true" id="a54e79f5-3dba-4e0c-9a8b-f98d636e1a48" name="Default" comment="" />
<list default="true" id="3407228a-beb9-4e3b-a11a-9d0898be4da8" name="Default" comment="" />
<ignored path="rover_drive.iws" />
<ignored path=".idea/workspace.xml" />
<ignored path=".idea/dataSources.local.xml" />
<option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
<option name="TRACKING_ENABLED" value="true" />
@@ -11,87 +13,61 @@
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="CoverageDataManager">
<SUITE FILE_PATH="coverage/ground_station$Remote_Launch.coverage" NAME="Remote Launch Coverage Results" MODIFIED="1510962565098" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$" />
<SUITE FILE_PATH="coverage/rover_drive$Local_Launch.coverage" NAME="Local Launch Coverage Results" MODIFIED="1518128882987" SOURCE_PROVIDER="com.intellij.coverage.DefaultCoverageFileProvider" RUNNER="coverage.py" COVERAGE_BY_TEST_ENABLED="true" COVERAGE_TRACING_ENABLED="false" WORKING_DIRECTORY="$PROJECT_DIR$/src" />
</component>
<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="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>
</file>
</leaf>
</state>
</content>
</window>
</component>
<component name="ExecutionTargetManager" SELECTED_TARGET="default_target" />
<component name="FavoritesManager">
<favorites_list name="ground_station" />
<favorites_list name="rover_drive" />
</component>
<component name="FileEditorManager">
<leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
<file leaf-file-name="Logger.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
<file leaf-file-name="test.py" pinned="false" current-in-tab="false">
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<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 relative-caret-position="36">
<caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
</file>
<file leaf-file-name="RoverVideoCoordinator.py" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="647">
<caret line="117" column="0" selection-start-line="117" selection-start-column="0" selection-end-line="117" selection-end-column="0" />
<folding>
<element signature="e#110#145#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<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">
<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>
</file>
<file leaf-file-name="RoverVideoReceiverOld.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
<file leaf-file-name="rover_drive_node.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.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" />
<caret line="63" column="23" selection-start-line="63" selection-start-column="23" selection-end-line="63" selection-end-column="23" />
<folding>
<element signature="e#0#10#0" expanded="true" />
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="rover_drive_node_tester.py" pinned="false" current-in-tab="false">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="13" column="17" selection-start-line="13" selection-start-column="17" selection-end-line="13" selection-end-column="17" />
<folding>
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</file>
<file leaf-file-name="example.launch" pinned="false" current-in-tab="true">
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="54">
<caret line="3" column="54" selection-start-line="3" selection-start-column="54" selection-end-line="3" selection-end-column="54" />
<folding />
</state>
</provider>
</entry>
</file>
</leaf>
</component>
<component name="FileTemplateManagerImpl">
@@ -104,11 +80,14 @@
<component name="IdeDocumentHistory">
<option name="CHANGED_PATHS">
<list>
<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/RoverVideoReceiver.py" />
<option value="$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py" />
<option value="$PROJECT_DIR$/msg/RoverMotorDrive.msg" />
<option value="$PROJECT_DIR$/CMakeLists.txt" />
<option value="$PROJECT_DIR$/src/rover_drive.py" />
<option value="$PROJECT_DIR$/package.xml" />
<option value="$PROJECT_DIR$/src/rover_drive_node.py" />
<option value="$PROJECT_DIR$/src/rover_drive_node_tester.py" />
<option value="$USER_HOME$/PycharmProjects/485_test/test.py" />
<option value="$PROJECT_DIR$/launch/example.launch" />
</list>
</option>
</component>
@@ -119,9 +98,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="1920" />
<option name="width" value="1678" />
<option name="height" value="1020" />
</component>
<component name="ProjectLevelVcsManager" settingsEditedManually="false">
<OptionsSetting value="true" id="Add" />
@@ -148,73 +127,65 @@
<foldersAlwaysOnTop value="true" />
</navigator>
<panes>
<pane id="Scratches" />
<pane id="Scope" />
<pane id="Scratches" />
<pane id="ProjectPane">
<subPane>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
</PATH>
<PATH>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<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="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="Framework" />
<option name="myItemId" value="src" />
<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="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<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="VideoSystems" />
<option name="myItemId" value="msg" />
<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="myItemId" value="rover_drive" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.ProjectViewProjectNode" />
</PATH_ELEMENT>
<PATH_ELEMENT>
<option name="myItemId" value="ground_station" />
<option name="myItemId" value="rover_drive" />
<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="myItemId" value="launch" />
<option name="myItemType" value="com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode" />
</PATH_ELEMENT>
</PATH>
@@ -223,13 +194,16 @@
</panes>
</component>
<component name="PropertiesComponent">
<property name="last_opened_file_path" value="$PROJECT_DIR$/src/rover_drive_node_tester.py" />
<property name="WebServerToolWindowFactoryState" value="false" />
<property name="js.eslint.eslintPackage" value="" />
<property name="last_opened_file_path" value="$PROJECT_DIR$" />
<property name="settings.editor.selected.configurable" value="com.jetbrains.python.configuration.PyActiveSdkModuleConfigurable" />
<property name="settings.editor.splitter.proportion" value="0.2" />
<property name="restartRequiresConfirmation" value="false" />
</component>
<component name="RunManager">
<component name="RecentsManager">
<key name="CopyFile.RECENT_KEYS">
<recent name="$PROJECT_DIR$/launch" />
</key>
</component>
<component name="RunManager" selected="Python.Local Launch">
<configuration default="true" type="DjangoTestsConfigurationType" factoryName="Django tests">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
@@ -241,7 +215,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="TARGET" value="" />
<option name="SETTINGS_FILE" value="" />
@@ -262,7 +236,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="ADDITIONAL_ARGS" value="" />
<method />
@@ -276,7 +250,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="ADDITIONAL_ARGS" value="" />
<method />
@@ -292,7 +266,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="PARAMETERS" value="" />
@@ -309,7 +283,7 @@
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<module name="ground_station" />
<module name="rover_drive" />
<method />
</configuration>
<configuration default="true" type="js.build_tools.gulp" factoryName="Gulp.js">
@@ -337,7 +311,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
@@ -357,7 +331,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
@@ -377,7 +351,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
@@ -399,7 +373,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
@@ -422,7 +396,7 @@
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="ground_station" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="" />
<option name="CLASS_NAME" value="" />
@@ -438,6 +412,27 @@
<option name="USE_KEYWORD" value="false" />
<method />
</configuration>
<configuration default="false" name="Local Launch" type="PythonConfigurationType" factoryName="Python" singleton="true">
<option name="INTERPRETER_OPTIONS" value="" />
<option name="PARENT_ENVS" value="true" />
<envs>
<env name="PYTHONUNBUFFERED" value="1" />
</envs>
<option name="SDK_HOME" value="/usr/bin/python2" />
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src" />
<option name="IS_MODULE_SDK" value="false" />
<option name="ADD_CONTENT_ROOTS" value="true" />
<option name="ADD_SOURCE_ROOTS" value="true" />
<module name="rover_drive" />
<EXTENSION ID="PythonCoverageRunConfigurationExtension" enabled="false" sample_coverage="true" runner="coverage.py" />
<option name="SCRIPT_NAME" value="$PROJECT_DIR$/src/rover_drive_node_tester.py" />
<option name="PARAMETERS" value="" />
<option name="SHOW_COMMAND_LINE" value="false" />
<method />
</configuration>
<list size="1">
<item index="0" class="java.lang.String" itemvalue="Python.Local Launch" />
</list>
</component>
<component name="ShelveChangesManager" show_recycled="false">
<option name="remove_strategy" value="false" />
@@ -447,62 +442,37 @@
</component>
<component name="TaskManager">
<task active="true" id="Default" summary="Default task">
<changelist id="a54e79f5-3dba-4e0c-9a8b-f98d636e1a48" name="Default" comment="" />
<created>1510962234686</created>
<changelist id="3407228a-beb9-4e3b-a11a-9d0898be4da8" name="Default" comment="" />
<created>1517699292320</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1510962234686</updated>
<updated>1517699292320</updated>
</task>
<servers />
</component>
<component name="ToolWindowManager">
<frame x="0" y="16" width="1920" height="1044" extended-state="6" />
<frame x="1920" y="0" width="1678" height="1020" extended-state="5" />
<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.18383233" 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="Event Log" 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="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="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="Version Control" 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="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.32897604" sideWeight="0.5" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.3278867" sideWeight="0.5" order="2" 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" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.18259023" sideWeight="0.49807587" order="7" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" 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="7" side_tool="false" content_ui="tabs" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" 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="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" side_tool="false" content_ui="tabs" />
<window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960325" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<window_info id="Find" active="true" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.32908705" sideWeight="0.5" order="1" side_tool="false" content_ui="tabs" />
<window_info id="Ant Build" active="false" anchor="right" 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" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout>
<layout-to-restore>
<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="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="4" side_tool="false" content_ui="tabs" />
<window_info id="Message" 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="0" side_tool="false" content_ui="tabs" />
<window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="0" 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="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="5" side_tool="false" content_ui="tabs" />
<window_info id="File Transfer" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32916668" sideWeight="0.5" order="8" 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="9" 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.33" sideWeight="0.5" order="10" side_tool="false" content_ui="tabs" />
<window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.32960325" sideWeight="0.5" order="2" side_tool="false" content_ui="tabs" />
<window_info id="Terminal" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="true" show_stripe_button="true" weight="0.18259023" sideWeight="0.49807587" order="11" side_tool="false" content_ui="tabs" />
<window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.13468939" sideWeight="0.5" order="0" side_tool="false" content_ui="combo" />
<window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.25" sideWeight="0.5" order="2" side_tool="false" content_ui="combo" />
<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="Find" 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="1" 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" />
<window_info id="Ant Build" active="false" anchor="right" 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" />
<window_info id="Favorites" active="false" anchor="left" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.33" sideWeight="0.5" order="2" side_tool="true" content_ui="tabs" />
<window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="DOCKED" type="DOCKED" visible="false" show_stripe_button="true" weight="0.4" sideWeight="0.5" order="3" side_tool="false" content_ui="tabs" />
</layout-to-restore>
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="processedProjectFiles" value="true" />
</layout>
</component>
<component name="Vcs.Log.UiProperties">
<option name="RECENTLY_FILTERED_USER_GROUPS">
@@ -516,220 +486,332 @@
<option name="myLimit" value="2678400000" />
</component>
<component name="XDebuggerManager">
<breakpoint-manager>
<option name="time" value="1" />
</breakpoint-manager>
<breakpoint-manager />
<watches-manager />
</component>
<component name="editorHistoryManager">
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<caret line="21" column="37" selection-start-line="21" selection-start-column="23" selection-end-line="21" selection-end-column="37" />
<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 />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1134">
<caret line="63" column="23" selection-start-line="63" selection-start-column="23" selection-end-line="63" selection-end-column="23" />
<folding>
<element signature="e#110#134#0" expanded="true" />
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="13" column="17" selection-start-line="13" selection-start-column="17" selection-end-line="13" selection-end-column="17" />
<folding>
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="18" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1746">
<caret line="97" column="45" selection-start-line="97" selection-start-column="45" selection-end-line="97" selection-end-column="45" />
<folding>
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.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" />
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
<entry file="file://$PROJECT_DIR$/package.xml">
<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 relative-caret-position="1044">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<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 relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="288">
<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>
<caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="18" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="162">
<caret line="15" column="9" selection-start-line="15" selection-start-column="0" selection-end-line="15" selection-end-column="31" />
<state relative-caret-position="1602">
<caret line="94" column="107" selection-start-line="94" selection-start-column="107" selection-end-line="94" selection-end-column="107" />
<folding>
<element signature="e#110#145#0" expanded="true" />
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.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" />
<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#132#142#0" expanded="true" />
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
<entry file="file://$PROJECT_DIR$/package.xml">
<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 relative-caret-position="1044">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/LoggingSystems/Logger.py">
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<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" />
<state relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="18" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1602">
<caret line="94" column="107" selection-start-line="94" selection-start-column="107" selection-end-line="94" selection-end-column="107" />
<folding>
<element signature="e#110#134#0" expanded="true" />
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.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#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1044">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="252">
<caret line="16" column="0" selection-start-line="16" selection-start-column="0" selection-end-line="18" selection-end-column="12" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1602">
<caret line="94" column="107" selection-start-line="94" selection-start-column="107" selection-end-line="94" selection-end-column="107" />
<folding>
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.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#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="1044">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="8" column="0" selection-start-line="8" selection-start-column="0" selection-end-line="8" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.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#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="72">
<caret line="4" column="25" selection-start-line="4" selection-start-column="25" selection-end-line="4" selection-end-column="25" />
<folding>
<element signature="e#110#145#0" expanded="true" />
</folding>
<caret line="4" column="32" selection-start-line="4" selection-start-column="32" selection-end-line="4" selection-end-column="32" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
<entry file="file://$PROJECT_DIR$/CMakeLists.txt">
<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" />
<state relative-caret-position="360">
<caret line="71" column="20" selection-start-line="71" selection-start-column="20" selection-end-line="71" selection-end-column="20" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/msg/RoverMotorDrive.msg">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="108">
<caret line="6" column="25" selection-start-line="6" selection-start-column="25" selection-end-line="6" selection-end-column="25" />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/package.xml">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="524">
<caret line="58" column="0" selection-start-line="58" selection-start-column="0" selection-end-line="58" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/src/rover_drive_node_tester.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="144">
<caret line="13" column="17" selection-start-line="13" selection-start-column="17" selection-end-line="13" selection-end-column="17" />
<folding>
<element signature="e#132#142#0" expanded="true" />
<element signature="e#0#12#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoReceiverOld.py">
<entry file="file://$PROJECT_DIR$/src/rover_drive_node.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" />
<caret line="63" column="23" selection-start-line="63" selection-start-column="23" selection-end-line="63" selection-end-column="23" />
<folding>
<element signature="e#0#10#0" expanded="true" />
<element signature="e#132#151#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
<entry file="file://$USER_HOME$/PycharmProjects/485_test/test.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#132#142#0" expanded="true" />
</folding>
<state relative-caret-position="36">
<caret line="4" column="0" selection-start-line="4" selection-start-column="0" selection-end-line="22" selection-end-column="0" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$PROJECT_DIR$/RoverGroundStation.py">
<entry file="file://$PROJECT_DIR$/launch/example.launch">
<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#132#142#0" expanded="true" />
</folding>
<state relative-caret-position="54">
<caret line="3" column="54" selection-start-line="3" selection-start-column="54" selection-end-line="3" selection-end-column="54" />
<folding />
</state>
</provider>
</entry>
<entry file="file://$USER_HOME$/.PyCharm2016.3/system/remote_sources/-1418177152/1376253408/cv_bridge/core.py" />
<entry file="file://$USER_HOME$/.PyCharm2016.3/system/remote_sources/-1418177152/1376253408/rospy/topics.py" />
<entry file="file://$USER_HOME$/.PyCharm2016.2/system/remote_sources/-1418177152/1376253408/rospy/client.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="196">
<caret line="349" column="4" selection-start-line="349" selection-start-column="4" selection-end-line="349" selection-end-column="4" />
</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">
<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/StartupSystems/ROSMasterChecker.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="774">
<caret line="43" column="38" selection-start-line="43" selection-start-column="38" selection-end-line="43" selection-end-column="38" />
</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/VideoSystems/RoverVideoReceiver.py">
<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>
<entry file="file://$PROJECT_DIR$/Framework/VideoSystems/RoverVideoCoordinator.py">
<provider selected="true" editor-type-id="text-editor">
<state relative-caret-position="647">
<caret line="117" column="0" selection-start-line="117" selection-start-column="0" selection-end-line="117" selection-end-column="0" />
<folding>
<element signature="e#110#145#0" expanded="true" />
</folding>
</state>
</provider>
</entry>
</component>
<component name="webServersAuthStorage">
<data>AAAAsKKXH7W+VuEsk4qh+twydTt1YPNnA+gXAJpIihwslvZNSGnvh06Y3AumUNzh1gvIa8GjkgyjgzqsPXwogHKhp4FoTm129710XxtP0p0Jc5Z5EBaXjFeSgqBEblDq4vkkqkYa5cNKZt32X1ud61EkhrFYamFVJR3eddyJ0U7VBrVmXOu9I5aGeSsVL7zgiRfqlqlqVrN5ZN/QhOFvEQUWx2RI1tQ47Vj3UmgnutSWoKptIUqpb6yiF1A+2W/7igGP6Q==</data>
</component>
</project>

View File

@@ -0,0 +1,198 @@
cmake_minimum_required(VERSION 2.8.3)
project(rover_drive)
## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)
## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)
## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)
## Uncomment this if the package has a setup.py. This macro ensures
## modules and global scripts declared therein get installed
## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html
# catkin_python_setup()
################################################
## Declare ROS messages, services and actions ##
################################################
## To declare and build messages, services or actions from within this
## package, follow these steps:
## * Let MSG_DEP_SET be the set of packages whose message types you use in
## your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).
## * In the file package.xml:
## * add a build_depend tag for "message_generation"
## * add a build_depend and a run_depend tag for each package in MSG_DEP_SET
## * If MSG_DEP_SET isn't empty the following dependency has been pulled in
## but can be declared for certainty nonetheless:
## * add a run_depend tag for "message_runtime"
## * In this file (CMakeLists.txt):
## * add "message_generation" and every package in MSG_DEP_SET to
## find_package(catkin REQUIRED COMPONENTS ...)
## * add "message_runtime" and every package in MSG_DEP_SET to
## catkin_package(CATKIN_DEPENDS ...)
## * uncomment the add_*_files sections below as needed
## and list every .msg/.srv/.action file to be processed
## * uncomment the generate_messages entry below
## * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)
## Generate messages in the 'msg' folder
add_message_files(
FILES
RoverMotorDrive.msg
)
## Generate services in the 'srv' folder
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )
## Generate actions in the 'action' folder
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )
## Generate added messages and services with any dependencies listed here
generate_messages(
DEPENDENCIES
std_msgs # Or other packages containing msgs
)
################################################
## Declare ROS dynamic reconfigure parameters ##
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
## * add a build_depend and a run_depend tag for "dynamic_reconfigure"
## * In this file (CMakeLists.txt):
## * add "dynamic_reconfigure" to
## find_package(catkin REQUIRED COMPONENTS ...)
## * uncomment the "generate_dynamic_reconfigure_options" section below
## and list every .cfg file to be processed
## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )
###################################
## catkin specific configuration ##
###################################
## The catkin_package macro generates cmake config files for your package
## Declare things to be passed to dependent projects
## INCLUDE_DIRS: uncomment this if your package contains header files
## LIBRARIES: libraries you create in this project that dependent projects also need
## CATKIN_DEPENDS: catkin_packages dependent projects also need
## DEPENDS: system dependencies of this project that dependent projects also need
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES rover_drive
# CATKIN_DEPENDS rospy
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
# include
${catkin_INCLUDE_DIRS}
)
## Declare a C++ library
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/rover_drive.cpp
# )
## Add cmake target dependencies of the library
## as an example, code may need to be generated before libraries
## either from message generation or dynamic reconfigure
# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
# add_executable(${PROJECT_NAME}_node src/rover_drive_node.cpp)
## Rename C++ executable without prefix
## The above recommended prefix causes long target names, the following renames the
## target back to the shorter version for ease of user use
## e.g. "rosrun someones_pkg node" instead of "rosrun someones_pkg someones_pkg_node"
# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX "")
## Add cmake target dependencies of the executable
## same as for the library above
# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
## Specify libraries to link a library or executable target against
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )
#############
## Install ##
#############
# all install targets should use catkin DESTINATION variables
# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html
## Mark executable scripts (Python etc.) for installation
## in contrast to setup.py, you can choose the destination
# install(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark executables and/or libraries for installation
# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node
# ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )
## Mark cpp header files for installation
# install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )
## Mark other files for installation (e.g. launch and bag files, etc.)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )
#############
## Testing ##
#############
## Add gtest based cpp test target and link libraries
# catkin_add_gtest(${PROJECT_NAME}-test test/test_rover_drive.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})
# endif()
## Add folders to be run by python nosetests
# catkin_add_nosetests(test)

View File

@@ -0,0 +1,8 @@
<launch>
<group ns="drive">
<node name="" pkg="rover_drive" type="rover_drive_node.py" launch-prefix="taskset -c 5" output="screen">
<param name="port" value="/dev/rover/ttyIRIS_1_0"/>
<param name="baud" value="2000000"/>
</node>
</group>
</launch>

View File

@@ -0,0 +1,7 @@
bool first_motor_direction
bool first_motor_sleep
uint16 first_motor_speed
bool second_motor_direction
bool second_motor_sleep
uint16 second_motor_speed

View File

@@ -0,0 +1,65 @@
<?xml version="1.0"?>
<package format="2">
<name>rover_drive</name>
<version>0.0.0</version>
<description>The rover_drive package</description>
<!-- One maintainer tag required, multiple allowed, one person per tag -->
<!-- Example: -->
<!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
<maintainer email="caperren@todo.todo">caperren</maintainer>
<!-- One license tag required, multiple allowed, one license per tag -->
<!-- Commonly used license strings: -->
<!-- BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
<license>TODO</license>
<!-- Url tags are optional, but multiple are allowed, one per tag -->
<!-- Optional attribute type can be: website, bugtracker, or repository -->
<!-- Example: -->
<!-- <url type="website">http://wiki.ros.org/rover_drive</url> -->
<!-- Author tags are optional, multiple are allowed, one per tag -->
<!-- Authors do not have to be maintainers, but could be -->
<!-- Example: -->
<!-- <author email="jane.doe@example.com">Jane Doe</author> -->
<!-- The *depend tags are used to specify dependencies -->
<!-- Dependencies can be catkin packages or system dependencies -->
<!-- Examples: -->
<!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
<!-- <depend>roscpp</depend> -->
<!-- Note that this is equivalent to the following: -->
<!-- <build_depend>roscpp</build_depend> -->
<!-- <exec_depend>roscpp</exec_depend> -->
<!-- Use build_depend for packages you need at compile time: -->
<build_depend>message_generation</build_depend>
<!-- Use build_export_depend for packages you need in order to build against this package: -->
<!-- <build_export_depend>message_generation</build_export_depend> -->
<!-- Use buildtool_depend for build tool packages: -->
<!-- <buildtool_depend>catkin</buildtool_depend> -->
<!-- Use exec_depend for packages you need at runtime: -->
<exec_depend>message_runtime</exec_depend>
<!-- Use test_depend for packages you need only for testing: -->
<!-- <test_depend>gtest</test_depend> -->
<!-- Use doc_depend for packages you need only for building documentation: -->
<!-- <doc_depend>doxygen</doc_depend> -->
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>rospy</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>

View File

@@ -0,0 +1,60 @@
import rospy
import time
import atexit
import signal
import serial.rs485
import minimalmodbus
from rover_drive.msg import RoverMotorDrive
signal.signal(signal.SIGINT, signal.SIG_DFL)
rospy.init_node("drive_tester")
pub = rospy.Publisher("/drive/motoroneandtwo", RoverMotorDrive, queue_size=1)
def make_instr(port_name, baud):
instr = minimalmodbus.Instrument(port_name, 1)
instr.serial = serial.rs485.RS485(port_name, baudrate=baud, timeout=0.05)
instr.serial.rs485_mode = serial.rs485.RS485Settings(rts_level_for_rx=1, rts_level_for_tx=0, delay_before_rx=0,
delay_before_tx=0)
return instr
sbus = make_instr("/dev/rover/ttyIRIS_2_2", 2000000)
max = 1811
mid = 990
min = 172
scalar = 75
drive = RoverMotorDrive()
while not rospy.is_shutdown():
left, right = sbus.read_registers(0, 2)
# print left
drive.first_motor_direction = 1 if left > mid else 0
drive.first_motor_speed = abs(left - mid ) * scalar
# print drive.first_motor_speed
pub.publish(drive)
# try:
# drive = RoverMotorDrive()
#
# last_dir = not last_dir
# for i in range(0, 65535, speed_step):
# drive.first_motor_direction = last_dir
# drive.first_motor_speed = i
# pub.publish(drive)
# time.sleep(sleep_time)
# print i
# for i in range(65535, 0, -speed_step):
# drive.first_motor_direction = last_dir
# drive.first_motor_speed = i
# pub.publish(drive)
# time.sleep(sleep_time)
# print i
# except KeyboardInterrupt:
# exit()

View File

@@ -0,0 +1,108 @@
#!/usr/bin/env python
#####################################
# Imports
#####################################
# Python native imports
import serial.rs485
import minimalmodbus
import time
import rospy
from rover_drive.msg import RoverMotorDrive
# Custom Imports
#####################################
# Global Variables
#####################################
NODE_NAME = "rover_drive"
DEFAULT_PORT = "/dev/ttyUSB0"
DEFAULT_BAUD = 2000000
MOTOR_TOPIC = "motoroneandtwo"
FIRST_MOTOR_ID = 1
SECOND_MOTOR_ID = 2
COMMUNICATIONS_TIMEOUT = 0.3 # Seconds
MOTOR_DRIVERS_DIRECTION = {
"FORWARDS": 1,
"BACKWARDS": 0
}
MOTOR_DRIVER_REGISTER_MAP = {
"DIRECTION": 0,
"SPEED": 1
}
MOTOR_DRIVER_DEFAULT_MESSAGE = [
MOTOR_DRIVERS_DIRECTION["FORWARDS"],
0
]
#####################################
# RoverDrive Class Definition
#####################################
class RoverDrive(object):
def __init__(self):
rospy.init_node(NODE_NAME)
self.port = rospy.get_param("port", DEFAULT_PORT)
self.baud = rospy.get_param("baud", DEFAULT_BAUD)
self.first_motor_modbus_id = rospy.get_param("first_motor_modbus_id", FIRST_MOTOR_ID)
self.second_motor_modbus_id = rospy.get_param("second_motor_modbus_id", SECOND_MOTOR_ID)
self.motors_subscriber_topic = rospy.get_param("topic", MOTOR_TOPIC)
self.first_motor = minimalmodbus.Instrument(self.port, self.first_motor_modbus_id)
self.second_motor = minimalmodbus.Instrument(self.port, self.second_motor_modbus_id)
print self.port
self.motors_subscriber = rospy.Subscriber(MOTOR_TOPIC, RoverMotorDrive, self.__motor_message_callback)
self.__setup_minimalmodbus_for_485()
self.run()
def run(self):
while not rospy.is_shutdown():
time.sleep(0.25)
# try:
# self.first_motor.write_register(1, 10000)
# except IOError, error:
# pass
#
# try:
# self.second_motor.write_register(1, 30000)
# except IOError, error:
# pass
def __setup_minimalmodbus_for_485(self):
self.first_motor.serial = serial.rs485.RS485(self.port, baudrate=self.baud, timeout=COMMUNICATIONS_TIMEOUT)
self.first_motor.serial.rs485_mode = \
serial.rs485.RS485Settings(rts_level_for_rx=1, rts_level_for_tx=0, delay_before_rx=0, delay_before_tx=0)
self.second_motor.serial = serial.rs485.RS485(self.port, baudrate=self.baud, timeout=COMMUNICATIONS_TIMEOUT)
self.second_motor.serial.rs485_mode = \
serial.rs485.RS485Settings(rts_level_for_rx=1, rts_level_for_tx=0, delay_before_rx=0, delay_before_tx=0)
def __motor_message_callback(self, data):
try:
first_motor_register_data = list(MOTOR_DRIVER_DEFAULT_MESSAGE) # Makes a copy
first_motor_register_data[MOTOR_DRIVER_REGISTER_MAP["DIRECTION"]] = int(data.first_motor_direction)
first_motor_register_data[MOTOR_DRIVER_REGISTER_MAP["SPEED"]] = data.first_motor_speed
# print first_motor_register_data
self.first_motor.write_registers(0, first_motor_register_data)
except:
print "Drive exception"
#####################################
# Main Definition
#####################################
if __name__ == "__main__":
drive = RoverDrive()

View File

@@ -0,0 +1,50 @@
import rospy
import time
import atexit
import signal
from rover_drive.msg import RoverMotorDrive
signal.signal(signal.SIGINT, signal.SIG_DFL)
rospy.init_node("drive_tester")
pub = rospy.Publisher("/drive/motoroneandtwo", RoverMotorDrive, queue_size=1)
speed_step = 1000
last_dir = 0
sleep_time = 0.1
def stop_motors():
global pub
drive.first_motor_direction = last_dir
drive.first_motor_speed = 0
pub.publish(drive)
atexit.register(stop_motors)
while not rospy.is_shutdown():
try :
drive = RoverMotorDrive()
last_dir = not last_dir
for i in range(0, 65535, speed_step):
drive.first_motor_direction = last_dir
drive.first_motor_speed = i
pub.publish(drive)
time.sleep(sleep_time)
print i
for i in range(65535, 0, -speed_step):
drive.first_motor_direction = last_dir
drive.first_motor_speed = i
pub.publish(drive)
time.sleep(sleep_time)
print i
except KeyboardInterrupt:
exit()

View File

@@ -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

View File

@@ -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.

View File

@@ -1,4 +0,0 @@
cmake_minimum_required(VERSION 2.8.3)
project(ublox)
find_package(catkin REQUIRED)
catkin_metapackage()

View File

@@ -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>

View File

@@ -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
)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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

View File

@@ -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

View File

@@ -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
)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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.

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -1,4 +0,0 @@
# see MonVER message
#
char[30] field

View File

@@ -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]

View File

@@ -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]

View File

@@ -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

View File

@@ -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]

View File

@@ -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]

View File

@@ -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]

View File

@@ -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]

View File

@@ -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]

View File

@@ -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

View File

@@ -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)

Some files were not shown because too many files have changed in this diff Show More