@@ -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+
3143class 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