2017-02-05 1 views
0

Hey ya'll also ich versuche eine DJIWaypointMission zu starten und erhalte einen Fehler, wenn ich "startMissionExecutionWithCompletion" anrufe. Ich habe die Mission erfolgreich auf die Drohne mit prepareMission hochgeladen.DJI SDK "Noch nicht aufgenommener Zielpunkt." Fehlercode: -5010

Der Fehler, der es mir gibt, ist "Heimatpunkt noch nicht aufgezeichnet." Ich habe mir die Dokumentation für eine Methode zum Setzen eines Referenzpunktes angeschaut und nichts gefunden und habe die aufgelisteten Methoden des DJIMissionManager-Objekts sowie das DJIWayPointObject vergeblich durchsucht. Ich habe auch versucht, die "aircraftLocation" aus dem aktuellen Zustand der Drohne hinzuzufügen.

Unten ist der Code.

import UIKit 
import MapKit 
import CoreLocation 
import DJISDK 
import Foundation 

class FlyToPointsViewController: DJIBaseViewController, DJIFlightControllerDelegate, DJIMissionManagerDelegate { 

    @IBOutlet weak var mapView: MKMapView! 

    var mission: DJIWaypointMission? = nil 
    var flightController: DJIFlightController?=nil 
    var missionCoordinates=[CLLocationCoordinate2D]() 
    var allSteps = [DJIWaypoint]() 
    var missionManager: DJIMissionManager?=nil 
    var currentState: DJIFlightControllerCurrentState?=nil 

    override func viewDidAppear(animated: Bool) { 
     let alertController = UIAlertController(title: "Hello Team", message: 
      "There are quite a few easter eggs hidden away in here. Hopefully you find them and have a good laugh. Sorry I couldn't make it to test, the mountains are calling. But I put alot of time into this so hopefully it works as expected. I didn't add a return to home functionality to make this a bit spicy for ya so make sure your last point is near you other wise you're gonna do a bit of walking... Cheers ", preferredStyle: UIAlertControllerStyle.Alert) 
     alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil)) 
     self.presentViewController(alertController, animated: true, completion: nil) 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     //initialize our aircraft 
     mapView.delegate=self 

     let aircraft: DJIAircraft? = self.fetchAircraft() 
     if aircraft != nil { 
      //makes the view controller watch for particular functions like the flight controller one below 
      aircraft!.delegate = self 
      aircraft!.flightController?.delegate = self 
     } 
     else{ 
      print("aircraft not found") 
     } 

     self.missionManager=DJIMissionManager.sharedInstance() 
     self.missionManager?.delegate=self 

     //initialize core location to put mapp on our location 
     let manager = CLLocationManager() 
     if CLLocationManager.authorizationStatus() == .NotDetermined { 
      manager.requestAlwaysAuthorization() 
     } 


     //start uploading location into manager object so we can use .location method 
     if CLLocationManager.locationServicesEnabled() { 
      manager.startUpdatingLocation() 
     } 

     //let location = manager.location!.coordinate; //get ipads current location and turn it into a coordinated 

     let location = CLLocationCoordinate2DMake(40.0150, -105.2705) 

     let region = MKCoordinateRegionMakeWithDistance(location, 7000, 7000) //create a square region using center point and size of square 
     mapView.region = region //tells the mapview to center itself around this region 

     // Do any additional setup after loading the view. 


    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 
    override func viewWillDisappear(animated: Bool) { 

     let aircraft: DJIAircraft? = self.fetchAircraft() 
     if aircraft != nil { 
      if aircraft!.flightController?.delegate === self { 
       aircraft!.flightController!.delegate = nil 
      } 
     } 

    } 



    @IBAction func revealRegionDetailsWithLongPressOnMap(sender: UILongPressGestureRecognizer) { 
     if sender.state != UIGestureRecognizerState.Began { return } 
     let touchLocation = sender.locationInView(mapView) 
     let locationCoordinate = mapView.convertPoint(touchLocation, toCoordinateFromView: mapView) 
     self.missionCoordinates.append(locationCoordinate) 

     print("Tapped at lat: \(locationCoordinate.latitude) long: \(locationCoordinate.longitude)") 
     let annotation = CustomMissionPressLocation(location: locationCoordinate) 
     mapView.addAnnotation(annotation) 
    } 

    //Mark: - Functions Called from Button Presses 
    @IBAction func clearCoordinates(sender: AnyObject) { 

     self.missionCoordinates=[] 
     mapView.removeAnnotations(mapView.annotations) 

    } 


    @IBAction func startMission(sender: AnyObject) { 
     if (!self.missionCoordinates.isEmpty){ 
      print("start Mission Attempted") 
      self.mission = DJIWaypointMission() 
      self.mission!.autoFlightSpeed=10 
      self.mission!.maxFlightSpeed=15 
      self.mission!.exitMissionOnRCSignalLost=true 
      let waypoint = DJIWaypoint(coordinate: (self.currentState?.aircraftLocation)!) 

      waypoint.altitude=15 
      waypoint.speed=10 
      waypoint.heading=0 
      waypoint.actionRepeatTimes = 1 
      waypoint.actionTimeoutInSeconds = 60 
      waypoint.cornerRadiusInMeters = 5 
      waypoint.turnMode = DJIWaypointTurnMode.Clockwise 
      self.mission!.addWaypoint(waypoint) 

      for locations in self.missionCoordinates{ 
       let waypoint = DJIWaypoint(coordinate: locations) 
       waypoint.altitude=15 
       waypoint.speed=10 
       waypoint.heading=0 
       waypoint.actionRepeatTimes = 1 
       waypoint.actionTimeoutInSeconds = 60 
       waypoint.cornerRadiusInMeters = 5 
       waypoint.turnMode = DJIWaypointTurnMode.Clockwise 

       self.mission!.addWaypoint(waypoint) 
      } 
      let waypointStep = DJIWaypointStep(waypointMission: self.mission!) 


     self.startWayPointMission() 
     } 

     else{ 
      let alertController = UIAlertController(title: "Mission Error", message: 
       "you haven't added any waypoints ya dingus", preferredStyle: UIAlertControllerStyle.Alert) 
      alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil)) 
      self.presentViewController(alertController, animated: true, completion: nil) 

     } 
    } 

    //avoids a bunch of knuckleheads from sending the drone to china 
    func missionIsntTooFar()-> Bool{ 
     let startLoc=self.currentState?.aircraftLocation 
     let locations = self.missionCoordinates 
     //let startLoc=locations[0] 

     for locs in locations{ 
      let distance = MKMetersBetweenMapPoints(MKMapPointForCoordinate(startLoc!), MKMapPointForCoordinate(locs)) 
      if distance > 4000{ 
       return false 
      } 
     } 
     return true 
    } 
    func startWayPointMission() { 
     if self.missionIsntTooFar(){ 
      self.missionManager?.prepareMission(self.mission!, withProgress: nil, withCompletion: {[weak self] 
       (error: NSError?) -> Void in 
       if error == nil { 

        print("uploaded") 

        print(String(self?.missionManager?.isMissionReadyToExecute)) 
        self?.missionManager?.startMissionExecutionWithCompletion({[weak self] 
         (error: NSError?)->Void in 

         if error == nil{ 
          print("mission started") 
         } 
         else{ 
          print("error: \(error!)") 
         } 
         }) 
       } 
       else { 
        self?.showAlertResult("mission upload failed \(error!)") 
       } 
       }) 
     } 

     else{ 
      mapView.removeAnnotations(mapView.annotations) 

      let alertController = UIAlertController(title: "Mission is too far", message: 
       "you're trying to fly the drone too far ya knucklehead", preferredStyle: UIAlertControllerStyle.Alert) 

      alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.Default,handler: nil)) 
      self.presentViewController(alertController, animated: true, completion: nil) 
     } 

    } 

    //Mark: - Flight Controller Delegate Methods 

    func flightController(fc: DJIFlightController, didUpdateSystemState state: DJIFlightControllerCurrentState) { 
     self.flightController=fc 
     self.currentState=state 
    } 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using segue.destinationViewController. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

} 
extension FlyToPointsViewController: MKMapViewDelegate{ 
    func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? { 
     let annotationView = DroneAnnotationView(annotation: annotation, reuseIdentifier: "Attraction") 
     annotationView.canShowCallout = false //we're going to customize the callout 
     return annotationView 
    } 

} 

