1

嘿你们,所以我试图启动一个 DJIWaypointMission 并且当我调用“startMissionExecutionWithCompletion”时出现错误我显然已经使用 prepareMission 成功地将任务上传到无人机。

它给我的错误是“尚未记录主页点”。我查看了有关设置起始点的方法的文档,但没有找到任何东西,并且我已经扫描了 DJIMissionManager 对象以及 DJIWayPointObject 的列出方法,但无济于事。我还尝试添加取自无人机当前状态的“aircraftLocation”。

下面是代码。

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
    }

}

我已经被困了几个小时,希望有人以前见过这个。与往常一样,当我解决问题时,我会在此处和 DJI 论坛上发布解决方案。

我打电话给它的夜晚。

干杯

4

2 回答 2

0

我从来不用手动建立飞机的返航点。但是,您确实需要等到无人机获得足够的 GPS 定位后才能自行设置。

如果您实现了 DJIFlightControllerDelegate didUpdate:state 方法,您可以检查 state.homeLocation 以查看它是否已设置。

此外,您可以在起飞前将任务上传到无人机,只是不要旋转旋翼。当你开始任务时,它会为你做这件事。

于 2017-09-17T00:07:27.937 回答
0

所以有两件事似乎是错误的

一个)

    self.flightController?.setHomeLocationUsingAircraftCurrentLocationWithCompletion(nil)


self.mission!.finishedAction=DJIWaypointMissionFinishedAction.GoHome

二)

无人机也必须起飞才能上传任务,因此请致电

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

在尝试上传任务之前。

PS 出于某种原因,你需要给它至少两个航路点才能让它成为一个有效的任务。

干杯

于 2017-02-27T20:10:17.377 回答