GithubHelp home page GithubHelp logo

swri-robotics / novatel_gps_driver Goto Github PK

View Code? Open in Web Editor NEW
169.0 15.0 130.0 475 KB

ROS driver for NovAtel GPS / GNSS receivers

License: BSD 3-Clause "New" or "Revised" License

CMake 1.21% C++ 98.24% Python 0.55%

novatel_gps_driver's Introduction

NovAtel GPS Driver Build Status

Overview

This is a C++ ROS driver for NovAtel GPS / GNSS Receivers.

Features:

  • Fast and robust
  • Supports serial, TCP, and UDP connections
  • Can play back PCAP capture logs to test behavior
  • Supports a variety of common NovAtel logs
  • Easy to add support for more log types
  • Supports ASCII and binary-format NovAtel logs
  • Can synchronize BESTPOS, BESTVEL, and PSRDOP2 logs together in order to produce gps_common/GPSFix messages
  • Tested with OEM4, OEM6, and OEM7 receivers
  • Can produce IMU data from receives with SPAN support

It has been tested primarily on NovAtel OEM628 receivers, but it has been used with various OEM4, OEM6, and OEM7 devices. Please let the maintainers know of your success or failure in using this with other devices so we can update this page appropriately.

Usage

The driver should function on ROS 2 Dashing, and binary packages are available for both of them. To install them, first install ROS, then just run:

sudo apt-get install ros-dashing-novatel-gps-driver

If you'd like to build it from source:

mkdir -p novatel/src
cd novatel/src
git clone https://github.com/swri-robotics/novatel_gps_driver
rosdep install . --from-paths -i
cd ../..
colcon build

Then create a .launch.py file and configure it as desired:

"""Launch an example driver that communicates using TCP"""

from launch import LaunchDescription
import launch_ros.actions


def generate_launch_description():
    container = launch_ros.actions.ComposableNodeContainer(
        name='novatel_gps_container',
        namespace='',
        package='rclcpp_components',
        executable='component_container',
        composable_node_descriptions=[
            launch_ros.descriptions.ComposableNode(
                package='novatel_gps_driver',
                plugin='novatel_gps_driver::NovatelGpsNode',
                name='novatel_gps',
                parameters=[{
                    'connection_type': 'serial',
                    'device': '/dev/ttyUSB0',
                    'verbose': True,
                    'publish_novatel_positions': True,
                    'publish_novatel_velocity': True,
                    'publish_novatel_psrdop2': True,
                    'frame_id': '/gps'
                }]
            )
        ],
        output='screen'
    )

    return LaunchDescription([container])

gps_common/GPSFix messages will always be published, but by default, other message types are not. See the config parameters for a list of which other message types can be enabled.

Packages

  1. novatel_gps_msgs

    ROS messages that represent NovAtel message logs. Each supported log should have its own message type. A list of official log types can be found at http://docs.novatel.com/OEM7/Content/Logs/Log_Reference.htm .

  2. novatel_gps_driver

    A C++ library with an accompanying ROS node and node that can connect to a NovAtel device over a serial, TCP, or UDP connection and translate NovAtel logs into ROS messages.

