def turn(self):
        global start
        global end
        global imu
        self.check_imu()
            
        data = imu.getIMUData()
        fusionPose = data["fusionPose"]
        yaw = math.degrees(fusionPose[2])

        heading = nav.yaw_to_heading(yaw, -90.0)
        print 'Heading: %f' % heading

        bearing = nav.get_bearing(start, end)
        print 'Bearing: ', bearing

        P = 1.2
        I = 1.3
        D = 0
        L = 200

        pid = PID.PID(P, I, D)

        pid.SetPoint = bearing
        pid.setSampleTime(0.01)
        motor_val = 0

        thresh_up = 0.7*MAX_SPEED
        thresh_lo = 0.12*MAX_SPEED
        i = 0
        while not self.stopped():
            i += 1
            
            if abs(360.0 + heading - bearing) < abs(heading - bearing):
                feedback = heading + 360.0
            else:
                feedback = heading
        
            pid.update(feedback)
            output = pid.output

            motor_val += (output - (1/i))
            print 'Output: %f' % output 

            if output >= 0.0:
                if output > thresh_up:
                    drive = int(thresh_up)
                elif output < thresh_lo:
                    drive = int(thresh_lo)
                else:
                    drive = int(output)
            else:
                if output < -thresh_up:
                    drive = int(thresh_up)
                elif output > -thresh_lo:
                    drive = int(thresh_lo)
                else:
                    drive = int(-output)
        
            if output > 0.0:
                motors.motor1.setSpeed(drive)
                motors.motor2.setSpeed(-drive)
            elif output < 0.0:
                motors.motor1.setSpeed(-drive)
                motors.motor2.setSpeed(drive)

            self.check_imu()

            data = imu.getIMUData()
            fusionPose = data["fusionPose"]
            yaw = math.degrees(fusionPose[2])
            heading = nav.yaw_to_heading(yaw, -90.0)
            print 'Heading: %f' % heading
            print 'Bearing: ', bearing

            if abs(heading - bearing) < 1.0:
		print "Hit bearing angle"
                break

            sleep(0.1)
            motors.setSpeeds(0, 0)      
    def drive(self):
        global start
        global end
        global imu
        self.check_gps()
        self.check_imu()

        self.last_waypoint = start
        current_timestamp = time.time() # gpsp.get_timestamp()
        self.last_waypoint.set_timestamp(current_timestamp)
            
        data = imu.getIMUData()
        fusionPose = data["fusionPose"]
        yaw = math.degrees(fusionPose[2])
 
        heading = nav.yaw_to_heading(yaw, -90.0)
        print 'Heading: %f' % heading

        bearing = nav.get_bearing(start, end) 
        print 'Bearing: ', bearing

        P = 1.2
        I = 1
        D = 0
        L = 200

        pid = PID.PID(P, I, D)

        pid.SetPoint=bearing
        pid.setSampleTime(0.01)
        motor_val = 0

        thresh_up = 0.35*MAX_SPEED
        thresh_lo = 0.2*MAX_SPEED

        while not self.stopped():
            print nav.get_distance(self.last_waypoint, end)
            
	    if nav.get_distance(self.last_waypoint, end) < 5.0:
		print "Hit waypoint"
                break
            
            if abs(360.0 + heading - bearing) < abs(heading - bearing):
                feedback = heading + 360.0
            else:
                feedback = heading
        
            pid.update(feedback)
            output = pid.output

            if output >= 0.0:
                speed = thresh_up - output/4.0
            else:
                speed = thresh_up + output/4.0

            if speed < thresh_lo:
                drive = int(thresh_lo)
            else:
                drive = int(speed)

            if abs(heading - bearing) < 2.0:
                motors.motor1.setSpeed(int(1.2*thresh_up))
                motors.motor2.setSpeed(int(thresh_up))
                print 'Both'
            elif output > 0.0:
                motors.motor1.setSpeed(int(1.2*thresh_up))
                motors.motor2.setSpeed(drive)
  
                print 'Left'
            elif output < 0.0:
                motors.motor1.setSpeed(int(drive))
                motors.motor2.setSpeed(int(thresh_up))
                print 'Right'

            self.check_gps()
            self.check_imu()
            self.estimate_position()

            data = imu.getIMUData()
            fusionPose = data["fusionPose"]
            yaw = math.degrees(fusionPose[2])
            heading = nav.yaw_to_heading(yaw, -90.0)
            print 'Heading: %f' % heading
            bearing = nav.get_bearing(self.last_waypoint, end) 
            print 'Bearing: ', bearing

            sleep(0.1)
            motors.setSpeeds(0, 0)
Beispiel #3
0
        print 'Have IMU reading'

        current_timestamp = time.time() # gpsp.get_timestamp()
        last_waypoint.set_timestamp(current_timestamp)
        data = imu.getIMUData()

        while not location is None:
            print 'Next lat/lng: ', next_waypoint.latitude, ', ', next_waypoint.longitude
            print 'Read lat/lng (moving avg): ', location[0], ', ', location[1]
#	    print location[0], ',',  location[1]
            
            fusionPose = data["fusionPose"]
            yaw = math.degrees(fusionPose[2])
            print 'Read yaw: %f' % math.degrees(fusionPose[2])

            heading = nav.yaw_to_heading(yaw, -90.0)
            print 'Heading: %f' % heading

            current_timestamp = time.time() # gpsp.get_timestamp()
            estimator.set_state(last_waypoint.latitude, last_waypoint.longitude, 0, last_waypoint.timestamp) 
            estimator.k_filter(location[0], location[1], 2, current_timestamp)
            last_waypoint = gps_obj.GPS(estimator.lat, estimator.long)
            last_waypoint.set_timestamp(current_timestamp)
            print 'Filtered lat/lng: ', last_waypoint.latitude, ', ', last_waypoint.longitude
 #           print last_waypoint.latitude, ', ', last_waypoint.longitude

            bearing = nav.get_bearing(last_waypoint, next_waypoint)
            distance = nav.get_distance(last_waypoint, next_waypoint)

            print 'Bearing: ', bearing, ' Distance: ', distance
            print '------------------'