Ich bin seit mehreren Stunden stecken geblieben und hatte gehofft, dass jemand das vorher gesehen hatte. Wie immer wenn und wenn ich das Problem löse werde ich die Lösung hier und auf DJIs Forum posten.

Ich rufe es für die Nacht obwohl.

Prost

+0

Hmmm ziemlich cool dji hat eine API. –

+0

Ja. Es ist wirklich ziemlich mächtig. Wenn Sie wirklich in die Materie einsteigen möchten, können Sie die Matrize für satte 3.000 kaufen, und Sie können den Bordcomputer und das Leitsystem codieren. Oder Sie gehen mit dem 3DR-Solo, das Sie in Python programmieren können, und kommt mit einem programmierbaren Bordcomputer mit leicht zugänglichen Ein- und Ausgängen –

Antwort

0

So erscheinen zwei Dinge gewesen

A) falsch

self.flightController?.setHomeLocationUsingAircraftCurrentLocationWithCompletion(nil) 


self.mission!.finishedAction=DJIWaypointMissionFinishedAction.GoHome 

B) hat

auch die Drohne weg genommen haben zu haben, bevor Sie die Mission hochladen Rufen Sie daher

 self.flightController?.takeoffWithCompletion({[weak self] 

bevor Sie versuchen, die Mission hochzuladen.

P.S. Aus irgendeinem Grund musst du es mindestens zwei Wegpunkten geben, damit es eine gültige Mission ist.

Prost

0

Ich hatte noch nie das Flugzeug zu Hause Punkt manuell zu etablieren. Aber Sie müssen warten, bis die Drohne eine ausreichende GPS-Korrektur erhalten hat, damit sie sich selbst einstellen kann.

Wenn Sie die Methode DJIFlightControllerDelegate didUpdate: state implementieren, können Sie state.homeLocation überprüfen, um festzustellen, ob sie bereits festgelegt wurde.

Sie können auch eine Mission auf die Drohne vor dem Start hochladen, nur nicht die Rotoren hochdrehen. Es wird das für Sie tun, wenn Sie die Mission starten.

Verwandte Themen