Skip to content

Commit 504bd51

Browse files
committed
Merge pull request #21 from ethz-asl/feature/reset-gps-ref-service
Feature/reset gps ref service
2 parents 81580a3 + a211d23 commit 504bd51

File tree

3 files changed

+52
-35
lines changed

3 files changed

+52
-35
lines changed

CMakeLists.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ cs_add_executable(set_gps_reference_node src/set_gps_reference_node.cpp)
1313
target_link_libraries(set_gps_reference_node ${catkin_LIBRARIES})
1414

1515
cs_add_executable(gps_to_pose_conversion_node src/gps_to_pose_conversion_node.cpp)
16-
target_link_libraries(gps_to_pose_conversion_node ${catkin_LIBRARIES})
16+
#target_link_libraries(gps_to_pose_conversion_node ${catkin_LIBRARIES})
1717

1818
cs_install()
19-
cs_install_scripts(src/gps_spoofer.py src/euler_radians_to_degrees.py src/odometry_height_adjuster.py)
19+
cs_install_scripts(src/gps_spoofer.py src/euler_radians_to_degrees.py)
2020
cs_export()

package.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@
2222
<depend>geometry_msgs</depend>
2323
<!--cmake_modules dependency required for (find Eigen) command-->
2424
<depend>cmake_modules</depend>
25+
<!--std_srvs provides the Empty service used to reset the gps reference ]-->
26+
<depend>std_srvs</depend>
2527
</package>

src/set_gps_reference_node.cpp

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22
#include <sensor_msgs/NavSatFix.h>
33
#include <string>
44
#include <vector>
5+
#include <std_srvs/Empty.h>
56

67
double g_lat_ref;
78
double g_lon_ref;
89
double g_alt_ref;
9-
10-
std::vector<double> g_pressure_heights;
10+
int g_count = 1;
11+
bool gps_ref_is_init;
1112
int g_its;
1213

1314
enum EMode
@@ -18,49 +19,62 @@ enum EMode
1819
// average over, or wait for, n GPS fixes
1920
EMode g_mode;
2021

22+
bool reset_callback(std_srvs::Empty::Request&, std_srvs::Empty::Response&)
23+
{
24+
g_count = 1;
25+
g_lat_ref = 0.0;
26+
g_lon_ref = 0.0;
27+
g_alt_ref = 0.0;
28+
ros::NodeHandle nh;
29+
nh.setParam("/gps_ref_is_init", false);
30+
return true;
31+
}
2132

2233
void gps_callback(const sensor_msgs::NavSatFixConstPtr & msg)
2334
{
35+
ros::NodeHandle nh;
36+
nh.getParam("/gps_ref_is_init", gps_ref_is_init);
2437

25-
static int count = 1;
38+
if (!gps_ref_is_init){
2639

27-
if (msg->status.status < sensor_msgs::NavSatStatus::STATUS_FIX) {
28-
ROS_WARN_STREAM_THROTTLE(1, "No GPS fix");
29-
return;
30-
}
3140

32-
g_lat_ref += msg->latitude;
33-
g_lon_ref += msg->longitude;
34-
g_alt_ref += msg->altitude;
41+
if (msg->status.status < sensor_msgs::NavSatStatus::STATUS_FIX) {
42+
ROS_WARN_STREAM_THROTTLE(1, "No GPS fix");
43+
return;
44+
}
3545

36-
ROS_INFO("Current measurement: %f, %f, %f", msg->latitude, msg->longitude, msg->altitude);
46+
g_lat_ref += msg->latitude;
47+
g_lon_ref += msg->longitude;
48+
g_alt_ref += msg->altitude;
3749

38-
if (count == g_its) {
39-
if (g_mode == MODE_AVERAGE) {
40-
g_lat_ref /= g_its;
41-
g_lon_ref /= g_its;
42-
g_alt_ref /= g_its;
43-
} else {
44-
g_lat_ref = msg->latitude;
45-
g_lon_ref = msg->longitude;
46-
g_alt_ref = msg->altitude;
47-
}
50+
ROS_INFO("Current measurement: %f, %f, %f", msg->latitude, msg->longitude, msg->altitude);
4851

49-
ros::NodeHandle nh;
50-
nh.setParam("/gps_ref_latitude", g_lat_ref);
51-
nh.setParam("/gps_ref_longitude", g_lon_ref);
52-
nh.setParam("/gps_ref_altitude", g_alt_ref);
53-
nh.setParam("/gps_ref_is_init", true);
52+
if (g_count == g_its) {
53+
if (g_mode == MODE_AVERAGE) {
54+
g_lat_ref /= g_its;
55+
g_lon_ref /= g_its;
56+
g_alt_ref /= g_its;
57+
} else {
58+
g_lat_ref = msg->latitude;
59+
g_lon_ref = msg->longitude;
60+
g_alt_ref = msg->altitude;
61+
}
5462

55-
ROS_INFO("Final reference position: %f, %f, %f", g_lat_ref, g_lon_ref, g_alt_ref);
5663

57-
ros::shutdown();
58-
return;
59-
} else {
60-
ROS_INFO(" Still waiting for %d measurements", g_its - count);
61-
}
64+
nh.setParam("/gps_ref_latitude", g_lat_ref);
65+
nh.setParam("/gps_ref_longitude", g_lon_ref);
66+
nh.setParam("/gps_ref_altitude", g_alt_ref);
67+
nh.setParam("/gps_ref_is_init", true);
68+
69+
ROS_INFO("Final reference position: %f, %f, %f", g_lat_ref, g_lon_ref, g_alt_ref);
6270

63-
count++;
71+
return;
72+
} else {
73+
ROS_INFO(" Still waiting for %d measurements", g_its - g_count);
74+
}
75+
76+
g_count++;
77+
}
6478
}
6579

6680
int main(int argc, char** argv)
@@ -101,6 +115,7 @@ int main(int argc, char** argv)
101115
(g_mode == MODE_AVERAGE) ? "averaging to get the reference" : "taking the last as reference");
102116

103117
ros::Subscriber gps_sub = nh.subscribe("gps", 1, &gps_callback);
118+
ros::ServiceServer reset_srv = nh.advertiseService("reset_gps_reference", &reset_callback);
104119

105120
ros::spin();
106121
}

0 commit comments

Comments
 (0)