def run(self):

        # initialise video capture
        camera = balloon_video.get_camera()

        # create trackbars for color change
        cv2.namedWindow('Colour Filters')
        cv2.createTrackbar('Hue min','Colour Filters',self.h_low,255,self.empty_callback)
        cv2.createTrackbar('Hue max','Colour Filters',self.h_high,255,self.empty_callback)
        cv2.createTrackbar('Sat min','Colour Filters',self.s_low,255,self.empty_callback)
        cv2.createTrackbar('Sat max','Colour Filters',self.s_high,255,self.empty_callback)
        cv2.createTrackbar('Bgt min','Colour Filters',self.v_low,255,self.empty_callback)
        cv2.createTrackbar('Bgt max','Colour Filters',self.v_high,255,self.empty_callback)
        cv2.createTrackbar('Save','Colour Filters',0,10,self.save_callback)

        while(True):
            # get a frame
            _, frame = camera.read()
        
            # Convert BGR to HSV
            hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        
            # get latest trackbar positions
            self.h_low = cv2.getTrackbarPos('Hue min','Colour Filters')
            self.h_high = cv2.getTrackbarPos('Hue max','Colour Filters')
            self.s_low = cv2.getTrackbarPos('Sat min','Colour Filters')
            self.s_high = cv2.getTrackbarPos('Sat max','Colour Filters')
            self.v_low = cv2.getTrackbarPos('Bgt min','Colour Filters')
            self.v_high = cv2.getTrackbarPos('Bgt max','Colour Filters')
        
            # use trackbar positions to filter image
            colour_low = np.array([self.h_low,self.s_low,self.v_low])
            colour_high = np.array([self.h_high,self.s_high,self.v_high])
        
            # Threshold the HSV image
            mask = cv2.inRange(hsv_frame, colour_low, colour_high)
        
            # Erode
            erode_kernel = np.ones((3,3),np.uint8);
            eroded_img = cv2.erode(mask,erode_kernel,iterations = 1)
        
            # dilate
            dilate_kernel = np.ones((10,10),np.uint8);
            dilated_img = cv2.dilate(eroded_img,dilate_kernel,iterations = 1)
        
            # Bitwise-AND mask and original image
            res = cv2.bitwise_and(frame,frame, mask=dilated_img)
        
            cv2.imshow('Original',frame)
            cv2.imshow('Mask',mask)
            cv2.imshow('Filtered Result',res)
            
            #cv2.imshow('grey_res',grey_res)
            k = cv2.waitKey(5) & 0xFF
            if k == 27:
                break

        # close all windows
        cv2.destroyAllWindows()
Ejemplo n.º 2
0
    def run(self):

        try:
            print "starting web server"
            # initialise web server which will display final image
            web = Webserver(balloon_config.config.parser,
                            (lambda: self.frame_filtered))

            print "initialising camera"
            # initialise video capture
            camera = balloon_video.get_camera()

            print "Ready to go!"

            while (True):
                # get a frame
                _, frame = camera.read()

                # Convert BGR to HSV
                hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

                # get latest colour filters
                self.read_config_file(False)

                # use trackbar positions to filter image
                colour_low = np.array([self.h_low, self.s_low, self.v_low])
                colour_high = np.array([self.h_high, self.s_high, self.v_high])

                # Threshold the HSV image
                mask = cv2.inRange(hsv_frame, colour_low, colour_high)

                # Erode
                erode_kernel = np.ones((3, 3), np.uint8)
                eroded_img = cv2.erode(mask, erode_kernel, iterations=1)

                # dilate
                dilate_kernel = np.ones((10, 10), np.uint8)
                dilated_img = cv2.dilate(eroded_img,
                                         dilate_kernel,
                                         iterations=1)

                # Bitwise-AND mask and original image
                self.frame_filtered = cv2.bitwise_and(frame,
                                                      frame,
                                                      mask=dilated_img)

        # handle interrupts
        except:
            print "interrupted, exiting"

        # exit and close web server
        print "exiting..."
        web.close()
    def run(self):

        try:
            print "starting web server"
            # initialise web server which will display final image
            web = Webserver(balloon_config.config.parser, (lambda: self.frame_filtered))

            print "initialising camera"
            # initialise video capture
            camera = balloon_video.get_camera()

            print "Ready to go!"

            while True:
                # get a frame
                _, frame = camera.read()

                # Convert BGR to HSV
                hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

                # get latest colour filters
                self.read_config_file(False)

                # use trackbar positions to filter image
                colour_low = np.array([self.h_low, self.s_low, self.v_low])
                colour_high = np.array([self.h_high, self.s_high, self.v_high])

                # Threshold the HSV image
                mask = cv2.inRange(hsv_frame, colour_low, colour_high)

                # Erode
                erode_kernel = np.ones((3, 3), np.uint8)
                eroded_img = cv2.erode(mask, erode_kernel, iterations=1)

                # dilate
                dilate_kernel = np.ones((10, 10), np.uint8)
                dilated_img = cv2.dilate(eroded_img, dilate_kernel, iterations=1)

                # Bitwise-AND mask and original image
                self.frame_filtered = cv2.bitwise_and(frame, frame, mask=dilated_img)

        # handle interrupts
        except:
            print "interrupted, exiting"

        # exit and close web server
        print "exiting..."
        web.close()
