NPE 在 WaypointMissionOperator.checkParameters 与 DJI Matrice 100 或 600

NPE in WaypointMissionOperator.checkParameters with DJI Matrice 100 or 600

更新

尝试加载 Android SDK sample 更新到版本 4.11 的航点任务会导致内部空指针异常

先决条件:

重现步骤:

  1. 打开示例 SDK
  2. 无人机连接后点击"Open"
  3. 点击"New Waypoint Mission Operator"
  4. 点击"Load"
  5. 应用因以下堆栈而崩溃
com.dji.sdk.sample E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.dji.sdk.sample, PID: 14107
java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.Map.get(java.lang.Object)' on a null object reference
    at dji.common.mission.waypoint.Waypoint.checkParameters(Unknown Source:15)
    at dji.common.mission.MissionUtils.checkEachWaypointValid(Unknown Source:18)
    at dji.common.mission.MissionUtils.checkWaypointMissionParameters(Unknown Source:44)
    at dji.common.mission.waypoint.WaypointMission$Builder.checkParameters(Unknown Source:10)
    at dji.internal.mission.abstraction.waypoint.WaypointMissionAbstraction.a(Unknown Source:0)
    at dji.sdk.mission.waypoint.WaypointMissionOperator.loadMission(Unknown Source:32)
    at com.dji.sdk.sample.demo.missionoperator.WaypointMissionOperatorView.onClick(:107)
    at android.view.View.performClick(View.java:6310)
    at android.view.View$PerformClick.run(View.java:24970)
    at android.os.Handler.handleCallback(Handler.java:794)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:176)
    at android.app.ActivityThread.main(ActivityThread.java:6662)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:547)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:873)

原问题

相同的代码在 P4A 上运行完美,但在 Matrice 100 / 600 上运行失败。

以下是我在 Kotlin 中编写的代码的相关部分。

  1. 创建 waypoints 的列表。
val waypointList: List<Waypoint> = data.points.map {
    val waypoint = Waypoint(it.latitude, it.longitude, it.altitude)
    waypoint.speed = 3
    waypoint.heading = 0
    waypoint.gimbalPitch = 0
    waypoint.turnMode = WaypointTurnMode.CLOCKWISE

    waypoint.actionRepeatTimes = 1
    waypoint.actionTimeoutInSeconds = 3
    waypoint.cornerRadiusInMeters = 1
    waypoint
}
  1. 创建一个 WaypointMission.Builder 对象
val mission = WaypointMission.Builder()
    .waypointList(waypointList)
    .waypointCount(waypointList.size)
    .autoFlightSpeed(10)
    .repeatTimes(1)
    .setGimbalPitchRotationEnabled(false)
    .setExitMissionOnRCSignalLostEnabled(false)
    .finishedAction(WaypointMissionFinishedAction.NO_ACTION)
    .maxFlightSpeed(13)
    .flightPathMode(WaypointMissionFlightPathMode.CURVED)
    .headingMode(WaypointMissionHeadingMode.AUTO)
    .gotoFirstWaypointMode(WaypointMissionGotoWaypointMode.POINT_TO_POINT)
  1. 任务。checkParameters()
  2. WaypointOperator.loadMission(mission.build())
  3. WaypointOperator.uploadMission()

使用 P4A:代码继续无误,然后转到航路点任务。 对于 Matrice 100,第 3 步中的 checkParameters 函数 returns 没有结果,代码只是停在这里, WaypointOperator.currentState 停留在 READY_TO_UPLOAD

我在过去 2 天里尝试了所有方法,我唯一能猜到的是我缺少 Matrice 100 需要的一些参数,但我不知道那可能是什么,也找不到文档中关于它的任何内容。

这是大疆的一个bug,但是在下个版本发布之前,他们给了我一个临时的解决方案。

After confirming, this problem only occurs when your aircraft is not mounting the camera.

So, for the temporary workaround, you can mount a camera on your drone when you using v4.11.
Also, this issue will be fixed in the coming v4.11.1 official release.