Skip to content

Commit efd2d64

Browse files
authored
Merge pull request #25 from KumarRobotics/feature/dgps
DGPS Integration
2 parents 4b17a02 + 926b78e commit efd2d64

File tree

14 files changed

+158
-5
lines changed

14 files changed

+158
-5
lines changed

glider/CMakeLists.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,8 @@ if (BUILD_ROS)
4343
find_package(sensor_msgs REQUIRED)
4444
find_package(std_msgs REQUIRED)
4545
find_package(nav_msgs REQUIRED)
46-
46+
find_package(gps_msgs REQUIRED)
47+
4748
set(node_plugins "")
4849
endif()
4950
# Include directories
@@ -95,6 +96,7 @@ if (BUILD_ROS)
9596
sensor_msgs
9697
geometry_msgs
9798
nav_msgs
99+
gps_msgs
98100
)
99101

100102
add_executable(${PROJECT_NAME}_node

glider/config/glider-params.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ imu:
99
frame: "enu"
1010
gps:
1111
covariance: 2.0
12-
dgpsfm:
12+
dgps:
1313
enable: true
14+
covariance: 0.03
15+
dgpsfm:
16+
enable: false
1417
integration_threshold: 1.0
1518
covariance: 0.03
1619
constants:

glider/config/ros-params.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ glider_node:
55
nav_sat_fix: false
66
viz:
77
use: true
8-
origin_easting: 482933.2819920078
9-
origin_northing: 4421345.135559781
8+
origin_easting: 753912.0063845584
9+
origin_northing: 3385461.6073698294
1010
subscribers:
1111
use_odom: false

glider/include/glider/core/glider.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class Glider
3636
* frame does not matter */
3737
void addGps(int64_t timestamp, Eigen::Vector3d& gps);
3838
void addGpsWithHeading(int64_t timestamp, Eigen::Vector3d& gps);
39+
void addGpsWithHeading(int64_t timestamp, Eigen::Vector3d& gps, Eigen::Vector2d& heading);
3940
/*! @brief converts the imu measurements into the ENU frame if
4041
* they are not in that frame already.
4142
* @param timestamp: time the imu measurement was taken

glider/include/glider/utils/parameters.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ struct Parameters
8181
// @brief heading noise for differential gps from motion
8282
double dgpsfm_cov;
8383

84+
bool use_dgps;
85+
double dgps_cov;
86+
8487
// @brief translation from the GPS to the IMU
8588
Eigen::Vector3d t_imu_gps;
8689
};

glider/include/ros/conversions.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
*
55
* Header file for ros to eigen conversions
66
*/
7+
#pragma once
78

9+
#include <utility>
810
#include <chrono>
911
#include <geometry_msgs/msg/quaternion.hpp>
1012
#include <geometry_msgs/msg/vector3.hpp>
@@ -14,6 +16,7 @@
1416
#include <sensor_msgs/point_cloud2_iterator.hpp>
1517
#include <nav_msgs/msg/odometry.hpp>
1618
#include <std_msgs/msg/header.hpp>
19+
#include <gps_msgs/msg/gps_fix.hpp>
1720
#include <builtin_interfaces/msg/time.hpp>
1821
#include <Eigen/Dense>
1922

@@ -52,6 +55,7 @@ class Conversions
5255
static Eigen::Vector4d orientConvert(const geometry_msgs::msg::Quaternion& orient);
5356

5457
static Eigen::Vector3d gpsConvert(const sensor_msgs::msg::NavSatFix& gps);
58+
static std::pair<Eigen::Vector3d, Eigen::Vector2d> dgpsConvert(const gps_msgs::msg::GPSFix& gps);
5559
static Eigen::Isometry3d poseConvert(const geometry_msgs::msg::PoseStamped& msg);
5660
static Eigen::Isometry3d odomConvert(const nav_msgs::msg::Odometry& msg);
5761
};

glider/include/ros/glider_node.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include <sensor_msgs/msg/magnetic_field.hpp>
1515
#include <sensor_msgs/msg/imu.hpp>
1616
#include <geometry_msgs/msg/pose_stamped.hpp>
17+
#include <gps_msgs/msg/gps_fix.hpp>
1718

1819
#include "glider/core/glider.hpp"
1920
#include "glider/core/odometry.hpp"
@@ -36,6 +37,7 @@ class GliderNode : public rclcpp::Node
3637
void interpolationCallback();
3738

