Skip to content

Commit 597cc11

Browse files
committed
Tello change speed support extended to driver
1 parent 1fcbbbe commit 597cc11

File tree

1 file changed

+49
-10
lines changed

1 file changed

+49
-10
lines changed

tello_driver/src/tello_driver_node.py

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ def process_mask(mask):
2828
return 1991 # vx vy vz yaw_rate
2929

3030

31+
class TelloConstraints:
32+
MIN_SPEED = 10
33+
MAX_SPEED = 100
34+
35+
def constraint_speed(self, s):
36+
'''
37+
s: speed (cm/s)
38+
'''
39+
return self.MIN_SPEED if s < self.MIN_SPEED else self.MAX_SPEED if s > self.MAX_SPEED else s
40+
41+
42+
3143
class TelloConnectionError(Exception):
3244
pass
3345

@@ -42,6 +54,7 @@ class TelloDriver:
4254
STATE_ADDRESS = ('0.0.0.0', 8890)
4355
VIDEO_ADDRESS = ('0.0.0.0', 11111)
4456
LOCAL_ADDRESS = ('0.0.0.0', 9000)
57+
CONSTRAINTS = TelloConstraints()
4558

4659
def __init__(self, emergency_disabled=False):
4760
self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
@@ -65,6 +78,7 @@ def __init__(self, emergency_disabled=False):
6578
self.__vy = 0.0 # cm/s
6679
self.__vz = 0.0 # cm/s
6780
self.__yaw_rate = 0.0 # degrees/s
81+
self.__speed = 100.0 # cm/s (DEFAULT VALUE)
6882

6983
self.state_pub = rospy.Publisher('mavros/state', State, queue_size=10)
7084
self.ext_state_pub = rospy.Publisher('mavros/extended_state', ExtendedState, queue_size=10)
@@ -123,7 +137,7 @@ def __init__(self, emergency_disabled=False):
123137
def __still_alive(self, event):
124138
self.__send_cmd("battery?")
125139

126-
def __send_cmd(self, cmd, blocking=True, timeout=RESP_TIMEOUT):
140+
def __send_cmd(self, cmd, reading=False, blocking=True, timeout=RESP_TIMEOUT):
127141
print("Sending... {}".format(cmd)) # DEBUG
128142
self.sock.sendto(cmd.encode(encoding="utf-8"), self.CMD_ADDRESS)
129143

@@ -136,6 +150,8 @@ def __send_cmd(self, cmd, blocking=True, timeout=RESP_TIMEOUT):
136150
time.sleep(0.1) # waits a bit
137151

138152
resp = self.__responses.pop(0).decode("utf-8")
153+
if reading:
154+
return resp
139155
if resp.lower() == "ok":
140156
return True
141157
else:
@@ -221,12 +237,35 @@ def tello_land(self, req):
221237
else:
222238
return False, 1
223239

240+
def tello_change_speed(self, speed):
241+
'''speed in m/s'''
242+
speed = self.CONSTRAINTS.constraint_speed(speed*100) # to cm/s
243+
244+
if self.__send_cmd("speed {}".format(str(speed))):
245+
rospy.loginfo("Tello speed updated to " + str(speed))
246+
rospy.set_param("/tello/speed", speed)
247+
return True
248+
else:
249+
return False
250+
224251
def tello_param_set(self, req):
225252
# string param_id
226253
# mavros_msgs/ParamValue value
227254
# ----
228255
# bool success
229256
# mavros_msgs/ParamValue value
257+
258+
if req.param_id == "MPC_XY_VEL_MAX":
259+
if req.value.integer != 0:
260+
speed = req.value.integer
261+
elif req.value.real != 0.0:
262+
speed = req.value.real
263+
else:
264+
speed = 0
265+
266+
self.tello_change_speed(int(speed))
267+
return True, req.value
268+
230269
return False, ParamValue(integer=0, real=0.0)
231270

232271
def tello_param_get(self, req):
@@ -300,9 +339,9 @@ def setpoint_cb(self, msg):
300339
self.__x += target_x
301340

302341
if x > 0:
303-
self.__send_cmd("forward {}".format(abs(x)), False) # cm
342+
self.__send_cmd("forward {}".format(abs(x)), blocking=False) # cm
304343
elif x < 0:
305-
self.__send_cmd("back {}".format(abs(x)), False) # cm
344+
self.__send_cmd("back {}".format(abs(x)), blocking=False) # cm
306345
else:
307346
pass # already at target x
308347
# print("Already at target x")
@@ -318,9 +357,9 @@ def setpoint_cb(self, msg):
318357
cmd_right = "right" if is_frd else "left"
319358
cmd_left = "left" if is_frd else "right"
320359
if y > 0:
321-
self.__send_cmd(cmd_right + " {}".format(abs(y)), False) # cm
360+
self.__send_cmd(cmd_right + " {}".format(abs(y)), blocking=False) # cm
322361
elif y < 0:
323-
self.__send_cmd(cmd_left + " {}".format(abs(y)), False) # cm
362+
self.__send_cmd(cmd_left + " {}".format(abs(y)), blocking=False) # cm
324363
else:
325364
pass # already at target y
326365
# print("Already at target y")
@@ -336,9 +375,9 @@ def setpoint_cb(self, msg):
336375
cmd_down = "down" if is_frd else "up"
337376
cmd_up = "up" if is_frd else "down"
338377
if z > 0:
339-
self.__send_cmd(cmd_down + " {}".format(abs(z)), False) # cm
378+
self.__send_cmd(cmd_down + " {}".format(abs(z)), blocking=False) # cm
340379
elif z < 0:
341-
self.__send_cmd(cmd_up + " {}".format(abs(z)), False) # cm
380+
self.__send_cmd(cmd_up + " {}".format(abs(z)), blocking=False) # cm
342381
else:
343382
pass # already at target z
344383
# print("Already at target z")
@@ -385,9 +424,9 @@ def setpoint_cb(self, msg):
385424
self.__yaw += target_yaw
386425

387426
if yaw > 0:
388-
self.__send_cmd("cw {}".format(abs(yaw)), False) # degrees
427+
self.__send_cmd("cw {}".format(abs(yaw)), blocking=False) # degrees
389428
elif yaw < 0:
390-
self.__send_cmd("ccw {}".format(abs(yaw)), False) # degrees
429+
self.__send_cmd("ccw {}".format(abs(yaw)), blocking=False) # degrees
391430
else:
392431
pass # already at target yaw
393432
# print("Already at target yaw")
@@ -589,7 +628,7 @@ def shutdown(self):
589628
self.pub_timer.shutdown()
590629
self.tb_map_timer.shutdown()
591630
self.tb_base_timer.shutdown()
592-
if emergency_disabled:
631+
if self.__emergency_disabled:
593632
self.still_alive_timer.shutdown()
594633
except AttributeError:
595634
pass

0 commit comments

Comments
 (0)