<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">\documentclass[onecolumn,letterpaper,11pt]{article}

%===================================================================
\input{common_latex/common_latex_packages}
\input{common_latex/common_latex_definitions}
\input{common_latex/common_latex_help_format}
%===================================================================

\begin{document}

\begin{labcover}
\labtitle{iGPSDevice: A MOOS Driver for GPS Devices}
\vspace{0.1in}
\labdate{Fall 2017}
\vspace{0.1in}
\labauth{Alon Yaari, ayaari@mit.edu}
\labauth{Michael Benjamin, mikerb@mit.edu}
\labauth{Department of Mechanical Engineering}
\labauth{MIT, Cambridge MA 02139}
\labtoc{small}
\end{labcover}

\wikidoc{file=PavLab.IGPSDevice}
\wikidoc{bugz=iGPSDevice}
\wikidoc{auth=ayaari@mit.edu}


%====================================================================
\section{iGPSDevice: A MOOS Driver for GPS Devices}
%====================================================================
\label{sec_iGPSDevice}
\index{iGPSDevice}

The \app{iGPSDevice} application is designed as an interface to a
stream of NMEA position sentences. Its typical use is to read data
from a GPS serving data over a serial line. If correctly-formed
sentences are provided, output is publication of latitude, longitude,
speed, heading, and \var{(X, Y)} relative to the local grid origin.

\paragraph{What is being measured?} Measurements ingested by \app{iGPSDevice} 
are relative to the sensor body. On a larger platform it is important
to note the sensing position relative to the axes of motion used for
planning vehicle dynamics. Devices with a single antenna determine
orientation only from movement and are not sensitive to
placement. Devices with two antennas (dual-receiver) units can sense
orientation when static and therefore must be carefully installed in a
manner that maintains orientation if the unit is removed.

%====================================================================
\section{Using the iGPSDevice Application}
\label{sec_using_igpsdev}

The National Marine Electronics Association (NMEA) is a trade
organization that manages a set of proprietary standards for
communications between marine electronic devices. Several variants
exist, with NMEA-0183 specification prevalent among serial-interface
devices.

The NMEA-0183 data standard describes UTF-8 based strings that always
start with the character '\var{\$}' and end in the two characters
\var{&lt;LF&gt;&lt;CR&gt;}. An optional checksum can be included as a 3-character
sequence "\var{*XX}"before the \var{&lt;CR&gt;&lt;LF&gt;}, where XX is a
hexadecimal checksum value.  The \var{LF} character is a line feed
(ASCII decimal value 10 or '\var{\textbackslash n}' in
C-notation). The \var{CR} character is a carriage return (ASCII
decimal value 13 or '\var{\textbackslash r}' in C-notation).

\paragraph{Sentences.} A properly-formatted data strings is called a {\em 
sentence}. Data elements in a sentence are separated by a comma
character, which can never be used in data elements. Space characters
and most punctuation are not allowed and letters must always be
uppercase. Empty data elements are denoted by no characters between
the leading and trailing comma. If blank, the last data element is
followed either by an asterisk or the \var{&lt;LF&gt;&lt;CR&gt;} (if no checksum).

\paragraph{Keys.} The first data element in an NMEA sentence is called the key. 
Keys are typically five characters although some unofficial variats exist. 
Official keys are issued by the standards organization to describe generic data 
groupings or on a licensed basis. For example, the \var{GPGGA} key describes a 
position fix from a GPS with data elements for time, latitude, longitude, and 
various quality indicators.

\subsection{Handled NMEA Sentences}
\label{sec_nmea_handled}

Typically, GPS devices can be configured to output various generic and
vendor-proprietary sentences. As they are received by
\app{iGPSDevice}, familiar sentences are parsed while unknown keys are
ignored.