Nodelets

  1. novatel_gps_driver/novatel_gps_nodelet

    1. ROS Parameters
      • connection_type: Type of physical connection to the device
        • One of serial, tcp, udp, or pcap
        • Default: serial
      • device: Location of device connection.
        • For serial connections, the device node; e. g., /dev/ttyUSB0
        • For tcp or udp connections, a host:port specification.
          • If the host is omitted, it will listen for connections on the specified port.
          • If the port is omitted, 3001 will be used as the default for TCP connections and 3002 as the default for UDP connections.
        • For pcap connections, the location of a .pcap capture file. Note that the node will exit automatically after finishing playback.
        • Default: Empty
      • frame_id: ROS TF frame to place in the header of published messages.
        • Default: Empty
      • imu_frame_id: TF frame id to use in IMU messages.
        • Default: Empty
      • imu_rate: Desired logging rate in Hz for IMU messages.
        • This is set as the rate for CORRIMUDATA logs.
        • Default: 100
      • imu_sample_rate: Sample rate of the connected IMU. Normally this is automatically detected based on the IMU type.
      • polling_period: Desired period between GPS messages.
        • This will be set as the period for GPGGA, GPRMC, GPGSA, BESTPOS, and BESTVEL logs.
        • Default: 0.05 (20 Hz)
      • expected_rate: Expected publish rate of GPS messages.
        • If time between GPS message stamps is greater than 1.5 times the excepted publish rate, diagnostic warning is published.
        • Default: Based on polling_period parameter: 20.0 (20Hz)
      • publish_clocksteering: true to publish novatel_gps_msgs/ClockSteering messages.
        • Default: false
      • publish_diagnostics: true to publish node diagnostics.
        • Default: false
      • publish_gpgsa: true to publish novatel_gps_msgs/Gpgsa messages.
        • Default: false
      • publish_gpgsv: true to publish novatel_gps_msgs/Gpgsv messages.
        • Default: false
      • publish_gphdt: true to publish novatel_gps_msgs/Gphdt messages.
        • Default: false
      • publish_imu_messages: true to publish novatel_gps_msgs/NovatelCorrectedImuData, novatel_gps_msgs/Inspva, novatel_gps_msgs/Inspvax, novatel_gps_msgs/Insstdev, and sensor_msgs/Imu messages.
        • Default: false
      • publish_nmea_messages: true to publish novatel_gps_msgs/Gpgga and novatel_gps_msgs/Gprmc messages.
        • Default: false
      • publish_novatel_dual_antenna_heading: true to publish novatel_gps_msgs/NovatelDualAntennaHeading messages.
        • Default: false
      • publish_novatel_heading2: true to publish novatel_gps_msgs/Heading2 messages.
        • Default: false
      • publish_novatel_positions: true to publish novatel_gps_msgs/NovatelPosition messages. Note that even if this is false, these logs will always be requested from the receiver in order to generate gps_msgs/GPSFix messages.
        • Default: false
      • publish_novatel_psrdop2: true to publish novatel_gps_msgs/NovatelPsrdop2 messages. If set, the data from these messages will be used to fill in the DoP values in gps_msgs/GPSFix messages. Note that these messages are only published when the values change, not at the standard polling rate.
        • Default: false
      • publish_novatel_utm_positions: true to publish novatel_gps_msgs/NovatelUtmPosition messages.
        • Default: false
      • publish_novatel_velocity: true to publish novatel_gps_msgs/NovatelVelocity messages. If set, the data from these messages will be used to fill in the speed and track values in gps_msgs/GPSFix messages.
        • Default: false
      • publish_novatel_xyz_positions: true to publish novatel_gps_msgs/NovatelXYZ messages.
        • Default: false
      • publish_range_messages: true to publish novatel_gps_msgs/Range messages.
        • Default: false
      • publish_sync_diagnostic: If true, publish a time Sync diagnostic.
        • Ignored if publish_diagnostics is false.
        • Default: true
      • publish_time_messages: true to publish novatel_gps_msgs/Time messages.
        • Default: false
      • publish_trackstat: true to publish novatel_gps_msgs/Trackstat messages.
        • Default: false
      • reconnect_delay_s: Second delay between reconnection attempts.
        • Default: 0.5
      • serial_baud: Select the serial baud rate to be used in a serial connection.
        • Default: 115200
      • spam_frame_to_ros_frame: Translate the SPAN coordinate frame to a ROS coordinate frame using the VEHICLEBODYROTATION and APPLYVEHICLEBODYROTATION commands.
        • Default: false
      • use_binary_messages: true to request binary NovAtel logs, false to request ASCII.
        • Binary logs are much more efficient and effectively required for IMU data, but ASCII logs are easier to parse for a human.
        • Default: false
      • wait_for_sync: true in order to wait for both BESTPOS and BESTVEL messages to arrive before publishing gps_msgs/GPSFix messages. If this is false, GPSFix messages will be published immediately when BESTPOS messages are received, but a side effect is that the driver will often be unable to fill in the speed & track fields. This has no effect if publish_novatel_velocity is false.
        • Default: true
    2. ROS Topic Subscriptions
      • /gps_sync (std_msgs/Time): (optional) Timestamped sync pulses from a DIO module. These are used to improve the accuracy of the time stamps of the messages published.
    3. ROS Topic Publications
      • /bestpos (novatel_gps_msgs/NovatelPosition): BESTPOS logs
      • /bestutm (novatel_gps_msgs/NovatelUtmPosition): BESTUTM logs
      • /bestvel (novatel_gps_msgs/NovatelVelocity): BESTVEL logs
      • /bestxyz (novatel_gps_msgs/NovatelXYZ): BESTXYZ logs
      • /clocksteering (novatel_gps_msgs/ClockSteering): CLOCKSTEERING logs
      • /corrimudata (novatel_gps_msgs/NovatelCorrectedImuData): CORRIMUDATA logs
      • /diagnostics (diagnostic_msgs/DiagnosticArray): ROS diagnostics
      • /dual_antenna_heading (novatel_gps_msgs/NovatelDualAntennaHeading): DUALANTENNAHEADING logs
      • /fix (sensor_msgs/NavSatFix): GPSFix messages converted to NavSatFix messages
      • /gpgga (novatel_gps_msgs/Gpgga): GPGGA logs
      • /gpgsa (novatel_gps_msgs/Gpgsa): GPGSA logs
      • /gpgsv (novatel_gps_msgs/Gpgsv): GPGSV logs
      • /gprmc (novatel_gps_msgs/Gprmc): GPRMC logs
      • /gps (gps_msgs/GPSFix): Fixes produced by combining BESTVEL, PSRDOP2 and BESTPOS messages together
        • Note: GPSFix messages will always be published regardless of what other types are enabled.
      • /heading2 (novatel_gps_msgs/NovatelHeadin2): HEADING2 logs
      • /imu (sensor_msgs/Imu): CORRIMUDATA logs converted to Imu messages
      • /inspva (novatel_gps_msgs/Inspva): INSPVA logs
      • /inspvax (novatel_gps_msgs/Inspvax): INSPVAX logs
      • /insstdev (novatel_gps_msgs/Insstdev): INSSTDEV logs
      • /psrdop2 (novatel_gps_msgs/Psrdop2): PSRDOP2 logs
      • /range (novatel_gps_msgs/Range): RANGE logs
      • /rosout (rosgraph_msgs/Log): Console output
      • /time (novatel_gps_msgs/Time): TIME logs
      • /trackstat (novatel_gps_msgs/Trackstat): TRACKSTAT logs

