🚁 DJI Mini 3 を飛ばすKotlin

📸 3Dスキャン 🧊 3D で見る IDE でコードを見る エミュレータ 生成AIの作品
読み込み後 数秒で自動的に離陸します。スティックを触ると手動に切り替わります。
3D で飛行を見る(実行中の行つき)→

いま動いているもの

ブラウザの中だけで、Kotlin で書かれた Android アプリが動いています。Android SDK も JVM も使っていません (ソースをその場で構文解析して構文木を辿って実行しています)。機体は DJI Mini 3 の飛行モデルで、自動飛行デモは次の順に回り続けます。

自分で飛ばす

DJI Mobile SDK V5 と同じ書き方

クラス名・メソッド名・引数は、本物の com.dji:dji-sdk-v5-aircraft:5.15.0 のバイトコードを javap で読んで合わせてあります。下は実際に動いているコードの一部です。

// 離陸(DJI 公式サンプルと同じ形)
FlightControllerKey.KeyStartTakeoff.create().action({
    Toast.makeText(this, "離陸します", Toast.LENGTH_SHORT).show()
}, { e: IDJIError -> Log.e("MSDK", e.description()) })

// 仮想スティックで速度を送る(-660〜660)
val vs = VirtualStickManager.getInstance()
vs.getLeftStick().setVerticalPosition(420)     // 上昇
vs.getRightStick().setVerticalPosition(520)    // 前進

// 値はキーで読む/監視する
val loc = KeyManager.getInstance()
        .getValue(KeyTools.createKey(FlightControllerKey.KeyAircraftLocation3D))

機体(DJI Mini 3 の公表値で計算)

最大速度16 m/s(無風・スポーツ)
上昇 / 下降5 m/s / 3.5 m/s
高度制限120 m
飛行時間38 分(2453 mAh)— 電池はその割合で減ります
風既定 1.8 m/s の横流れつき

本物の SDK は動いていません。MSDK V5 は 6664 個のコンパイル済みクラスと 242 MB の ARM ネイティブ・ライブラリでできていて、 実機と USB / Wi-Fi でつながることが前提です。ここでは API の形だけを合わせ、中身を飛行モデルに置きかえています。 実機(Mini 3 は MSDK V5 の対応機)を飛ばすには Android 実機・DJI の App Key・RC-N1 が要ります。