\vspace{0.15in}
\begin{listing}{NMEA sentences handled by \app{iGPSDevice}}
\label{lst_handled_nmea}
\renewcommand{\arraystretch}{1.1}
\begin{longtable}{|p{0.125\linewidth}|p{0.2\linewidth}|p{0.125\linewidth}|p{0.4\linewidth}|} \hline
  {\bf Key} &amp; {\bf Report} &amp; {\bf Vendor Specific} &amp; {\bf Description} \\
  \hline
  \var{GPGGA} &amp; latitude, longitude, x, y, quality, sat, hdop &amp; generic &amp; 
  GPS  position fix and basic quality indicators. \\
  \var{GPGGA} &amp; latitude, longitude, x, y, quality, sat, hdop &amp; generic &amp; GPS 
  position fix and basic quality indicators. \\
  \var{GPHDT} &amp; yaw &amp; Hemisphere only &amp; Direction receiver is pointed toward, 
  relative to true north. \\
  \var{GPRMC} &amp; latitude, longitude, x, y, speed, heading &amp; generic &amp; Minimum 
  travel details, including position, speed, and direction of travel 
  (heading). This sentence must be included for speed output. \\
  \var{GPRME} &amp; hpe &amp; Garmin only &amp; Estimated position error. \\
  \var{PASHR} &amp; pitch, roll &amp; Hemisphere only &amp; Pose estimation. \\
  \hline
\end{longtable}
\end{listing}

%=====================================================================
\subsection{GPS Configuration}
\label{subsubsec_using_igpsdev}

The \app{iGPSDevice} application will work with any user-configurable
GPS unit with non-volatile memory. It is typical of most commercial
devices that the sentences to stream are selectable and are retained
between sessions.

{\bf It is expected that the GPS unit will be configured prior to use; 
\app{iGPSDevice} does not attempt to set parameters on the device. } For all 
GPS units, the only required sentence is \var{GPRMC}, which provides the basic 
\mvar{NAV\_*} variables: X, Y, speed, and motion-based heading (X and Y are 
calculated based on lat/lon). Quality metrics can be gained with the 
\var{GPGGA} sentence. Dual-receiver units report yaw from the 
\var{GPHDT} sentence pitch, and roll.

%=====================================================================
\subsection{Vehicle Heading}
\label{subsubsec_heading}

On a marine vehicle, {\em heading} can have multiple meanings. When
provided in degrees, the value is always measured clockwise from true
north. The \mvar{NAV\_HEADING} message typically describes the
vehicle's motion and depending on the control scheme may be inferred
as heading or course.


\vspace{0.15in}
\begin{listing}{Glossary of terms related to vehicle heading}
\label{lst_heading_glossary}
\renewcommand{\arraystretch}{1.1}
\begin{longtable}{rp{0.76\textwidth}} 
	{\bf heading}: &amp; Angle between true north and the direction where the 
	vehicle is pointing. \\
	{\bf course}: &amp; Angle between true north and the direction vehicle 
	travel direction. \\
	{\bf yaw}: &amp; In the context of \app{iGPSDevice} message publications, yaw 
	is a synonym for heading. \\
\end{longtable}
\end{listing}

\noindent
Course differs from heading when a force such as current or wind contributes to 
motion in a direction other than the vehicle's heading. Some difference is also 
noticeable during turns. Single-receiver GPS devices publish "course made good" 
in the \var{GPRMC} message. This is the angle of movement between successive 
position fixes. As a result, this value is unreliable when moving slowly, 
perhaps slower than 1 $m/s$ (value differs between GPS models). Dual-receiver 
GPS devices are designed to calculate both course made good and the true 
heading value.

The \app{iGPSDevice} application can acquire and report heading from various 
sources, as selected in a mission file parameter. Options include:

\vspace{0.15in}
\begin{tabular}{| c l |}\hline
  {\bf Source} &amp; {\bf Description} \\ \hline
  \var{None} &amp; No heading value is published. \\
  \var{Compass} &amp; \app{iGPSDevice} receives the current heading from a 
  digital compass interface over the \mvar{COMPASS\_HEADING} message. \\
  \var{GPRMC} &amp; Heading is taken from the "course made good" element of the 
  \var{GPRMC} message. On a single-receiver GPS, this will result in 
  unreliable heading when stopped or moving slowly. \\
  \var{PASHR} &amp; Valid only when using a Hemisphere dual-receiver unit, 
  sources heading from the \var{PASHR} message, which is the heading (not the 
  course) of the vehicle. \\ \hline
\end{tabular}
\vspace{0.15in}

\noindent
When the compass option is selected, \app{iGPSDevice} simply republishes the 
\mvar{COMPASS\_HEADING} message under the name \mvar{NAV\_HEADING}.