Adding New Logs

Do you need support for a new log type? Follow these steps:

  1. Find the log reference in the official documentation.
  2. Add a new .msg file to the novatel_gps_msgs package.
  3. Add a new class in the novatel_gps_driver package that extends the novatel_gps_driver::MessageParser class that can parse the log and return the appropriate ROS message.
    1. Note that most MessageParsers produce UniquePtrs to messages because this is more efficient for intraprocess communications. Some MessageParsers have to produce SharedPtrs because multiple references to their messages are kept for synchronization or other purposes. Choose the appropriate pointer type based on your needs and look at other messages as examples.
  4. Modify the novatel_gps_driver::NovatelGps class:
    1. Add an instance of your parser, a buffer for storing parsed messages, and a method for retrieving them.
    2. Modify the NovatelGps::ParseBinaryMessage, NovatelGps::ParseNovatelSentence, or NovatelGps::ParseNmeaSentence methods to use your parser to parse the new message type and store it in the appropriate buffer.
  5. Modify the novatel_gps_driver::NovatelGpsNodelet class:
    1. Add a configuration parameter to enable the new message type.
    2. Add a publisher for publishing it.
    3. Modify NovatelGpsNodelet::CheckDeviceForData to retrieve messages from the appropriate buffer and publish them.
  6. Add a new unit test to novatel_gps_driver/tests/parser_tests.cpp to test your parser.

novatel_gps_driver's People

Contributors

aoyandong avatar danthony06 avatar devrite avatar ellon avatar icolwell-as avatar jgassaway avatar jwhitleywork avatar kettenhoax avatar ksuszka avatar matt-attack avatar nick-alton avatar pjreed avatar rgunjala-as avatar sagniknitr avatar sharvil-patankar avatar siqb avatar smiffe avatar zoakesastuff avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

novatel_gps_driver's Issues

Foxy Release

I have verified that the dashing-devel branch of this repo builds without error (or even warning) on Foxy. Could we please get a Foxy release of this driver and messages?

Does the driver take into account that the SPAN frame is different from the ROS frame?