Ejemplo n.º 4
0
    def main(self):
        web = Webserver(balloon_config.config.parser, (lambda : self.frame))

        camera = balloon_video.get_camera()
        video_writer = balloon_video.open_video_writer()

        # get start time
        start_time = time.time()

        # loop for 10 seconds looking for circles
        while(time.time() - start_time < 20):

            # Take each frame
            _, frame = camera.read()
            self.frame = frame

            # is there the x & y position in frame of the largest balloon
            found_in_image, xpos, ypos, size = self.analyse_frame(frame)

	    print found_in_image, xpos, ypos, size
            # display image
            cv2.imshow('frame',frame)

            # write the frame
            video_writer.write(frame)

            # exit if user presses ESC
            k = cv2.waitKey(5) & 0xFF
            if k == 27:
                break

        print "exiting..."
        web.close()

        # uncomment line below if window with real-time video was displayed
        cv2.destroyAllWindows()

        # release camera
        camera.release()
    def main(self):
        web = Webserver(balloon_config.config.parser, (lambda: self.frame))

        camera = balloon_video.get_camera()
        video_writer = balloon_video.open_video_writer()

        # get start time
        start_time = time.time()

        # loop for 10 seconds looking for circles
        while (time.time() - start_time < 20):

            # Take each frame
            _, frame = camera.read()
            self.frame = frame

            # is there the x & y position in frame of the largest balloon
            found_in_image, xpos, ypos, size = self.analyse_frame(frame)

            # display image
            cv2.imshow('frame', frame)

            # write the frame
            video_writer.write(frame)

            # exit if user presses ESC
            k = cv2.waitKey(5) & 0xFF
            if k == 27:
                break

        print "exiting..."
        web.close()

        # uncomment line below if window with real-time video was displayed
        cv2.destroyAllWindows()

        # release camera
        camera.release()
     def run(self):

        yawangle=0.0
        imgnum=0
        bal_rc1=self.vehicle.parameters['RC1_TRIM']
        bal_rc2=self.vehicle.parameters['RC2_TRIM']
        RC7MAX=self.vehicle.parameters['RC7_MAX']
        RC7MIN=self.vehicle.parameters['RC7_MIN']  
        RC6MIN=self.vehicle.parameters['RC6_MIN']
        last_mode=None
        gain=1.0

        deltasatx=0
        deltasaty=0  
        

        try:
            
            #web=Webserver(balloon_config.config.parser,(lambda:self.frame))
            
            fourcc = cv2.cv.CV_FOURCC(*'XVID')
            video_writer = cv2.VideoWriter('output.avi',fourcc, 1.0, (640,480))
            
            print "initialising camera"
            # initialise video capture
            camera = balloon_video.get_camera()
            
            log_gname='Guidedv%s' % (time.time())
            gf = open(log_gname, mode='w')
            gf.write("Guided velocity mode log DATA %s\n"%(time.localtime()))
            gf.write("time\t yaw(org,radians)\t yaw_angle\t objposx\t objposy\t error_total\t vx\t vy\t gain\t imgradius\t RC6VAL\n")
            gf.close

 
            cycle_num=0
            coeffx=1
            coeffy=1
            
            print "Ready to go!"

            while(True):
                
              #print(self.vehicle)
              if self.vehicle is None:
                #print('0.5')
                self.vehicle=self.api.get_vehicles()[0]
                print('no vehicle')
              #print('1.5')

              # get a frame
              _, frame = camera.read()
              newx,newy=frame.shape[1],frame.shape[0]
              newframe=cv2.resize(frame,(newx,newy))
 
              self.frame=newframe

 
              #self.balloon_found, xpos, ypos, size = balloon_finder.analyse_frame(frame)
              self.object_found,xpos,ypos,size=self.object_find(newframe)
              #self.object_found,xpos,ypos,size=self.object_find_hough(frame)
              #if self.object_found:              
              #   video_writer.write(newframe)
              #print xpos
              
              RC6VAL=float(self.vehicle.channel_readback['6'])
              RC7VAL=self.vehicle.channel_readback['7']  
              if RC7VAL<=0 or RC7MAX is None:
                 gain=1.0
              else:
                 gain=7.0*(RC7VAL-RC7MIN)/(RC7MAX-RC7MIN)
              
              if RC7VAL>1099 and RC7VAL<1150:
                 gain=0
              elif RC7VAL>1150 and RC7VAL<1200:
                 gain=0.05
              elif RC7VAL>1200 and RC7VAL<1250:
                 gain=0.1
              elif RC7VAL>1250 and RC7VAL<1300:
                 gain=0.2
              elif RC7VAL>1300 and RC7VAL<1350:
                 gain=0.3
              elif RC7VAL>1350 and RC7VAL<1400:
                 gain=0.4
              elif RC7VAL>1400 and RC7VAL<1450:
                 gain=0.5
              elif RC7VAL>1450:
                 gain=0.6

              print 'gain is:',gain

              #RC6VAL=1
              #if RC6VAL==1:
              if RC6VAL==RC6MIN:#vision-controlled
                           
                 
                 yaw_origin=self.vehicle.attitude.yaw
                 
                 if self.vehicle.mode.name=="GUIDED":#visual-guided
                    last_mode="GUIDED" 

                    

                    if self.object_found: 
                       print('object found')

                       pixelsize=0.03
                       deltax=xpos-320
                       deltay=240-ypos
                       print 'yaw-origin: deltaxpos  deltaypos ', yaw_origin,deltax,deltay

                       #print'deltax y'
                       #print deltax,deltay 
                       angle_yawtmp=0.5*3.14-math.atan2(deltay,deltax)+yaw_origin#radians
                       angle_yaw=wrap_PI(angle_yawtmp)
                       #print'angle1'
                       angle_yawdeg=math.degrees(angle_yaw)
                       
                       angle_pitch=0
                       speedSet=0.15

                       #spdfactor=math.sqrt((deltax*daltax+deltay*deltay))*0.1

                       realrx=deltax*pixelsize

                       realry=deltay*pixelsize
                       #spdfactor=((rx**2+ry**2)**0.5*0.01
 
                       spddist=math.sqrt(realrx**2+realry**2)

                       #print "dist:",spddist
                       #if spddist<=0.5:
                       #   self.vehicle.mode=VehicleMode("LAND")
                       #   self.vehicle.flush()



                       spdfactor=spddist*0.2
                       '''  
                       # get time since last time velocity pid controller was run
                       dt = self.vel_xy_pid.get_dt(2.0)
                       
                       # get speed towards balloon based on balloon   distance
                       #speed = self.balloon_distance * self.vel_dist_ratio
                       speed=spdfactor
                       # apply min and max speed limit
                       speed = min(speed, self.vel_speed_max)
                       speed = max(speed, self.vel_speed_min)

                       # apply acceleration limit
                       speed_chg_max = self.vel_accel * dt
                       speed = min(speed, self.vel_speed_last + speed_chg_max)
                       speed = max(speed, self.vel_speed_last - speed_chg_max)

                       # record speed for next iteration
                       self.vel_speed_last = speed
                       '''
                       cos_pitch=math.cos(angle_pitch)

                       velocity_x=gain*speedSet*math.cos(angle_yaw)*cos_pitch*spdfactor
                       velocity_y=float(gain*speedSet*math.sin(angle_yaw)*cos_pitch*spdfactor)
                       #velocity_x=speedSet*math.cos(angle_yaw)*cos_pitch*speed
                       #velocity_y=speedSet*math.sin(angle_yaw)*cos_pitch*speed
                       #velocity_z=speedSet*math.sin(angle_pitch)
                       velocity_z=0
                       #print 'angle and velocity....'
                       #print angle_yawdeg,velocity_x,velocity_y
                       
                       #start calculate the pid controller's term
                       dtx=self.vx_fopi.get_dt(2.0)
                                              
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.265/size#radius of the red circle is 25.5cm
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.265/(1*size)#radius of the red circle is 25.5cm
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.012/(1*size)#radius of the blue circle is 1.2cm
                       #errorx=errorx-deltasatx*0.3 #anti-wind
                       #errorx=errorx*gain
                       error_total=math.sqrt(deltax*deltax+deltay*deltay)*0.265/(1*size)#radius of the blue circle is 1.2cm
                       print'error_total,gain,angletoN',error_total,gain,angle_yaw
                       upx=error_total*math.cos(angle_yaw)*gain*coeffx
                       upy=error_total*math.sin(angle_yaw)*gain*coeffy
                       
                       
                        
                       if upx>1.0:
                          upx=1.0
                          upy=upx/math.tan(angle_yaw)
                       elif upx<-1.0:
                          upx=-1.0
                          upy=upx/math.tan(angle_yaw)
                       if upy>1.0:
                          upy=1.0
                          upx=upy*math.tan(angle_yaw)
                       elif upy<-1.0:
                          upy=-1.0
                          upx=upy*math.tan(angle_yaw)

                       #errorx=velocity_x
                       '''
                       up_total=self.vx_fopi.get_fopi(error_total, dtx)
                       upx=up_total*math.cos(angle_yaw)*gain
                       upy=up_total*math.sin(angle_yaw)*gain
                       '''
                       #upx=upx*gain
                       ''' 
                       dty=self.vy_fopi.get_dt(2.0)
                       #errory=velocity_y
                       #errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.265/size
                       errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.265/size
                       #errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.012/size
                       #errory=errory-deltasaty*0.3 
                       errory=errory*gain
                       
                       print'errory,gain',errory,gain

                       upy=self.vy_fopi.get_fopi(errory, dty)
                       #upy=upy*gain
                       '''   
                       
                       print'gain,num,sampling time',gain,cycle_num,dtx


                       print 'control speed of x from fo-pi to p upx,velx,upy,vely',upx,velocity_x,upy,velocity_y

                       self.vel_control(upx,upy)
                       time.sleep(0.1)
                       
                       deltatime=time.time()-self.timelast
                       gf = open(log_gname, mode='a')
                       gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(deltatime,yaw_origin,angle_yaw,xpos,ypos,error_total,upx,upy,gain,size,coeffx,coeffy,RC6VAL))
                       gf.close()

                    else:#not-found
                         print "guided mode,object not found"
                         self.vel_control(0,0)
                         time.sleep(0.5)
                         
                         deltatime=time.time()-self.timelast
                         gf = open(log_gname, mode='a')
                         gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(deltatime,0,0,-566,-566,0,0,0,0,size,-500))
                         gf.close()
                 else:#non-guided
                        
                        print "vision control but non-guided"
                        
                        if last_mode=="GUIDED":
                            self.vel_control(0,0)
                            last_mode=self.vehicle.mode.name
                            time.sleep(0.5)

                                               
 
              else:#non-vision-controlled
                   
                   print "non-vision-controlled,landing......"
                   while(self.vehicle.mode.name=="GUIDED"):

                             self.vehicle.mode.name="LAND"
                             self.vehicle.mode = VehicleMode("LAND")
                             self.vehicle.flush()
                             time.sleep(1)
                   while(self.vehicle.armed is True):
                             self.vehicle.armed=False
                             self.vehicle.flush()
                             time.sleep(1)
                      
                    
              #time.sleep(1)  
        # handle interrupts
        except:
            print "interrupted, exiting"

        # exit and close web server
        print "exiting..."
     def run(self):

        # yawangle=0.0
        # imgnum=0
        # bal_rc1=self.vehicle.parameters['RC1_TRIM']
        # bal_rc2=self.vehicle.parameters['RC2_TRIM']
        RC7MAX=self.vehicle.parameters['RC7_MAX'] #for tuning
        RC7MIN=self.vehicle.parameters['RC7_MIN']  
        RC6MIN=self.vehicle.parameters['RC6_MIN']
        RC6MAX=self.vehicle.parameters['RC6_MAX']
        RC6MID=(RC6MIN+RC6MAX)/2
       # print "RC6MIN=",RC6MIN,",RC6MAX=",RC6MAX,",RC6MID=",RC6MID
        # last_mode=None
        gain=1.0
        last_gain=1.0

        # deltasatx=0
        # deltasaty=0  
        

        try:
            
            web=Webserver(balloon_config.config.parser,(lambda:self.webframe),(lambda:self.webframe_masked))
            
            #Shang uncommented here. 
			#web=Webserver(balloon_config.config.parser,(lambda:self.frame))

            fourcc = cv2.cv.CV_FOURCC(*'XVID')
            video_name='FOPD_%s.avi' % (time.time())
            video_writer = cv2.VideoWriter(video_name,fourcc, 1.0, (640,480))
            
            print "Initialising camera."
            # initialise video capture
            camera = balloon_video.get_camera()
            
            log_gname='FOPD_%s.txt' % (time.time())
            gf = open(log_gname, mode='a')#w
            gf.write("Guided mode log DATA %s\n"%(time.localtime()))
            gf.write("time\t RC5VAL\t yaw_angle\t objposx\t objposy\t RC7VAL\t vx\t vy\t gain\t size\t roll\t pitch\t RC6VAL\n") #coeffx\t coeffy\t
            # gf.close
            
 
            cycle_num=0
            coeffx=1
            coeffy=1
            previous_time=0
            yprevious_error=0
            xprevious_error=0
            upx9=0
            upx8=0
            upx7=0
            upx6=0
            upx5=0
            upx4=0
            upx3=0
            upx2=0
            upx1=0
           
            deltay9=0
            deltay8=0
            deltay7=0
            deltay6=0
            deltay5=0
            deltay4=0
            deltay3=0
            deltay2=0
            deltay1=0
            
            upy9=0
            upy8=0
            upy7=0
            upy6=0
            upy5=0
            upy4=0
            upy3=0
            upy2=0
            upy1=0
           
            deltax9=0
            deltax8=0
            deltax7=0
            deltax6=0
            deltax5=0
            deltax4=0
            deltax3=0
            deltax2=0
            deltax1=0

            print "Ready to go!"

            while(True):
                
              #print(self.vehicle)
              if self.vehicle is None:
                #print('0.5')
                self.vehicle=self.api.get_vehicles()[0]
                print('no vehicle')
              #print('1.5')

              # get a frame
              _, frame = camera.read()
              newx,newy=frame.shape[1],frame.shape[0]
              newframe=cv2.resize(frame,(newx,newy))
 
              self.frame=newframe

              self.max=web.my_static.max;
              self.min=web.my_static.min;
              self.smax=web.my_static.smax
              self.smin=web.my_static.smin
              self.vmax=web.my_static.vmax
              self.vmin=web.my_static.vmin
              #self.balloon_found, xpos, ypos, size = balloon_finder.analyse_frame(frame)
              self.object_found,xpos,ypos,size=self.object_find(newframe)
              #self.object_found,xpos,ypos,size=self.object_find_hough(frame)
              #if self.object_found:              
			  
              #adding text to image
              font = cv2.FONT_HERSHEY_SIMPLEX
              #Python:#cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[,bottomLeftOrigin]]]) 
              cv2.putText(newframe,'Object Found? ' + str(self.object_found)[0],(10,20), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Mode: ' + self.vehicle.mode.name,(10,40), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Time: ' + str(time.time()),(10,60), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Alt: ' + str(self.vehicle.location.global_relative_frame),(10,100), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'RC5: ' + str(self.vehicle.channels['5'])+'  6: '+ str(self.vehicle.channels['5'])+'  7: '+ str(self.vehicle.channels['7']),(10,120), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'max: ' + str(self.max),(10,240), font, 0.3,(255,255,255),1)
              #print 'New video frame. Time: %s' % (time.time()) 
              #print xpos
              print self.vehicle.channels['5']
              if self.vehicle.channels['5'] is not None:
                 RC5VAL=float(self.vehicle.channels['5']) 
              else:
                 RC5VAL=1400              
              if self.vehicle.channels['6'] is not None:                 
                 RC6VAL=float(self.vehicle.channels['6'])
              else:
                 RC6VAL=1400              
              if self.vehicle.channels['7'] is not None:    
                 RC7VAL=self.vehicle.channels['7']
              else:
                 RC7VAL=1400              
              if RC7VAL==0 or RC7MAX is None:
                 gain=last_gain
              #else:
              #   gain=7.0*(RC7VAL-RC7MIN)/(RC7MAX-RC7MIN)
              
              if RC7VAL>=1099 and RC7VAL<=1150:
                 gain=0
              elif RC7VAL>=1150 and RC7VAL<=1200:
                 gain=0.05
              elif RC7VAL>=1200 and RC7VAL<=1250:
                 gain=0.1
              elif RC7VAL>=1250 and RC7VAL<=1300:
                 gain=0.2
              elif RC7VAL>=1300 and RC7VAL<=1350:
                 gain=0.3
              elif RC7VAL>=1350 and RC7VAL<=1400:
                 gain=0.4
              elif RC7VAL>=1400 and RC7VAL<=1450:
                 gain=0.5
              elif RC7VAL>=1450 and RC7VAL<=1500:
                 gain=0.6
              elif RC7VAL>=1500 and RC7VAL<=1550:
                 gain=0.7
              elif RC7VAL>=1550 and RC7VAL<=1600:
                 gain=0.8	 
              elif RC7VAL>=1600 and RC7VAL<=1650:
                 gain=0.9
              elif RC7VAL>=1650:
                 gain=1.0
              last_gain=gain
              cv2.putText(newframe,'Gain: ' + str(gain),(10,140), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Roll: ' + str(self.vehicle.attitude.roll),(10,160), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Pitch: ' + str(self.vehicle.attitude.pitch),(10,180), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Battery: ' + str(self.vehicle.battery),(10,200), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'[vx, vy, vz ](in m/s): ' + str(self.vehicle.velocity),(10,220), font, 0.3,(255,255,255),1)

              #gain1=0.05*gain
              #gain=gain1
              #print 'gain is:',gain,'RC7=',RC7VAL

              #RC6VAL=1
              #if RC6VAL==1:
              #if RC6VAL<RC6MID:#vision-controlled
              if 1:
                           
                 #print 'vision-controlled.'
				 
                 yaw_origin=self.vehicle.attitude.yaw
                 roll_origin=self.vehicle.attitude.roll
                 pitch_origin=self.vehicle.attitude.pitch
                 #attitude_origin=self.vehicle.attitude
                 # print "Heading: %s" % self.vehicle.heading
                 cv2.line(newframe,(320,240),(int(320+100*math.sin(-yaw_origin)),int(240-100*math.cos(-yaw_origin))),(255,255,255),1)
                 cv2.putText(newframe,"N: " + str(math.degrees(yaw_origin))[0:5],(int(320+100*math.sin(-yaw_origin)),int(240-100*math.cos(-yaw_origin))),font,0.3,(255,255,255),1)
                 #print 'yaw_origin=', yaw_origin
                 if self.vehicle.mode.name!="LOITER":#visual-guided
                 #if 1:#visual-guided
                    '''
                    if last_mode!="GUIDED":
                       self.condition_yaw(0)
                    last_mode="GUIDED"
                    '''
                    #print "---------------New period-----------------"

                    #print 'vehicle.mode = Guided. Gain =',gain
					
                    if self.object_found: 
                    #if 1: 
                       # print('object found')

                       deltax=xpos-320  
					   #cv2.line(frame,(320,240),320)
                       deltay=240-ypos
                       #print 'yaw-origin: deltaxpos  deltaypos ', yaw_origin,deltax,deltay
                       #print 'roll, pitch=', roll_origin,pitch_origin
					   
                       #Kd=0.013;
                       
                       #dt=time.time()-previous_time #get the sampling time
                       #if previous_time==0:
                       #     dt=0.58
                       
                       #previous_time=time.time()
                       
                      
                       upx=0.6708*upx1 + 3.159*upx2 - 1.998*upx3 - 3.618*upx4+ 2.099*upx5 + 1.753*upx6 - 0.882*upx7 - 0.2949*upx8+ 0.1106*upx9+5.268*deltay  - 8.506*deltay1 - 8.5*deltay2 + 18.26*deltay3 + 1.801*deltay4- 12.23*deltay5 + 2.027*deltay6 + 2.468*deltay7 - 0.5658*deltay8- 0.03059*deltay9
                       
                       if upx>gain:
                            upx=gain
                       elif upx<-gain:
                            upx=-gain
                       
                       upx9=upx8
                       upx8=upx7
                       upx7=upx6
                       upx6=upx5
                       upx5=upx4
                       upx4=upx3
                       upx3=upx2
                       upx2=upx1
                       upx1=upx
                       
                       deltay9=deltay8
                       deltay8=deltay7
                       deltay7=deltay6
                       deltay6=deltay5
                       deltay5=deltay4
                       deltay4=deltay3
                       deltay3=deltay2
                       deltay2=deltay1
                       deltay1=deltay
                        
                       #print "dt:",dt

                       
                       
                       upy=0.6708*upy1 + 3.159*upy2 - 1.998*upy3 - 3.618*upy4+ 2.099*upy5 + 1.753*upy6 - 0.882*upy7 - 0.2949*upy8+ 0.1106*upy9+5.268*deltax  - 8.506*deltax1 - 8.5*deltax2 + 18.26*deltax3 + 1.801*deltax4- 12.23*deltax5 + 2.027*deltax6 + 2.468*deltax7 - 0.5658*deltax8- 0.03059*deltax9
                            
                       if upy>gain:
                            upy=gain
                       elif upy<-gain:
                            upy=-gain


                       upy9=upy8
                       upy8=upy7
                       upy7=upy6
                       upy6=upy5
                       upy5=upy4
                       upy4=upy3
                       upy3=upy2
                       upy2=upy1
                       upy1=upy
                       
                       deltax9=deltax8
                       deltax8=deltax7
                       deltax7=deltax6
                       deltax6=deltax5
                       deltax5=deltax4
                       deltax4=deltax3
                       deltax3=deltax2
                       deltax2=deltax1
                       deltax1=deltax
                       
                       print 'upx, upy=', upx,upy
                       
                         
                       
                       
                       self.vel_control(upx,upy)
                       cv2.putText(newframe,'upx(N): ' + str(upx) + ', upy(E): ' + str(upy),(10,80), font, 0.3,(255,255,255),1)
                       # time.sleep(0.1)
                 
                       #deltatime=time.time()-self.timelast
                       # gf = open(log_gname, mode='a')
                       gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),RC5VAL,yaw_origin,xpos,ypos,RC7VAL,upx,upy,gain,size,roll_origin,pitch_origin,RC6VAL))
                       # gf.close()

                    else:#not-found
                         print "Guided mode,object not found. Gain = %f; Time = %f" % (gain,time.time())
                         # self.vel_control(0,0)
                         #time.sleep(0.5)

                         # RC6VAL=float(self.vehicle.channels['6'])
                         #deltatime=time.time()-self.timelast
                         # gf = open(log_gname, mode='a')
                         gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),0,0,-566,-566,0,0,0,0,size,roll_origin,pitch_origin,RC6VAL))
                         # gf.close()

                 else:#non-guided
                        
                        print "Vision control but non-guided. Yaw=", math.degrees(yaw_origin), ", Time=", time.time()

                        # RC6VAL=float(self.vehicle.channels['6'])
                        #deltatime=time.time()-self.timelast
                        # gf = open(log_gname, mode='a')
                        # gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),0,0,-566,-566,0,0,0,0,size,roll_origin,pitch_origin,RC6VAL))
                        # gf.close()
                        
                        # if last_mode=="GUIDED":
                            # self.vel_control(0,0)
                            # last_mode=self.vehicle.mode.name
                            # time.sleep(0.5)

                                               
 
              # else:#non-vision-controlled
                   
                   # print "non-vision-controlled,landing......"

                   #deltatime=time.time()-self.timelast
                   # gf = open(log_gname, mode='a')
                   # gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),yaw_origin,angle_yaw,xpos,ypos,error_total,upx,upy,gain,size,RC6VAL,RC6VAL,RC6VAL))
                   # gf.close()
              '''
                   while(self.vehicle.mode.name=="GUIDED"):

                             self.vehicle.mode.name="LAND"
                             self.vehicle.mode = VehicleMode("LAND")
                             self.vehicle.flush()
                             time.sleep(1)
                   while(self.vehicle.armed is True):
                             self.vehicle.armed=False
                             self.vehicle.flush()
                             time.sleep(1)
              '''
              #if RC6VAL<RC6MID:
              video_writer.write(newframe)
                #print 'Video recorded.'
                #print 'RC6VAL:',RC6VAL
                #print 'RC6MID:',RC6MID
              self.webframe=newframe
      
              #time.sleep(1)  
        # handle interrupts
        except KeyboardInterrupt:
            print 'interrupted, exiting'

        # exit and close web server
        print "exiting..."
        gf.close()
        web.close()
        #Shang uncommented here.

        video_writer.release()  
        bus.exit()