%=====================================================================
\subsection{Optional Message Publications}
\label{sec_optional_pub}

GPS devices publish additional data elements that may be useful. By
default, these are not published. Mission file parameters provide the
following options:

\vspace{0.15in}
\begin{tabular}{| c c l |} \hline
  {\bf Data Element} &amp; Parameter Name &amp; {\bf Description} \\ \hline
  \var{UTC} &amp; \pvar{publish\_utc} &amp; Coordinated Universal Time, the timestamp 
  of the most recent NMEA sentence that contains the value, in zulu time. \\
  \var{HPE} &amp; \pvar{publish\_hpe} &amp; (Garmin-only) Horizontal Position Error, 
  a value in meters describing a likely error radius on the 2D ground plane. 
  The vendor has not published a full description of this value's meaning. \\
  \var{HDOP} &amp; \pvar{publish\_hdop} &amp; Horizontal Dilution of Precision, a 
  unitless uncertainty factor along the 2D ground plane, with meaning 
  differing per vendor. Values increase with uncertainty. \\
  \var{Yaw} &amp; \pvar{publish\_yaw} &amp; (Hemisphere-only), the heading value 
  from a \var{PASHR} sentence. Can be used as a complement to 
  \mvar{NAV\_HEADING} with a source of \var{GPRMC}. \\
  \var{RAW} &amp; \pvar{publish\_raw} &amp; Publish all incoming sentences to the 
  message \mvar{NMEA\_FROM\_GPS}. Useful for logging. \\
  \var{Pitch, Roll} &amp; \pvar{publish\_pitch\_roll} &amp; (Hemisphere-only), 
  publish pitch and roll from the \var{PASHR} sentence. \\ \hline
\end{tabular}
\vspace{0.15in}

\paragraph{Pitch and Roll.} On Hemisphere dual-receiver GPS unit, the 
\var{PASHR} sentence includes pitch and roll. Both values are measured in 
decimal degrees where zero is horizontal and extents are in the range $[-90, 
90]$. The Hemisphere device may be installed forward or side facing. The 
mission-file parameter \pvar{swap\_pitch\_roll} can be used when the unit is 
side-facing.

%=====================================================================
\subsection{Position Uncertainty}
\label{sec_pos_uncertainty}

GPS fixes are a wonder of modern engineering but these devices are not
perfect.  Uncertainty is present in all measurements, more so in
single-receiver and lower-cost units. Many factors influence accuracy,
including atmospheric, multipath, and satellite constellation
configuration. In some cases, the GPS unit itself can report that
uncertainty has increased. The HDOP value can be monitored or logged
and referenced when the vehicle operates in an unexpected manner. See
the \ref{sec_additional_pub} section details on how to enable
HDOP publication.

%=====================================================================
\subsection{Triggering}
\label{sec_triggering}

The GPS acquires a fix and streams output at a defined rate, typically
1Hz, 5Hz, or 10Hz. Each fix can include multiple sentences and data
elements such as latitude/longitude might be published more than once
per cycle. On parsing a sentence, \app{iGPSDevice} publishes the data
right away. The concept of a {\em trigger} prevents the logs from
getting flooded with duplicate values. The required mission file
parameter \pvar{trigger\_msg} defines the NMEA key that will trigger
publications.

%=====================================================================
\subsection{The XY Grid}
\label{sec_xy_grid}

The \mvar{NAV\_X} and \mvar{NAV\_Y} variables are transformations of
latitude and longitude fixes provided by the GPS. X,Y positions are
referenced in number of meters from a 0,0 origin location as defined
in the mission file.  Historically, MOOS has used two different
methods to convert geographic positions into X,Y, the \var{MOOS Grid}
and \var{UTM-based Grid}. Note that in both cases, 0,0 will always be
the origin specified in the mission file and the X,Y is a report of
position in meters away from the origin in meters.

\paragraph{MOOS Grid.} Historically, the core MOOSGeodesy library included the 
concept of a local tangent plane centered about the origin. Angular
distance of any position fix is converted using simple trigonometry
based on WGS84 spheroid approximations of the earth. Surface curvature
is negligible within a 300 square kilometer area centered on the
origin.

