diff options
| author | Florian Jung <flo@windfisch.org> | 2015-01-05 22:32:30 +0100 | 
|---|---|---|
| committer | Florian Jung <flo@windfisch.org> | 2015-01-05 22:32:30 +0100 | 
| commit | 5d3362ea961db44afdf5d2969ece85e03ed69a04 (patch) | |
| tree | 48cfa1c2c45fc21be1d2164ebeeb49d4ef1b798b | |
| parent | 32166e492b32affd8f79a11ec58cbdcd6e45cc21 (diff) | |
controls SHOULD work
| -rw-r--r-- | server.py | 149 | 
1 files changed, 130 insertions, 19 deletions
@@ -6,6 +6,10 @@ import socket  import sys  import threading  import time +import struct + +def putStatusText(img, text, pos, activated): +    cv2.putText(img, text, pos, cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255) if activated else (127,127,127), 2 if activated else 1)  def encode_int(i):      i = int(i) @@ -22,15 +26,22 @@ class ServerThread(threading.Thread):              try:                  print >>sys.stderr, 'connection from', client_address -                # Receive the data in small chunks and retransmit it                  while True:                      data = connection.recv(16)                      if data:                          if data=="get\n":                              lock.acquire() -                            framestr = frame.tostring() -                            lenframestr=len(framestr) -                            connection.sendall(encode_int(lenframestr)+framestr); +                            framestr = global_frame.tostring() +                            lenframestr=len(global_framestr) +                            connection.sendall(struct.pack(">i",lenframestr)+framestr+struct.pack("@dddd", global_phi, global_theta, global_psi, global_batt)); +                            lock.release() +                        elif data[0:3] == "fly" and data[-1]=="\n": +                            values = data[3:-1].split() +                            lock.acquire() +                            global_cmd_x = float(values[0]) +                            global_cmd_y = float(values[1]) +                            global_cmd_z = float(values[2]) +                            global_cmd_rot = float(values[3])                              lock.release()                      else:                          print >>sys.stderr, 'no more data from', client_address @@ -62,6 +73,7 @@ sock.bind(server_address)  # Listen for incoming connections  sock.listen(1) +no_flight = False  try:      pygame.init() @@ -70,7 +82,12 @@ try:      js.init()      js_angle_shift = 0.0  except: -    print "meeeeh" +    print "no joystick! disabling flight controls" +    no_flight = True + +manual_override_xy = True +manual_override_z = True +manual_override_rot = True  drone = libardrone.ARDrone(True, True) @@ -80,31 +97,125 @@ drone.reset()  serverthread=ServerThread()  lock=threading.Lock() -cap = cv2.VideoCapture("/home/flo/kruschkram/out2.avi") -status, frame = cap.read() -  writer = cv2.VideoWriter("flight.avi",cv2.VideoWriter_fourcc(*'MP42'),25,(1280,720),1)  logfile = open("flight.log", "w") - +global_phi = 0. +global_theta = 0. +global_psi = 0. +global_batt = 0. +global_frame =  None  serverthread.start()  while True: -    print "hello world :)" +    if no_flight == False: +        btn_leftshoulder =  js.get_button(4) or js.get_button(6) +        btn_rightshoulder = js.get_button(5) or js.get_button(7) +        btn_thumb = js.get_button(0) or js.get_button(1) or js.get_button(2) or js.get_button(3) +        btn_all = js.get_button(0) and js.get_button(1) and js.get_button(2) and js.get_button(3) +        btn_readjust = js.get_button(10) + +        if btn_thumb: +            drone.land() +            manual_override_xy = True +            manual_override_z = True +            manual_override_rot = True +        if btn_leftshoulder and btn_rightshoulder and js.get_button(10): +            drone.takeoff() +            manual_override_xy = True +            manual_override_z = True +            manual_override_rot = True +        if btn_all: +            drone.reset() +            manual_override_xy = True +            manual_override_z = True +            manual_override_rot = True +        if btn_readjust: +            js_angle_shift = drone.navdata.get(0, dict()).get('psi',0) + +        rel_angle = (drone.navdata.get(0, dict()).get('psi',0) - js_angle_shift)/180.*math.pi + +        js_x = js.get_axis(0) +        js_y = js.get_axis(1) +        js_z = -js.get_axis(4) +        js_rot = js.get_axis(3) +        js_radius =  math.sqrt(js_x**2 + js_y**2) +        if btn_leftshoulder==0: +            js_x, js_y =  ( js_x * cos(rel_angle) + js_y * sin(rel_angle) )   ,  ( -js_x * sin(rel_angle) + js_y * cos(rel_angle) ) +         +        js_hover = (btn_rightshoulder==0 and (js_radius <= 0.01)) + +        if (js_radius > OVERRIDE_THRESHOLD): manual_override_xy = True +        if (abs(js_z) > OVERRIDE_THRESHOLD): manual_override_z = True +        if (abs(js_rot) > OVERRIDE_THRESHOLD): manual_override_rot = True + +        if manual_override_xy: +            actual_hover, actual_x, actual_y = js_hover, js_x, js_y +        else: +            actual_hover, actual_x, actual_y = global_cmd_hover, global_cmd_x, global_cmd_y + +        if manual_override_z: +            actual_z = js_z +        else: +            actual_z = global_cmd_z + +        if manual_override_rot: +            actual_rot = js_rot +        else: +            actual_rot = global_cmd_rot + +        drone.move_freely( not actual_hover  , actual_x, actual_y, actual_z, actual_rot)  +     +     +          lock.acquire()      rawimg = drone.get_image() -    frame = cv2.cvtColor(rawimg, cv2.COLOR_BGR2RGB) -    phi = drone.navdata.get(0, dict()).get('phi',1337) -    theta = drone.navdata.get(0, dict()).get('theta',1337) -    psi = drone.navdata.get(0, dict()).get('psi',1337) +    global_frame = cv2.cvtColor(rawimg, cv2.COLOR_BGR2RGB) +    global_phi = drone.navdata.get(0, dict()).get('phi',1337) +    global_theta = drone.navdata.get(0, dict()).get('theta',1337) +    global_psi = drone.navdata.get(0, dict()).get('psi',1337) +    global_batt = drone.navdata.get(0, dict()).get('batt',1337)      lock.release() -    cv2.imshow("frame", frame) -    writer.write(frame) -    logfile.write(str(phi)+"\t"+str(theta)+"\t"+str(psi)+"\n") -    print phi,theta,psi +    smallframe = cv2.resize(global_frame, (640,480)) +    cv2.rectangle(smallframe, (0,0), (640,30), (255,255,255), -1) +    cv2.putText(smallframe, "override", (0,20), cv2.FONT_HERSHEY_PLAIN, 1, (255,0,0)) +    putStatusText(smallframe, "XY", (100,20), manual_override_xy) +    putStatusText(smallframe, "height", (200,20), manual_override_z) +    putStatusText(smallframe, "rotation", (300,20), manual_override_rot) +    #cv2.putText(smallframe, "XY", (100,20), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255) if manual_override_xy else (127,127,127)) +    #cv2.putText(smallframe, "height", (250,20), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255)   f manual_override_z else (127,127,127)) +    #cv2.putText(smallframe, "rotation", (400,20), cv2.FONT_HERSHEY_PLAIN, 1, (0,0,255) if manual_override_rot else (127,127,127)) +    cv2.imshow("frame", smallframe) +    writer.write(global_frame) +    logfile.write(str(global_phi)+"\t"+str(global_theta)+"\t"+str(global_psi)+"\n") +    logfile.flush() + + + +    key = cv2.waitKey(10) & 0xFF + +    if key == ord("t"): +        drone.trim() + +    if key == ord("z"): +        drone.set_max_vz(750.0000) +        drone.set_max_rotspeed(1.0) +        drone.set_max_angle(0.1) +        print "slow" +    elif key == ord("a"): +        drone.set_max_vz(10000.0000) +        drone.set_max_rotspeed(10) +        drone.set_max_angle(0.6) +        print "fast" +     +    if key == ord("1"): +        manual_override_xy = False +    elif key == ord("2"): +        manual_override_z = False +    elif key == ord("3"): +        manual_override_rot = False -    cv2.waitKey(50)  | 