Ejemplo n.º 8
0
     def run(self):

        yawangle=0.0
        imgnum=0
        bal_rc1=self.vehicle.parameters['RC1_TRIM']
        bal_rc2=self.vehicle.parameters['RC2_TRIM']
        RC7MAX=self.vehicle.parameters['RC7_MAX']
        RC7MIN=self.vehicle.parameters['RC7_MIN']  
        RC6MIN=self.vehicle.parameters['RC6_MIN']
        RC6MAX=self.vehicle.parameters['RC6_MAX']
        RC6MID=(RC6MIN+RC6MAX)/2
       # print "RC6MIN=",RC6MIN,",RC6MAX=",RC6MAX,",RC6MID=",RC6MID
        last_mode=None
        gain=1.0
        last_gain=1.0

        deltasatx=0
        deltasaty=0  
        

        try:
            
            web=Webserver(balloon_config.config.parser,(lambda:self.webframe))
            #Shang uncommented here. 
			#web=Webserver(balloon_config.config.parser,(lambda:self.frame))

            fourcc = cv2.cv.CV_FOURCC(*'XVID')
            video_name='video_%s.avi' % (time.time())
            video_writer = cv2.VideoWriter(video_name,fourcc, 1.0, (640,480))
            
            print "Initialising camera."
            # initialise video capture
            camera = balloon_video.get_camera()
            
            log_gname='BoTest%s.txt' % (time.time())
            gf = open(log_gname, mode='w')
            gf.write("Guided velocity mode log DATA %s\n"%(time.localtime()))
            gf.write("time\t yaw(org,radians)\t yaw_angle\t objposx\t objposy\t error_total\t vx\t vy\t gain\t imgradius\t roll\t pitch\t RC6VAL\n") #coeffx\t coeffy\t
            gf.close
            
 
            cycle_num=0
            coeffx=1
            coeffy=1
            
            print "Ready to go!"

            while(True):
                
              #print(self.vehicle)
              if self.vehicle is None:
                #print('0.5')
                self.vehicle=self.api.get_vehicles()[0]
                print('no vehicle')
              #print('1.5')

              # get a frame
              _, frame = camera.read()
              newx,newy=frame.shape[1],frame.shape[0]
              newframe=cv2.resize(frame,(newx,newy))
 
              self.frame=newframe

 
              #self.balloon_found, xpos, ypos, size = balloon_finder.analyse_frame(frame)
              self.object_found,xpos,ypos,size=self.object_find(newframe)
              #self.object_found,xpos,ypos,size=self.object_find_hough(frame)
              #if self.object_found:              
			  
              #adding text to image
              font = cv2.FONT_HERSHEY_SIMPLEX
              #Python:#cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[,bottomLeftOrigin]]]) 
              cv2.putText(newframe,'Object Found? ' + str(self.object_found)[0],(10,20), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Mode: ' + self.vehicle.mode.name,(10,40), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Time: ' + str(time.time()),(10,60), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Alt: ' + str(self.vehicle.location.global_relative_frame),(10,100), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'RC5: ' + str(self.vehicle.channels['5']),(10,120), font, 0.3,(255,255,255),1)
              #print 'New video frame. Time: %s' % (time.time()) 
              #print xpos
              
              RC6VAL=float(self.vehicle.channels['6'])
              RC7VAL=self.vehicle.channels['7']  
              if RC7VAL==0 or RC7MAX is None:
                 gain=last_gain
              #else:
              #   gain=7.0*(RC7VAL-RC7MIN)/(RC7MAX-RC7MIN)
              
              if RC7VAL>=1099 and RC7VAL<=1150:
                 gain=0
              elif RC7VAL>=1150 and RC7VAL<=1200:
                 gain=0.05
              elif RC7VAL>=1200 and RC7VAL<=1250:
                 gain=0.1
              elif RC7VAL>=1250 and RC7VAL<=1300:
                 gain=0.2
              elif RC7VAL>=1300 and RC7VAL<=1350:
                 gain=0.3
              elif RC7VAL>=1350 and RC7VAL<=1400:
                 gain=0.4
              elif RC7VAL>=1400 and RC7VAL<=1450:
                 gain=0.5
              elif RC7VAL>=1450 and RC7VAL<=1500:
                 gain=0.6
              elif RC7VAL>=1500 and RC7VAL<=1550:
                 gain=0.7
              elif RC7VAL>=1550 and RC7VAL<=1600:
                 gain=0.8	 
              elif RC7VAL>=1600 and RC7VAL<=1650:
                 gain=0.9
              elif RC7VAL>=1650:
                 gain=1.0
              last_gain=gain
              cv2.putText(newframe,'Gain: ' + str(gain),(10,140), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Roll: ' + str(self.vehicle.attitude.roll),(10,160), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Pitch: ' + str(self.vehicle.attitude.pitch),(10,180), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'Battery: ' + str(self.vehicle.battery),(10,200), font, 0.3,(255,255,255),1)
              cv2.putText(newframe,'[vx, vy, vz ](in m/s): ' + str(self.vehicle.velocity),(10,220), font, 0.3,(255,255,255),1)

              #gain1=0.05*gain
              #gain=gain1
              #print 'gain is:',gain,'RC7=',RC7VAL

              #RC6VAL=1
              #if RC6VAL==1:
              if RC6VAL<RC6MID:#vision-controlled
                           
                 #print 'vision-controlled.'
				 
                 yaw_origin=self.vehicle.attitude.yaw
                 roll_origin=self.vehicle.attitude.roll
                 pitch_origin=self.vehicle.attitude.pitch
                 #attitude_origin=self.vehicle.attitude
                 print "Heading: %s" % self.vehicle.heading
                 cv2.line(newframe,(320,240),(int(320+100*math.sin(-yaw_origin)),int(240-100*math.cos(-yaw_origin))),(255,255,255),1)
                 cv2.putText(newframe,"N: " + str(math.degrees(yaw_origin))[0:5],(int(320+100*math.sin(-yaw_origin)),int(240-100*math.cos(-yaw_origin))),font,0.3,(255,255,255),1)
                 #print 'yaw_origin=', yaw_origin
                 if self.vehicle.mode.name=="GUIDED":#visual-guided
                    if last_mode!="GUIDED":
                       self.condition_yaw(0)
                    last_mode="GUIDED"

                    #print "---------------New period-----------------"

                    #print 'vehicle.mode = Guided. Gain =',gain
					
                    if self.object_found: 
                       print('object found')

                       pixelsize=0.03
                       deltax=xpos-320  
					   #cv2.line(frame,(320,240),320)
                       deltay=240-ypos
                       #print 'yaw-origin: deltaxpos  deltaypos ', yaw_origin,deltax,deltay
                       print 'roll, pitch=', roll_origin,pitch_origin
					   
                       #print'deltax y'
                       #print deltax,deltay 
                       angle_yawtmp=0.5*3.14-math.atan2(deltay,deltax)+yaw_origin#radians
                       angle_yaw=wrap_PI(angle_yawtmp)
                       #print'angle1'
                       angle_yawdeg=math.degrees(angle_yaw)
                       
                       angle_pitch=0
                       speedSet=0.15

                       #spdfactor=math.sqrt((deltax*daltax+deltay*deltay))*0.1

                       realrx=deltax*pixelsize

                       realry=deltay*pixelsize
                       #spdfactor=((rx**2+ry**2)**0.5*0.01
 
                       spddist=math.sqrt(realrx**2+realry**2)

                       #print "dist:",spddist
                       #if spddist<=0.5:
                       #   self.vehicle.mode=VehicleMode("LAND")
                       #   self.vehicle.flush()



                       spdfactor=spddist*0.2
                       '''  
                       # get time since last time velocity pid controller was run
                       dt = self.vel_xy_pid.get_dt(2.0)
                       
                       # get speed towards balloon based on balloon   distance
                       #speed = self.balloon_distance * self.vel_dist_ratio
                       speed=spdfactor
                       # apply min and max speed limit
                       speed = min(speed, self.vel_speed_max)
                       speed = max(speed, self.vel_speed_min)

                       # apply acceleration limit
                       speed_chg_max = self.vel_accel * dt
                       speed = min(speed, self.vel_speed_last + speed_chg_max)
                       speed = max(speed, self.vel_speed_last - speed_chg_max)

                       # record speed for next iteration
                       self.vel_speed_last = speed
                       '''
                       cos_pitch=math.cos(angle_pitch)

                       velocity_x=gain*speedSet*math.cos(angle_yaw)*cos_pitch*spdfactor
                       velocity_y=float(gain*speedSet*math.sin(angle_yaw)*cos_pitch*spdfactor)
                       #velocity_x=speedSet*math.cos(angle_yaw)*cos_pitch*speed
                       #velocity_y=speedSet*math.sin(angle_yaw)*cos_pitch*speed
                       #velocity_z=speedSet*math.sin(angle_pitch)
                       velocity_z=0
                       #print 'angle and velocity....'
                       #print angle_yawdeg,velocity_x,velocity_y
                       
                       #start calculate the pid controller's term
                       dtx=self.vx_fopi.get_dt(2.0)
                                              
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.265/size#radius of the red circle is 25.5cm
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.265/(1*size)#radius of the red circle is 25.5cm
                       #errorx=math.sqrt(deltax*deltax+deltay*deltay)*math.cos(angle_yaw)*0.012/(1*size)#radius of the blue circle is 1.2cm
                       #errorx=errorx-deltasatx*0.3 #anti-wind
                       #errorx=errorx*gain
                       
                       error_total=math.sqrt(deltax*deltax+deltay*deltay)*0.265/(1*size)#radius of the blue circle is 1.2cm

                       error_x=error_total*math.cos(angle_yaw)
                       error_y=error_total*math.sin(angle_yaw)
                   
                          
                       #print'error_total,gain,angletoN',error_total,gain,angle_yaw
                       upx=error_total*math.cos(angle_yaw)*gain*coeffx
                       upy=error_total*math.sin(angle_yaw)*gain*coeffy
                       

                       upx_fo=self.vx_fopi.get_fopi(error_x, dtx)*gain
                       upy_fo=upx_fo/math.tan(angle_yaw)

                       
                       #print 'upx,upx_fo,upy,upy_fo to object',upx,upx_fo,upy,upy_fo

                       #print 'err_total,error_x',error_total,error_x                       

                       upx=upx_fo
                       upy=upy_fo
                       #print 'upx,upy to drone',upx,upy
                        
                       if upx>1.0:
                          upx=1.0
                          upy=upx/math.tan(angle_yaw)
                       elif upx<-1.0:
                          upx=-1.0
                          upy=upx/math.tan(angle_yaw)
                       if upy>1.0:
                          upy=1.0
                          upx=upy*math.tan(angle_yaw)
                       elif upy<-1.0:
                          upy=-1.0
                          upx=upy*math.tan(angle_yaw)

                       #errorx=velocity_x
                       
                       #upx=upx*gain
                       ''' 
                       dty=self.vy_fopi.get_dt(2.0)
                       #errory=velocity_y
                       #errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.265/size
                       errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.265/size
                       #errory=math.sqrt(deltax*deltax+deltay*deltay)*math.sin(angle_yaw)*0.012/size
                       #errory=errory-deltasaty*0.3 
                       errory=errory*gain
                       
                       print'errory,gain',errory,gain

                       upy=self.vy_fopi.get_fopi(errory, dty)
                       #upy=upy*gain
                       '''   
                       '''                       
                       print'gain,num,sampling time',gain,cycle_num,dtx


                       print 'control speed of x from fo-pi to p upx,velx,upy,vely',upx,velocity_x,upy,velocity_y
                       '''
                       if deltay > 100:
                          upx=gain
                       elif deltay < -100:
                          upx=-gain
                       else:
                          upx=deltay*0.01*gain
                       if deltax > 100:
                          upy=gain
                       elif deltax < -100:
                          upy=-gain
                       else:
                          upy=deltax*0.01*gain

                       self.vel_control(upx,upy)
                       cv2.putText(newframe,'upx(N): ' + str(upx) + ', upy(E): ' + str(upy),(10,80), font, 0.3,(255,255,255),1)
                       time.sleep(0.1)
                 
                       #deltatime=time.time()-self.timelast
                       gf = open(log_gname, mode='a')
                       gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),yaw_origin,angle_yaw,xpos,ypos,error_total,upx,upy,gain,size,roll_origin,pitch_origin,RC6VAL))
                       gf.close()

                    else:#not-found
                         print "Guided mode,object not found. Gain = %f; Time = %f" % (gain,time.time())
                         self.vel_control(0,0)
                         #time.sleep(0.5)

                         RC6VAL=float(self.vehicle.channels['6'])
                         #deltatime=time.time()-self.timelast
                         gf = open(log_gname, mode='a')
                         gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),0,0,-566,-566,0,0,0,0,size,roll_origin,pitch_origin,RC6VAL))
                         gf.close()

                 else:#non-guided
                        
                        print "Vision control but non-guided. Yaw=", math.degrees(yaw_origin), ", Time=", time.time()

                        RC6VAL=float(self.vehicle.channels['6'])
                        #deltatime=time.time()-self.timelast
                        gf = open(log_gname, mode='a')
                        gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),0,0,-566,-566,0,0,0,0,size,roll_origin,pitch_origin,RC6VAL))
                        gf.close()
                        
                        if last_mode=="GUIDED":
                            self.vel_control(0,0)
                            last_mode=self.vehicle.mode.name
                            time.sleep(0.5)

                                               
 
              else:#non-vision-controlled
                   
                   print "non-vision-controlled,landing......"

                   #deltatime=time.time()-self.timelast
                   gf = open(log_gname, mode='a')
                   gf.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n"%(time.time(),yaw_origin,angle_yaw,xpos,ypos,error_total,upx,upy,gain,size,RC6VAL,RC6VAL,RC6VAL))
                   gf.close()

                   while(self.vehicle.mode.name=="GUIDED"):

                             self.vehicle.mode.name="LAND"
                             self.vehicle.mode = VehicleMode("LAND")
                             self.vehicle.flush()
                             time.sleep(1)
                   while(self.vehicle.armed is True):
                             self.vehicle.armed=False
                             self.vehicle.flush()
                             time.sleep(1)
                      
              video_writer.write(newframe)
              self.webframe=newframe
      
              #time.sleep(1)  
        # handle interrupts
        except KeyboardInterrupt:
            print 'interrupted, exiting'

        # exit and close web server
        print "exiting..."
        web.close()
        #Shang uncommented here.

        video_writer.release()  
     def run(self):

        yawangle=0.0
        last_mode=None
        try:
            #print "starting web server"
            # initialise web server which will display final image
            #web = Webserver(balloon_config.config.parser, (lambda : self.frame_filtered))
            #web=Webserver(balloon_config.config.parser,(lambda:self.frame))

                 
            print "initialising camera"
            # initialise video capture
            camera = balloon_video.get_camera()
            

            print "Ready to go!"
            
            while(True):
              #print(self.vehicle)
              if self.vehicle is None:
                #print('0.5')
                self.vehicle=self.api.get_vehicles()[0]
                #print('1')
              #print('1.5')
              
              # get a frame
              _, frame = camera.read()
              self.balloon_found, xpos, ypos, size = balloon_finder.analyse_frame(frame)
              
              self.frame=frame

              #deltatime=time.time()-self.timelast
              #self.timelast=time.time()
              #print "time difference:",deltatime
              #print "velocity x:",self.vehicle.velocity[0]
              
                
              if self.vehicle.mode.name=="alt_hold":
                 last_mode="alt_hold"
                 print "Overriding a RC channel" 
                 self.vehicle.channel_override = {"2" : 1400}
                 self.vehicle.flush()
                 print "Current overrides are:", self.vehicle.channel_override     
                 print "Cancel override"
                 time.sleep(3)
                 #self.vehicle.channel_override={"2":0}
                 #self.vehicle.flush()   
                 #time.sleep(1)
                 self.vehicle.channel_override = {"2" : 1600}
                 self.vehicle.flush()
                 time.sleep(3)
                 '''
                 self.vehicle.channel_override = {"1":1600,"2" : 1400}
                 self.vehicle.flush()

                 time.sleep(5)
                 print "Current overrides1 are right-forward:", self.vehicle.channel_override
                 self.vehicle.channel_override = {"1":1400,"2" : 1600}
                 self.vehicle.flush()

                 time.sleep(5)
                 print "Current overrides2 are left-afterward:", self.vehicle.channel_override
                 '''

              else:
                 if last_mode=="alt_hold":
                    self.vehicle.channel_override={"1":0,"2":0}
                    self.vehicle.flush()
                    time.sleep(0.08)
                    last_mode=None 

 

              #if self.balloon_found and self.vehicle.mode.name=="GUIDED":  
              if self.vehicle.mode.name=="GUIDED":#only for testing speed command,response characteristics 
                 last_mode="GUIDED"
                 self.vel_control(0,0)
                 time.sleep(3)
  
                 print"guided mode"

                 log_filename='posstep%s' % (time.time())
                 #print 'log filename',log_filename
                 f = open(log_filename, mode='a+')
                 f.write("STEP RESPONSE LOG DATA %s\n"%(time.localtime()))
                 f.write("time\tset_vx\tvx\tset_vy\tvy\tdeltax\tdeltay\tdeltaz\t\n")
                 '''
                 vel_setx=0.3
                 vel_sety=0
                 

                 if self.vehicle.location is None:
                    print 'location is unknown in direction-x'
                 else:
                    #ref_home_location = Location(self.vehicle.location.lat,self.vehicle.location.lon,self.vehicle.location.alt)
                    home_lat=self.vehicle.location.lat
                    home_lon=self.vehicle.location.lon
                    home_alt=self.vehicle.location.alt
                 print'flying x-direction'
                 self.timelast=time.time()
                 for i in range(1, 301):
                     if self.vehicle.mode.name=="GUIDED": 
                      print'index:',i
                      deltatime=time.time()-self.timelast
                      cur_lat=self.vehicle.location.lat
                      cur_lon=self.vehicle.location.lon
                      cur_alt=self.vehicle.location.alt
                      dlat=cur_lat-home_lat
                      dlon=cur_lon-home_lon
                      dalt=cur_alt-home_alt
                      deltax = dlat * pos_latlon_to_m
                      deltay = dlon* pos_latlon_to_m
                      deltaz = dalt  
                      f.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n" % (deltatime,vel_setx,self.vehicle.velocity[0],vel_sety,self.vehicle.velocity[1],deltax,deltay,deltaz))
                      self.vel_control(vel_setx,vel_sety)
 
                      time.sleep(0.1)
                 '''
                 self.vel_control(0,0)
                 time.sleep(3)
                 
                 if self.vehicle.location is None:
                    print 'location is unknown in direction-y'
                 else:
                    #ref_home_location = Location(self.vehicle.location.lat,self.vehicle.location.lon,self.vehicle.location.alt)
                    home_lat=self.vehicle.location.lat
                    home_lon=self.vehicle.location.lon
                    home_alt=self.vehicle.location.alt
                 print'flying y-direction'
                 self.timelast=time.time()  
                 vel_setx=0
                 vel_sety=0.3
                 for i in range(1, 201):
                    if self.vehicle.mode.name=="GUIDED":
                      print'y-index:',i
                      deltatime=time.time()-self.timelast

                      cur_lat=self.vehicle.location.lat
                      cur_lon=self.vehicle.location.lon
                      cur_alt=self.vehicle.location.alt
                      dlat=cur_lat-home_lat
                      dlon=cur_lon-home_lon
                      dalt=cur_alt-home_alt
                      deltax = dlat * pos_latlon_to_m
                      deltay = dlon * pos_latlon_to_m
                      deltaz = dalt
                      f.write("%f\t%f\t%f\t%f\t%f\t%f\t%f\t%f\n" % (deltatime,vel_setx,self.vehicle.velocity[0],vel_sety,self.vehicle.velocity[1],deltax,deltay,deltaz))
                      self.vel_control(vel_setx,vel_sety)

                      time.sleep(0.1)

                 
                 self.vel_control(0,0)
                 time.sleep(3)
                    
                 print'ready to land...........'
                 while(self.vehicle.mode.name=="GUIDED"):
                         self.vehicle.mode.name="LAND"
                         self.vehicle.mode = VehicleMode("LAND")
                         self.vehicle.flush()
                         time.sleep(1)
                 while(self.vehicle.armed is True):
                         self.vehicle.armed=False
                         self.vehicle.flush()
                         time.sleep(1)

                 f.close()

  
                      #altitude_origin=self.get_mav_param('%s_MIN'  % param, 0) 
                      #print "altitude:",altitude_origin
                      #print "Location: %s" % self.vehicle.location.alt

              else:
                 if last_mode=="GUIDED":
                    last_mode=None
                    self.vel_control(0,0)


              time.sleep(0.1)
                
        # handle interrupts
        except:
            print "interrupted, exiting"

        # exit and close web server
        print "exiting..."