\paragraph{UTM-based Grid.} MOOSGeodesy has also included the option of 
transforming positions to X,Y using the Universal Transverse Mercator
(UTM) projection. A concise description of UTM is provided by the
USGS: \urlx{http://pubs.usgs.gov/fs/2001/0077/report.pdf}. Working with
UTM-based transformations provides multiple benefits, including a
larger area of accurate gird positions, compatibility to positioning
systems outside of MOOS, and reliance on the dedicated \var{proj.4}
conversion code base instead of static historical functions.

\paragraph{Which grid to use?} Those without historical reasons to do so should 
use UTM-based X,Y transformations. Besides the benefits listed above,
UTM-based Grid is the default for applications like
\app{pMarineViewer}. MOOS Grid conversions are appropriate for those
who must remain compatible with historical X,Y positions originally
calculated using MOOS Grid.


%===================================================================
\section{Configuration Parameters for iGPSDevice}
%===================================================================
\index{iGPSDevice!Configuration Parameters}
\index{Configuration Parameters!iGPSDevice}

The \app{iGPSDevice} application may be configured with a
configuration block within a MOOS mission file, typically with a
\var{.moos} file suffix. The following parameters are defined for
\app{iGPSDevice}.

\vspace{0.15in}
\begin{listing}{Configuration Parameters for iGPSDevice}
  \label{lst_gpsdev_params}
  \renewcommand{\arraystretch}{1.1}
  \begin{longtable}{rp{0.76\textwidth}} 
    
    \pvar{port}: &amp; (required) Fully-qualified path to the operating
    system's serial stream for the device. Example:
    \var{/dev/ttyUSB.3-2.1:1.0} \\
    
    \pvar{trigger\_msg}: &amp; (required) Triggers the publication of
    \var{NAV\_*} messages. Typical value is \var{GPRMC}. \\
    
    \pvar{baudrate}: &amp; (optional, default = \var{19200}) Serial
    communications baud rate, must be one of \var{2400}, \var{4800},
    \var{9600}, \var{19200}, \var{38400}, \var{57600}, or
    \var{115200}. \\
    
    \pvar{prefix}: &amp; (optional, default = \var{gps\_}) Message names
    published by \app{iGPSDevice} will be prefixed by this string. If
    not included, an underscore will inserted as the last prefix
    character. If a blank value is provided, no prefix or underscore
    will precede variable name in the publication. \\
    
    \pvar{xy\_source}: &amp; (optional, default = \var{UTM}) Method for
    converting latitude and longitude position fixes into X,Y
    positions on the local grid.  See \ref{sec_iGPSDevice} for more
    details. Valid values are \var{UTM} and \var{GRID}. If unsure, use
    the default value. \\
    
    \pvar{heading\_source}: &amp; (optional, default = \var{none}) Source
    of \mvar{NAV\_HEADING} publications, may be one of \var{none},
    \var{gprmc}, \var{pashr}, or \var{compass}. See
    \ref{sec_heading} for more details. \\
    
    \pvar{heading\_offset}: &amp; (optional, default = \var{0.0}) If
    \pvar{heading]\_source} is not \var{none}, heading publications
      are offset by this value. Typically used to adjust for adjusting
      magnetic to true north. \\
      
    \pvar{publish\_utc}: &amp; (optional, default = \var{false}) When set
    to true, publish universal coordinate time in the message
    \mvar{[prefix]\_UTC}, otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
    \pvar{publish\_hpe}: &amp; (optional, default = \var{false}) When set
    to true, publish horizontal position error in the message
    \mvar{[prefix]\_HPE}, otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
    \pvar{publish\_hdop}: &amp; (optional, default = \var{false}) When set
    to true, publish horizontal dilution of precision in the message
    \mvar{[prefix]\_HDOP}, otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
    \pvar{publish\_yaw}: &amp; (optional, default = \var{false}) When set
    to true, publish yaw in the message \mvar{[prefix]\_YAW},
    otherwise do not publish.  See Section \ref{sec_optional_pub} for
    more details. \\
    
    \pvar{publish\_raw}: &amp; (optional, default = \var{false}) When set
    to true, publish raw incoming NMEA sentences in the message
    \mvar{NMEA\_FROM\_GPS}, otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
    \pvar{publish\_pitch\_roll}: &amp; (optional, default = \var{false})
    When set to true, publish vehicle pitch in the message
    \mvar{[prefix]\_PITCH} and vehicle roll in the message
    \mvar{[prefix]\_ROLL}, otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
    \pvar{swap\_pitch\_roll}: &amp; (optional, default = \var{false}) When
    set to true and \pvar{publish\_pitch\_roll} is set to true, swap
    the values published in \mvar{[prefix]\_PITCH} and
    \mvar{[prefix]\_ROLL}. Otherwise do not publish. See Section
    \ref{sec_optional_pub} for more details. \\
    
  \end{longtable}