The default SPAN frame of reference for Novatel is X to the right, Y forward, Z up. The default ROS frame is X forward, Y to the left, Z up. You can send VEHICLEBODYROTATION and APPLYVEHICLEBODYROTATION commands to the unit to correct for this (90 degrees about Z) but this isn't set by default. Does the driver take any of this into account?

gps_common::GPSStatus::STATUS_FIX

Hi,In this novatel_gps_driver,I doubt that both the "gps" and "fix" topic published do not show the status information correctly,
In the file novatel_message_extractor.cpp, the status is assigned a value
gps_fix->status.status = gps_common::GPSStatus::STATUS_FIX;
should it be changed with the gpgga infomation?

imu_rate vs imu_sample_rate

What is the proper usage of the imu_rate and imu_sample_rate variables?
imu_sample_rate changes the hardware configuration, so I would expect imu_rate to be the reporting rate of the ROS driver. However, if I set imu_rate to 50 and imu_sample_rate to 100 the reported values seem to double from what is reported when both parameters are equal. For exampl if the parameters are (100,100) I might get a yaw rate of 1.0 but if the parameters are (50, 100) I get a yaw rate of 2.0. Is this expected behavior?

I am using a Novatel PwrPak7 with SPAN configuration with STIM300 Imu

Driver unlogs all set logs (even the ones it doesn't set by itself)

To receive RTK corrections I set up my Novatel unit to send data to the NCOM1 port using (LOG NCOM1 GPGGA ONTIME 5). However, when I start the novatel_gps node it removes this log (and so my RTK corrections are not send anymore.

This happens because in the Configure() method (see novatel_gps.cpp) the UNLOGALL command is performed. This clears all logs. Obviously, this is not what you want to do as it would remove all logs. I found out that I can set the HOLD parameter for a LOG command to prevent it from being removed by UNLOGALL. However, this is more like a temporary fix than a permanent one, as using UNLOGALL is too evasive in my opinion.

Please fix?

Add support for Epson G370

There is a new type of internal IMU for PwrPak 7 with the a code of "61".
Add support for this new IMU.

I don't seem to be able to assign this issue to myself.

Cmake linking fail on boost

Received error message on end of build:
[100%] Built target driver_nodelet
/home/username/catkin_ws/devel/lib/libnovatel_gps_driver_nodelets.so: undefined reference to `boost::this_thread::hidden::sleep_until(timespec const&)'
collect2: error: ld returned 1 exit status
make[2]: *** [/home/username/catkin_ws/devel/lib/novatel_gps_driver/novatel_gps_node] Error 1
make[1]: *** [novatel_gps_driver/CMakeFiles/novatel_gps_node.dir/all] Error 2
make: *** [all] Error 2
Invoking "make -j8 -l8" failed

Launching the tester_for_usb.launch file anyway produces:
/opt/ros/indigo/lib/nodelet/nodelet: symbol lookup error: /home/username/catkin_ws/devel/lib//libnovatel_gps_driver_nodelets.so: undefined symbol: _ZN5boost11this_thread6hidden11sleep_untilERK8timespec
[novatel-2] process has died [pid 8269, exit code 127, cmd /opt/ros/indigo/lib/nodelet/nodelet standalone novatel_gps_driver/novatel_gps_nodelet __name:=novatel __log:=/home/username/.ros/log/9e76f88a-eef3-11e7-a5d3-2816adc98231/novatel-2.log].

novatel_gps_msgs not built before novatel_gps_driver

When trying to build this package as part of a larger workspace using catkin_make, I got the following error repeatedly.

In file included from /opt/carma/src/CARMANovatelGpsDriver/novatel_gps_driver/src/novatel_gps.cpp:35:0:
/opt/carma/src/CARMANovatelGpsDriver/novatel_gps_driver/include/novatel_gps_driver/novatel_gps.h:47:36: fatal error: novatel_gps_msgs/Gpgga.h: No such file or directory
compilation terminated.
CARMANovatelGpsDriver/novatel_gps_driver/CMakeFiles/novatel_gps_driver.dir/build.make:62: recipe for target 'CARMANovatelGpsDriver/novatel_gps_driver/CMakeFiles/novatel_gps_driver.dir/src/novatel_gps.cpp.o' failed
make[2]: *** [CARMANovatelGpsDriver/novatel_gps_driver/CMakeFiles/novatel_gps_driver.dir/src/novatel_gps.cpp.o] Error 1
CMakeFiles/Makefile2:22174: recipe for target 'CARMANovatelGpsDriver/novatel_gps_driver/CMakeFiles/novatel_gps_driver.dir/all' failed
make[1]: *** [CARMANovatelGpsDriver/novatel_gps_driver/CMakeFiles/novatel_gps_driver.dir/all] Error 2
make[1]: *** Waiting for unfinished jobs....

This suggests to me that the novatel_gps_msgs package was not built before the novatel_gps_driver. I found that if I built the novatel_gps_msgs package on its own first, then the novatel_gps_driver would build without issue.

My development environment is Ubuntu 16.04, ROS Kinetic, cmake 3.5.1, gcc 5.4.0, Python 2.7.12 and Python 3.5.2

boost::thread sleep not working

I update my ros driver, after that this driver not publishing any ros topics!
Then, I figure out that while loop in Spin() function execute only first time.
So I change the code:

(+) ros::Rate loop_rate(1000);

while(gps_.IsConnected() && ros::ok()) {
(-) boost::this_thread::sleep(boost::posix_time::microseconds(1));
(+) loop_rate.sleep();
}

Then it finally publish the topics again!
Please fix this errors.

Inconsistent Get methods in the nodelet

Why are some get methods called without any if in front of it:
gps_.GetGpggaMessages(gpgga_msgs); gps_.GetGprmcMessages(gprmc_msgs); gps_.GetNovatelPositions(position_msgs); gps_.GetNovatelXYZPositions(xyz_position_msgs); gps_.GetNovatelUtmPositions(utm_msgs); gps_.GetFixMessages(fix_msgs); gps_.GetNovatelHeading2Messages(heading2_msgs); gps_.GetNovatelDualAntennaHeadingMessages(dual_antenna_heading_msgs);

while others are called within an if statement:
`if (publish_imu_messages_)
{
std::vector<novatel_gps_msgs::NovatelCorrectedImuDataPtr> novatel_imu_msgs;
gps_.GetNovatelCorrectedImuData(novatel_imu_msgs);
for (const auto& msg : novatel_imu_msgs)
{
msg->header.stamp += sync_offset;
msg->header.frame_id = imu_frame_id_;
novatel_imu_pub_.publish(msg);
}

    std::vector<sensor_msgs::ImuPtr> imu_msgs;
    gps_.GetImuMessages(imu_msgs);
    for (const auto& msg : imu_msgs)
    {
      msg->header.stamp += sync_offset;
      msg->header.frame_id = imu_frame_id_;
      imu_pub_.publish(msg);
    }

    std::vector<novatel_gps_msgs::InscovPtr> inscov_msgs;
    gps_.GetInscovMessages(inscov_msgs);
    for (const auto& msg : inscov_msgs)
    {
      msg->header.stamp += sync_offset;
      msg->header.frame_id = imu_frame_id_;
      inscov_pub_.publish(msg);
    }

    std::vector<novatel_gps_msgs::InspvaPtr> inspva_msgs;
    gps_.GetInspvaMessages(inspva_msgs);
    for (const auto& msg : inspva_msgs)
    {
      msg->header.stamp += sync_offset;
      msg->header.frame_id = imu_frame_id_;
      inspva_pub_.publish(msg);
    }

`
I am trying to add a new Get method but I don't know where to call it. I first thought that the defaults are loaded without the if condition but UTM is not the default and those messages are called without any if conditions.
Thanks

A question about NovAtel INSPVA message to RPY

Trying about parser NovAtel INSPVA message to roll pitch yaw.
According to https://docs.novatel.com/OEM7/Content/SPAN_Logs/INSPVA.htm, the azimuth is left-hand rotation so that it add should negative symbol. My question is both roll and pitch are right-hand rotation, why pitch needs to add negative as -(inspva->pitch) * DEGREES_TO_RADIANS?

Thanks a lot!
image

imu->orientation = tf::createQuaternionMsgFromRollPitchYaw(inspva->roll * DEGREES_TO_RADIANS,

     imu->orientation = tf::createQuaternionMsgFromRollPitchYaw(inspva->roll * DEGREES_TO_RADIANS,
                                              -(inspva->pitch) * DEGREES_TO_RADIANS,
                                              -(inspva->azimuth) * DEGREES_TO_RADIANS);

Is this package available for GNSS not only GPS?

Hi guys, I am working on a project and my GNSS receiver module somehow was only able to show Glonass NMEA Message. This makes me unable to use the package because it requested for NMEA Message from GPS. Do I need to change something in the launch file or is there something I can do with my GNSS receiver? I am using U-Blox F9P. Thanks in advance

Gps Nmea frequency

I want to configure Gprmc to be the only nmea sent ,and I want it to have frequency of 1 Hz , in order to connect it to a lidar for time synchronisation, any help?

dashing-devel error, GPGGA, GPRMC

I really appreciate your effort!

I am trying to use ros2 and novatel pwrpak7, and I got some errors and warning.
To enhance this work, I'm reporting this error.

Later, I will use more and I can share the more result!

Thanks!

[component_container-2] [WARN] [novatel_gps]: For sentence: [GPGGA,,,,,,0,,,,,,,,]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPRMC,,V,,,,,,,,,,N]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPGGA,,,,,,0,,,,,,,,]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPRMC,,V,,,,,,,,,,N]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPGGA,,,,,,0,,,,,,,,]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: 
GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPRMC,,V,,,,,,,,,,N]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: Error parsing GPRMC message.
[component_container-2] [WARN] [novatel_gps]: GPGGA log was invalid.
[component_container-2] [WARN] [novatel_gps]: For sentence: [GPGGA,,,,,,0,,,,,,,,]
[component_container-2] [ERROR] [novatel_gps]: Error reading from device <serial:/dev/ttyUSB1>: GPGGA log was invalid.

Support for INSWHEELUPDATE, SETWHEELPARAMETERS, and WHEELVELOCITY

This is related to #12. The INSWHEELUPDATE and SETWHEELPARAMETERS messages must be sent to the receiver in order to support injecting wheel velocity information into the SPAN solution. This is super useful for reducing drift while without a GPS signal. Once these are set, the WHEELVELOCITY message can be published to provide the cumulative number of ticks that have passed.

sensor_msgs/Imu pre-transformed

I have noticed that the orientation in the sensor_msgs/Imu output is being negated and the roll/pitch values are not being used to match the INSPVA log definition.

      imu->orientation = tf::createQuaternionMsgFromRollPitchYaw(inspva->roll * DEGREES_TO_RADIANS,
                                              -(inspva->pitch) * DEGREES_TO_RADIANS,
                                              -(inspva->azimuth) * DEGREES_TO_RADIANS);

In the above code snippet from novatel_gps.cpp you can see that the pitch and azimuth values are negated. Additionally, in the tf library roll corresponds to rotation around the x axis while pitch corresponds to rotation around the y axis. However in the INSPVA doc you can see that the roll is actually coming from the vehicle frame Y-axis and the pitch is coming from the vehicle frame X-axis.

It seems like this code might be trying to make the imu match the ROS convention of X being forward and Y being to the right, but I'm not sure how the -Z value is coming into play. Could someone elaborate on the motivation here?

Queue overflow problem

Hello everyone I have a problem with this novatel driver. It seems that it randomly doesn't start properly and doesn't publish IMU data Here are the errors I get 👍

Node: /gps/novatel
Time: 14:19:50.038780807 (2020-10-02)
Severity: Warn
Published Topics: /gps/bestpos, /gps/bestvel, /gps/corrimudata, /gps/dual_antenna_heading, /gps/fix, /gps/gpgga, /gps/gprmc, /gps/gps, /gps/heading2, /gps/imu, /gps/inscov, /gps/inspva, /gps/inspvax, /gps/insstdev, /rosout, /unprocessed_diagnostics

INSPVA queue overflow.

Location:
/tmp/binarydeb/ros-melodic-novatel-gps-driver-3.9.0/src/novatel_gps.cpp:NovatelGps::ReadResult novatel_gps_driver::NovatelGps::ParseBinaryMessage:1122
Node: /gps/novatel
Time: 14:19:50.026237548 (2020-10-02)
Severity: Warn
Published Topics: /gps/bestpos, /gps/bestvel, /gps/corrimudata, /gps/dual_antenna_heading, /gps/fix, /gps/gpgga, /gps/gprmc, /gps/gps, /gps/heading2, /gps/imu, /gps/inscov, /gps/inspva, /gps/inspvax, /gps/insstdev, /rosout, /unprocessed_diagnostics

CORRIMUDATA queue overflow.

Location:
/tmp/binarydeb/ros-melodic-novatel-gps-driver-3.9.0/src/novatel_gps.cpp:NovatelGps::ReadResult novatel_gps_driver::NovatelGps::ParseBinaryMessage:1100

I dont understand what would cause this problem, when I just restart the driver it works fine. Also what is the purpose of MAX_BUFFER_SIZE and why does reaching it prevents to send data to the IMU topic ?

Thanks a lot for your help !

DualAntennaHeading and Heading2 are not published (again)

I have the latest version of novatel_gps_driver (Latest commit 3005b80 on Dec 5, 2019) compiled from source. I am running it on ROS Kinetic on Ubuntu 16.04. I have the Novatel PwrPak7D with Dual Antennas.
When I run the node, no information is being published to the DualAntennaHeading topic even though the DualAntennaHeading topic is listed. At the same moment, the log DUALANTENNAHEADINGA contains the right information with a heading value.

I use the lunch file:

<?xml version="1.0"?>
<launch>
  <node name="novatel"
        pkg="nodelet" type="nodelet"
        args="standalone novatel_gps_driver/novatel_gps_nodelet">
    <rosparam>
      verbose: false
      connection_type: tcp
      device: 192.168.100.221:2000
      use_binary_messages: false
      publish_novatel_dual_antenna_heading: true
      frame_id: /gps
    </rosparam>
  </node>
</launch>

I know there was similar issues in the past:

  • Heading2 not being published #53
  • Fix for publishing Heading2 and DualAntennaHeading information #57

It seems it still doesn't work.

INSSTDEV and INSCOV frequency

I noticed that the frequency for INSSTDEV and INSCOV was hardcoded to 1 in the source code. Is there a reason for this instead just making them the same frequency as the polling frequency?

How does the `novatel_gps_node.cpp` source file generate?

There is no main function in any source file in the directory novatel_gps_driver/src/ , but when I build it with catkin_make, a main function source file named novatel_gps_node.cpp generates in the build/novatel_gps_driver/ directory, so does the corresponding executable novatel_gps_node. I wonder where does the file novatel_gps_node.cpp come from. Thank you!

Ability to send configuration commands to Novatel

Existing release translates the rosparams to various logs in NovatelGps::Configure. There is no way to send configuration messages to Novatel. (e.g. connectimu, setimuorientation etc.)
It would be great if this driver could support functionality to set configuration that is not log + x + ontime + y

Novatel RTCM3 Correction Support

Hello,

Is RTCM3 supported by the driver ?

I have a related question related to Novatel IGM SPAN A1
I am trying to get the driver working on a nvidia's machine. The problem is, when I connect novatel IG to the machine via USB (USB Cable ) , virtual ports are not detected. So I try to configure User Port by connecting it to the machine via serial adapter.
The configuration contains the followings

   log thisport gpgga ontime 0.05
   log thisport gprmc ontime 0.05
   log thisport bestposa ontime 0.05
   interfacemode thisport RTCMV3 novatel

then I run tester_for_usb.launch file, I keep getting warning regarding to frequecny, Expected one is: 20 hz, I get around 2~3 Hz and also correction code messes up the parser, How can I fix this ?

Best Regards

Add service to send FRESET

A client observed:

We found during some testing in May that on occasion the NovAtel was misbehaving (only tracking a few of the available GPS satellite signals for example) and we needed to send a FRESET command to the NovAtel to clear its ephem/almanac (ie FRESET GPSEPHEM and FRESET GPSALMANAC).

A possible solution to this would be to add a ROS service to send an FRESET. Maybe it would make sense to have a service to send arbitrary commands?

How to get bestpos and bestvel from ttyUSB0

After building from instructions using catkin I used $ roslaunch /home/andrew/novatel/src/novatel_gps_driver/novatel_gps_driver/launch/tester_for_usb.launch to launch the unedited launch file. The error I received back was Failed to load nodelet [/novatel] of type [novatel_gps_driver/novatel_gps_nodelet] with further details attached.
error.txt Can I get some guidance on how to change the tester_for_usb.launch file?
tester_for_usb.txt

No doubt you realize I'm a noob and the training I'm taking at robotignite academy so far has had fairly simple launch files and the packages and folder structure are dissimilar to yours. My goal at the moment is simply to get the binary format coming into USB0 into ROS so I can echo out the results of BESTPOSB and BESTVELB. The reason I used the roslaunch command the way I did is because I could not get the 2-3 different source commands I tried to let me follow the typical structure of roslaunch (package) (launch file). Thanks for your help and appreciate that you guys have provided the driver.

Edit: I needed to run $ sudo apt install ros-kinetic-novatel-gps-driver before the catkin build process. Although I'm still not clear which source command to run I am able to use the full path and have the rostopic /bestpos echo results in another terminal.

insufficient data rate <Novatel GPS (/dev/ttyUSB0)>: 0.000000 < 5.000000

Hi ,I am using an OEM718D device that was running at 5 Hz and I have set the expected_rate_(5). When I use the Serial debugging assistant(cutecom),the data is successfully read, however when I use this novatel_gps_driver package, no data is obtained through the commond ---roslaunch novatel_gps_driver tester_for_usb.launch ,and the error is :[ERROR] [1560927037.977802740]: insufficient data rate <Novatel GPS (/dev/ttyUSB0)>: 0.000000 < 5.000000
Is this package not support novatel 718D? or anything is wrong ? have you got the same problem with me?

Nothing published on rostopics

Hi!
I'm using Flexpak6 device and I noticed that's not supporting "RAWIMUX" command. Anyway ROS starting without any errors, warnings or infos. There are available rostopics, but nothing is published. I checked serial communication and all frames are going trough.

Is that missing command responsible for this situation?

Parsing GPGSV logs with 0 satellites fails

I tried both serial and pcap connection types in my following launch file:

<?xml version="1.0"?>
<launch>
  <node name="novatel"
        pkg="nodelet" type="nodelet"
        args="standalone novatel_gps_driver/novatel_gps_nodelet">
    <rosparam>
      verbose: false
      <!--connection_type: pcap
      device: /home/xenial/catkin_ws/src/novatel/Highway.pcap-->
      connection_type: serial
      device: /dev/ttyUSB0      
      publish_novatel_positions: true
      publish_clocksteering: true
      publish_imu_messages: true
      publish_nmea_messages: true
      publish_novatel_utm_positions: true
      publish_novatel_xyz_positions: true
      publish_novatel_heading2: true
      publish_novatel_velocity: true
      publish_range_messages: true
      publish_time_messages: true
      frame_id: /gps
      imu_frame_id: /imu
    </rosparam>
  </node>
</launch>

But I get the following error for serial with all three /dev/ttyUSB0 , /dev/ttyUSB1 , /dev/ttyUSB2:

[ERROR] [1575570561.170998323]: Error reading from device <serial:/dev/ttyUSB0>: Expected GPGSV length = 20 for message with 4 satellites, actual length = 8
GPGSV,1,1,00,,,,

and the following error for pcap:

[ERROR] [1575570352.028343228]: Error reading from device <pcap:/home/xenial/catkin_ws/src/novatel/Highway.pcap>: Parse failure extracting sentences.

Is there anything I am missing in my setup?

Device: pwrpack7
PC: ubuntu 16.04

Cheers,

Insufficient data rate is logged for GPS rates lower than 20 Hz

A user reported seeing this message logged when using an OEM718D device that was running at 5 Hz. Looking at the code, I suspect that this warning will be logged any time GPS messages are received at a rate of less than 20 Hz, even if the polling_period is configured differently.

Heading2 not being published

I have the latest version of novatel_gps_driver compiled from source. I am running it on ROS Kinetic on Ubuntu 16.04. I have the Novatel PwrPak7D with Dual Antennas.

When I run the node, no information is being published to the heading2 topic even though the heading2 topic is listed. I have edited the launch file to publish the heading2 information. When I look at the Novatel Connect software, I can see the Align status and get the heading information.

Also the other information like the UTM and bestpos topics are being published. But there aren't any messages being published to the heading2 or the dual_antenna topics.

Corrimudata publishes zero values in yaw rate

Has anyone else noticed these random looking zero values being published in the Corrimudata message? I haven't had a chance to look directly at the Novatel message, so am not sure if this is how it is being published by Novatel device or it is something in the driver.

yaw

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.