Ejemplo n.º 10
0
    def run(self):

        # initialise video capture
        camera = balloon_video.get_camera()

        # create trackbars for color change
        cv2.namedWindow('Colour Filters')
        cv2.createTrackbar('Hue min', 'Colour Filters', self.h_low, 255,
                           self.empty_callback)
        cv2.createTrackbar('Hue max', 'Colour Filters', self.h_high, 255,
                           self.empty_callback)
        cv2.createTrackbar('Sat min', 'Colour Filters', self.s_low, 255,
                           self.empty_callback)
        cv2.createTrackbar('Sat max', 'Colour Filters', self.s_high, 255,
                           self.empty_callback)
        cv2.createTrackbar('Bgt min', 'Colour Filters', self.v_low, 255,
                           self.empty_callback)
        cv2.createTrackbar('Bgt max', 'Colour Filters', self.v_high, 255,
                           self.empty_callback)
        cv2.createTrackbar('Save', 'Colour Filters', 0, 10, self.save_callback)

        while (True):
            # get a frame
            _, frame = camera.read()

            # Convert BGR to HSV
            hsv_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

            # get latest trackbar positions
            self.h_low = cv2.getTrackbarPos('Hue min', 'Colour Filters')
            self.h_high = cv2.getTrackbarPos('Hue max', 'Colour Filters')
            self.s_low = cv2.getTrackbarPos('Sat min', 'Colour Filters')
            self.s_high = cv2.getTrackbarPos('Sat max', 'Colour Filters')
            self.v_low = cv2.getTrackbarPos('Bgt min', 'Colour Filters')
            self.v_high = cv2.getTrackbarPos('Bgt max', 'Colour Filters')

            # use trackbar positions to filter image
            colour_low = np.array([self.h_low, self.s_low, self.v_low])
            colour_high = np.array([self.h_high, self.s_high, self.v_high])

            # Threshold the HSV image
            mask = cv2.inRange(hsv_frame, colour_low, colour_high)

            # Erode
            erode_kernel = np.ones((3, 3), np.uint8)
            eroded_img = cv2.erode(mask, erode_kernel, iterations=1)

            # dilate
            dilate_kernel = np.ones((10, 10), np.uint8)
            dilated_img = cv2.dilate(eroded_img, dilate_kernel, iterations=1)

            # Bitwise-AND mask and original image
            res = cv2.bitwise_and(frame, frame, mask=dilated_img)

            cv2.imshow('Original', frame)
            cv2.imshow('Mask', mask)
            cv2.imshow('Filtered Result', res)

            #cv2.imshow('grey_res',grey_res)
            k = cv2.waitKey(5) & 0xFF
            if k == 27:
                break

        # close all windows
        cv2.destroyAllWindows()
     def run(self):

        yawangle=0.0
        imgnum=0
        bal_rc1=self.vehicle.parameters['RC1_TRIM']
        bal_rc2=self.vehicle.parameters['RC2_TRIM']
        RC7MAX=self.vehicle.parameters['RC7_MAX']
        RC7MIN=self.vehicle.parameters['RC7_MIN']  
        RC6MIN=self.vehicle.parameters['RC6_MIN']
        last_mode=None
        gain=1.0

        deltasatx=0
        deltasaty=0  
        

        try:
            
            #web=Webserver(balloon_config.config.parser,(lambda:self.frame))
            
            fourcc = cv2.cv.CV_FOURCC(*'XVID')
            video_writer = cv2.VideoWriter('output.avi',fourcc, 1.0, (640,480))
            
            print "initialising camera"
            # initialise video capture
            camera = balloon_video.get_camera()
            
            log_gname='Guidedv%s' % (time.time())
            gf = open(log_gname, mode='w')
            gf.write("Guided velocity mode log DATA %s\n"%(time.localtime()))
            gf.write("time\t yaw(org,radians)\t yaw_angle\t objposx\t objposy\t error_total\t vx\t vy\t gain\t imgradius\t RC6VAL\n")
            gf.close

 

            print "Ready to go!"

            while(True):
                
              #print(self.vehicle)
              if self.vehicle is None:
                #print('0.5')
                self.vehicle=self.api.get_vehicles()[0]
                print('no vehicle')
              #print('1.5')

              # get a frame
              _, frame = camera.read()
              newx,newy=frame.shape[1],frame.shape[0]
              newframe=cv2.resize(frame,(newx,newy))
 
              self.frame=newframe

 
              #self.balloon_found, xpos, ypos, size = balloon_finder.analyse_frame(frame)
              self.object_found,xpos,ypos,size=self.object_find(newframe)
              #self.object_found,xpos,ypos,size=self.object_find_hough(frame)              
              #video_writer.write(newframe)
              #print xpos
              
              RC6VAL=float(self.vehicle.channel_readback['6'])
              RC7VAL=self.vehicle.channel_readback['7']  
              if RC7VAL<=0 or RC7MAX is None:
                 gain=1.0
              else:
                 gain=7.0*(RC7VAL-RC7MIN)/(RC7MAX-RC7MIN)
              
              #RC6VAL=1
              #if RC6VAL==1: 
              if RC6VAL==RC6MIN:#visual-guided    
              
                 
                 yaw_origin=self.vehicle.attitude.yaw

                 print "yaw-origin",yaw_origin

                 if self.vehicle.mode.name=="ALTHOLD":
                        last_mode="ALTHOLD"
                        vel_setx=0.5 
                        vel_sety=0
                        print "flying forward..."
                        for i in range(1, 31):
                              deltatime=time.time()-self.timelast

                              self.vel_control(vel_setx,vel_sety)
                                
                              time.sleep(0.5) 

                        print 'flying backward....'

                        self.vel_control(0,0)
                        time.sleep(5)

                        vel_setx=-0.5 
                        vel_sety=0 
                        for i in range(1, 31):
                            deltatime=time.time()-self.timelast

                            self.vel_control(vel_setx,vel_sety)
                            
                            time.sleep(0.5)

                        self.vel_control(0,0)
                        time.sleep(5)
                        print "flying end" 
                    
                 else:#non-guided mode
                      print "non-ALTHOLD"
                      if last_mode=="ALTHOLD":
                         self.vel_control(vel_setx,vel_sety)
                         time.sleep(0.5)
                         last_mode=None  
                             
                 
              else:#non-controlled  mode,land the drone
                   print "non-CONTROLLED mode"
                   
                   while(self.vehicle.mode.name=="ALTHOLD"):

                             self.vehicle.mode.name="LAND"
                             self.vehicle.mode = VehicleMode("LAND")
                             self.vehicle.flush()
                             time.sleep(1)
                   while(self.vehicle.armed is True):
                             self.vehicle.armed=False
                             self.vehicle.flush()
                             time.sleep(1)
                   
                   print "landed"
                    
              time.sleep(0.1)
              #time.sleep(1)  
        # handle interrupts
        except:
            print "interrupted, exiting"

        # exit and close web server
        print "exiting..."