\end{listing}


%====================================================================
\subsection{An Example MOOS Configuration Block}

An example MOOS configuration block is provided in Listing
\ref{lst_gpsdev_econfig} below. This can also be obtained from a
terminal window with:

\vspace{0.1in}
\begin{consoleverb}
 $ iGPSDevice --example or -e
\end{consoleverb}
\vspace{0.1in}

\vspace{0.25in}
\begin{listing}{Example configuration of the iGPSDevice application}
\label{lst_gpsdev_econfig}
\footnotesize
\begin{verbatim}
1   ============================================================================
2   iGPSDevice Example MOOS Configuration
3   ============================================================================
4
5   ProcessConfig = iGPSDevice
6   {
7     AppTick    = 10              // Ticks should be set to a value equal to or
8     CommsTick  = 10              // greater than the GPS output frequency
9     
10    Port            = /dev/ttyACM1  // Fully-qualified path to the serial port
11    BaudRate        = 19200      // Serial port baud rate
12    PREFIX          = GPS_       // Prepends this to all GPS publications
13    HEADING_SOURCE  = none       // none or blank: no published GPS heading
14                                 // gprmc: heading is published from $GPRMC
15                                 // compass: heading is published, source is
16                                 //            from COMPASS_HEADING message
17                                 // pashr: heading is published from $PASHR
18                                 //        When no heading from $PASHR, uses
19                                 //        COMPASS_HEADING, if available
20    HEADING_OFFSET  = 0.0        // If publishing heading, this offset value
21                                 //   will be added to heading when published.
22    PUBLISH_UTC     = false      // If true, publishes UTC time from the GPS
23    PUBLISH_HPE     = false      // If true, publishes horiz. position error
24    PUBLISH_HDOP    = false      // If true, publishes HDOP
25    PUBLISH_YAW     = false      // If ture, publish yaw (if available)
26    PUBLISH_RAW     = false      // If true, publish all nmea sentences to
27                                 //   MOOS message NMEA_FROM_GPS
28    PUBLISH_PITCH_ROLL = false   // If true, publish pitch and roll (if avail)
29    SWAP_PITCH_ROLL = false      // If true, swaps pitch and roll values.
30    TRIGGER_MSG     = gpgga      // Accumulates data from all incoming
31                                 //   NMEA_MSGs but only publishes when the
32                                 //   trigger is received.
33                                 //   No trigger when not defined, blank, or
34                                 //   set to 'NONE'
35  }
\end{verbatim}
\normalsize
\end{listing}

%=============================================================
\section{Publications and Subscriptions for iGPSDevice}
%=============================================================
\index{iGPSDevice!Publications and Subscriptions}
\index{Publications and Subscriptions!iGPSDevice}
\label{sec_gpsdev_interface}

The interface for \app{iGPSDevice}, in terms of publications and
subscriptions, is described below. This same information may also be
obtained from the terminal with:

\vspace{0.1in}
\begin{consoleverb}
$ iGPSDevice --interface or -i
\end{consoleverb}
\vspace{0.05in}

%=============================================================
\subsection{Variables Published by iGPSDevice}
\label{sec_gpsdev_pubs}

\noindent
The mission file parameter \pvar{prefix} defines the \mvar{[prefix]}
text in the list of MOOS message publications below. For example, if
\pvar{prefix}=\pvar{NAV\_}, speed is published under the name
\mvar{NAV\_SPEED}.

\begin{packed_itemize}[2]
	
\item \mvar{APPCAST}: Contains an appcast report identical to the terminal 
  output. Reports are posted only in response to an appcast request messages.
  
\item \mvar{NMEA\_FROM\_GPS}: Published only when mission file parameter 
  \pvar{publish\_raw}=\pvar{true}. All incoming NMEA sentences (whether 
  processed or not) are published to this message.
  
