Skip to content

Commit 1a15074

Browse files
author
Marija Popovic
committed
Merge pull request #22 from ethz-asl/feature/fredeluga_spoofer
Feature/fredeluga spoofer
2 parents 504bd51 + d94400d commit 1a15074

File tree

1 file changed

+21
-18
lines changed

1 file changed

+21
-18
lines changed

src/gps_spoofer.py

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,20 @@
99
from geometry_msgs.msg import PoseWithCovarianceStamped, PointStamped
1010
from std_msgs.msg import Float64
1111
import tf
12+
import sys
1213

1314
class GPSSpoofer:
1415
def __init__(self):
16+
# Parameters
17+
self.altitude_input = rospy.get_param('~altitude_input', 'vicon')
18+
self.publish_pose = rospy.get_param('~publish_pose', True)
19+
20+
# TODO: load params from param server
21+
self.max_R_noise = 0.0 # [m] max tested: 0.15
22+
self.pub_period = 0.1 # [s], publish disturbed pose every X s
23+
# self.pos_var = pow(max(0.0707, self.max_R_noise/2.0), 2)
24+
# self.pos_var = 0.005;
25+
1526
self.fix = NavSatFix()
1627
#self.fix.header.stamp = ...
1728
self.fix.header.frame_id = 'fcu'
@@ -22,17 +33,7 @@ def __init__(self):
2233
self.fix.altitude = 0.0
2334
# TODO: fill GPS covariance
2435

25-
self.altitude = Float64()
26-
27-
self.altitude_input = rospy.get_param('altitude_input', 'vicon')
28-
29-
# TODO: load params from param server
30-
self.max_R_noise = 0.0 # [m] max tested: 0.15
31-
self.pub_period = 0.2 # [s], publish disturbed pose every X s
32-
33-
# self.pos_var = pow(max(0.0707, self.max_R_noise/2.0), 2)
34-
# self.pos_var = 0.005;
35-
36+
self.latest_altitude_message = Float64()
3637
self.latest_imu_message = Imu()
3738

3839
self.pwc = PoseWithCovarianceStamped()
@@ -55,7 +56,7 @@ def __init__(self):
5556

5657
self.pub_spoofed_gps = rospy.Publisher('spoofed_gps', NavSatFix, queue_size=1)
5758
self.pub_disturbed_pose = rospy.Publisher('disturbed_pose', PoseWithCovarianceStamped, queue_size=1, tcp_nodelay=True)
58-
self.pub_point = rospy.Publisher('vicon_point', PointStamped, queue_size=1, tcp_nodelay=True)
59+
self.pub_point = rospy.Publisher('vicon_point', PointStamped, queue_size=1, tcp_nodelay=True)
5960

6061
self.sub_altitude = rospy.Subscriber('laser_altitude', Float64, self.callback_altitude, tcp_nodelay=True)
6162
self.sub_gps = rospy.Subscriber('gps', NavSatFix, self.callback_gps, tcp_nodelay=True)
@@ -79,7 +80,6 @@ def callback_odometry(self, data):
7980
y = data.pose.pose.position.y
8081

8182
# Angle between vi-con x axis and ENU East-aligned x axis
82-
#angle = radians(-7.0) #imu compass
8383
angle = -2.73
8484

8585
# Rotate x and y to align x to East
@@ -100,10 +100,11 @@ def callback_odometry(self, data):
100100
self.pwc.pose.pose.position.z = data.pose.pose.position.z
101101
self.point.point.z = data.pose.pose.position.z
102102
elif (self.altitude_input == 'external'):
103-
self.pwc.pose.pose.position.z = self.altitude.data
104-
self.point.point.z = self.altitude.data
103+
self.pwc.pose.pose.position.z = self.latest_altitude_message.data
104+
self.point.point.z = self.latest_altitude_message.data
105105
else:
106-
ROS_WARN("Unknown altitude input parameter")
106+
rospy.signal_shutdown("Unknown altitude input parameter")
107+
sys.exit()
107108

108109
if not self.got_odometry:
109110
print "GPSSpoofer: initializing timers"
@@ -115,7 +116,7 @@ def callback_imu(self, data):
115116
self.latest_imu_message = data
116117

117118
def callback_altitude(self, data):
118-
self.altitude = data
119+
self.latest_altitude_message = data
119120

120121
def sample_noise(self, event):
121122
#print "Resampling noise"
@@ -127,7 +128,9 @@ def publish_noisy_positions(self, event):
127128
#print "Publishing odometry"
128129
self.pwc.pose.pose.position.x += self.R_noise*cos(self.theta_noise)
129130
self.pwc.pose.pose.position.y += self.R_noise*sin(self.theta_noise)
130-
self.pub_disturbed_pose.publish(self.pwc)
131+
132+
if (self.publish_pose == True):
133+
self.pub_disturbed_pose.publish(self.pwc)
131134

132135
self.point.point.x += self.R_noise*cos(self.theta_noise)
133136
self.point.point.y += self.R_noise*sin(self.theta_noise)

0 commit comments

Comments
 (0)