3839
// subscriber callbacks
40+
void dgpsCallback(const gps_msgs::msg::GPSFix::ConstSharedPtr msg);
3941
void gpsCallback(const sensor_msgs::msg::NavSatFix::ConstSharedPtr msg);
4042
void imuCallback(const sensor_msgs::msg::Imu::ConstSharedPtr msg);
4143
void magCallback(const sensor_msgs::msg::MagneticField::ConstSharedPtr msg);
@@ -51,6 +53,7 @@ class GliderNode : public rclcpp::Node
5153
void publishOdometryViz(nav_msgs::msg::Odometry viz_msg) const;
5254

5355
// subscriptions
56+
rclcpp::Subscription<gps_msgs::msg::GPSFix>::ConstSharedPtr dgps_sub_;
5457
rclcpp::Subscription<sensor_msgs::msg::NavSatFix>::ConstSharedPtr gps_sub_;
5558
rclcpp::Subscription<sensor_msgs::msg::Imu>::ConstSharedPtr imu_sub_;
5659
rclcpp::Subscription<sensor_msgs::msg::MagneticField>::ConstSharedPtr mag_sub_;

glider/launch/glider-node.launch.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ def generate_launch_description():
6262
'use_odom': False}
6363
],
6464
remappings=[
65-
('/gps', '/ublox_gps_node/fix'),
65+
('/dgps', '/dgps/fix'),
6666
('/imu', '/vectornav/imu'),
6767
('/odom', '/Odometry'),
6868
]

glider/package.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
<depend>std_msgs</depend>
1717
<depend>sensor_msgs</depend>
1818
<depend>nav_msgs</depend>
19+
<depend>gps_msgs</depend>
1920
<depend>tf2_eigen</depend>
2021
<depend>message_filters</depend>
2122

glider/ros/conversions.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ Output Conversions::rosToEigen(const Input& msg)
3232
{
3333
return RosToEigen::odomConvert(msg);
3434
}
35+
else if constexpr(std::is_same_v<Input, gps_msgs::msg::GPSFix>)
36+
{
37+
return RosToEigen::dgpsConvert(msg);
38+
}
3539
}
3640

3741
template<typename Output, typename Input>
@@ -92,6 +96,14 @@ Eigen::Vector3d Conversions::RosToEigen::gpsConvert(const sensor_msgs::msg::NavS
9296
return Eigen::Vector3d(msg.latitude, msg.longitude, msg.altitude);
9397
}
9498

99+
std::pair<Eigen::Vector3d, Eigen::Vector2d> Conversions::RosToEigen::dgpsConvert(const gps_msgs::msg::GPSFix& msg)
100+
{
101+
Eigen::Vector3d gps(msg.latitude, msg.longitude, msg.altitude);
102+
Eigen::Vector2d heading(msg.track, msg.err_track);
103+
104+
return std::make_pair(gps, heading);
105+
}
106+
95107
Eigen::Isometry3d Conversions::RosToEigen::odomConvert(const nav_msgs::msg::Odometry& msg)
96108
{
97109
Eigen::Quaterniond quat(msg.pose.pose.orientation.w, msg.pose.pose.orientation.x, msg.pose.pose.orientation.y, msg.pose.pose.orientation.z);
@@ -352,6 +364,7 @@ template Eigen::Vector3d Conversions::rosToEigen<Eigen::Vector3d>(const sensor_m
352364
template Eigen::Vector4d Conversions::rosToEigen<Eigen::Vector4d>(const geometry_msgs::msg::Quaternion& msg);
353365
template Eigen::Isometry3d Conversions::rosToEigen<Eigen::Isometry3d>(const geometry_msgs::msg::PoseStamped& msg);
354366
template Eigen::Isometry3d Conversions::rosToEigen<Eigen::Isometry3d>(const nav_msgs::msg::Odometry& msg);
367+
template std::pair<Eigen::Vector3d, Eigen::Vector2d> Conversions::rosToEigen<std::pair<Eigen::Vector3d, Eigen::Vector2d>>(const gps_msgs::msg::GPSFix& msg);
355368

356369
template geometry_msgs::msg::Vector3 Conversions::eigenToRos<geometry_msgs::msg::Vector3>(const Eigen::Vector3d& vec);
357370
template geometry_msgs::msg::Quaternion Conversions::eigenToRos<geometry_msgs::msg::Quaternion>(const Eigen::Vector4d& vec);

0 commit comments

Comments
 (0)