\item \mvar{[prefix]\_LATITUDE}: Latitude parsed from the most recent NMEA 
  sentence. Published each time the \pvar{trigger\_msg} is received.
  
\item \mvar{[prefix]\_LAT}: Copy of \mvar{[prefix]\_LATITUDE}.
  
\item \mvar{[prefix]\_LONGITUDE}: Longitude parsed from the most recent 
  NMEA sentence. Published each time the \pvar{trigger\_msg} is received.
  
\item \mvar{[prefix]\_LONG}: Copy of \mvar{[prefix]\_LONGITUDE}.
  
\item \mvar{[prefix]\_X}: Computed from the current lat/lon, distance on 
  the local grid as meters east (positive) or west (negative) from the grid 
  origin.
  
\item \mvar{[prefix]\_Y}: Computed from the current lat/lon, distance on 
  the local grid as meters north (positive) or south (negative) from the grid 
  origin.
  
\item \mvar{[prefix]\_SPEED}: Speed over ground in meters per second.
  
\item \mvar{[prefix]\_HEADING}: Heading in degrees clockwise from true 
  north. Calculated per the \pvar{heading\_source} parameter specified in the 
  mission file.
  
\item \mvar{[prefix]\_YAW}: Available when mission file parameter 
  \pvar{publish\_yaw}=\pvar{true}. Orientation along the ground plane in 
  degrees clockwise from true north. On GPS units with the \var{PASHR} 
  message, this value is the direction the GPS unit is pointing toward 
  (versus heading, the direction the GPS is traveling). For other GPS units 
  this is a duplicate of heading.
  
\item \mvar{[prefix]\_PITCH}: Available when mission file parameter 
  \pvar{publish\_pitch\_roll}=\pvar{true}. Tilt measurement forward-back 
  where 0.0 is horizontal, negative is bow down and positive is bow up. Only 
  relevant on devices publishing a \var{PASHR} message. When parameter 
  \pvar{swap\_pitch\_roll}=\pvar{true}, pitch and roll are swapped.
  
\item \mvar{[prefix]\_ROLL}: Available when mission file parameter 
  \pvar{publish\_pitch\_roll}=\pvar{true}. Tilt measurement left-right where 
  0.0 is horizontal, negative is left-side down and positive is left-side up. 
  Only relevant on devices publishing a \var{PASHR} message. When parameter 
  \pvar{swap\_pitch\_roll}=\pvar{true}, pitch and roll are swapped.
  
\item \mvar{[prefix]\_SAT}: Available when the GPS device outputs the 
  \var{GPGGA} message.  The current number of GPS satellites contributing to 
  the position fix.
  
\item \mvar{[prefix]\_HDOP}: Available when mission file parameter  
  \pvar{publish\_hdop}=\pvar{true} and when the GPS device outputs the 
  \var{GPGGA} message. Describes position fix uncertainty.
  
\item \mvar{[prefix]\_QUALITY}: Available when the GPS device outputs the 
  \var{GPGGA} message. Value is a single character, '0'=No fix, 
  '1'=Non-differiential fix, '2'=Differential fix, and '6'=Estimated position 
  fix.
  
\item \mvar{[prefix]\_MAGVAR}: Magnetic variation (angle between true and 
  magnetic north) at the current position. 
  
\item \mvar{[prefix]\_HPE}: Available when mission file parameter 
  \pvar{publish\_hpe}=\pvar{true} and when the Garmin GPS device outputs the  
  \var{CPRME} message. Describes position fix uncertainty as the radius of 
  probably location in meters.
  
\end{packed_itemize}

%======================================================================
\subsection{Variables Subscribed for by iGPSDevice}
\label{sec_gpsdev_subs}

The \app{iGPSDevice} application subscribes to the following MOOS messages:

\begin{packed_itemize}[2]
	
\item \mvar{APPCAST\_REQ}: A request to generate and post a new apppcast 
  report, with reporting criteria, and expiration.
  
\item \mvar{COMPASS\_HEADING}: This message provides the current compass 
  reading When the mission file parameter \pvar{heading\_source} is set to 
  \pvar{compass}.
  
\end{packed_itemize}

\end{document}

</pre></body></html>