3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

DJI Dockでクラウド越しにドローンをリアルタイム制御する方法(MQTT編)

Last updated at Posted at 2025-12-10

株式会社センシンロボティクス(以下、長いのでSRと記載します)でエンジニアをしております、andy william です。本記事は、SRの2025年アドベントカレンダー11日目の記事です。
当社について興味をいただけた方は、テックブログもございますので、他の記事もお読みいただけると幸いです。

はじめに

本記事では DJI Dock と DJI Cloud API を使用して、クラウド経由で飛行中のドローンをリアルタイム制御する方法 を紹介します。

特に、

  • MQTT を使った操作権限の取得(Grab)
  • DRC(Direct Remote Control)モードへの移行
  • クラウドからのスティック操作(Roll/Pitch/Yaw/Throttle)

という「実際に飛行を動かすために最低限必要な技術ポイント」に焦点を当てています。

DJI Dock や DJI Cloud API の概要をつかみつつ、Web アプリや自社システムからドローンを自動運用したい開発者向けの内容です。

DJI DOCK とは

DJI Dock は、DJI が提供する 全自動運用ドローンステーションです。
ドローンの離着陸、バッテリー充電、データアップロード、健康チェック、遠隔制御をすべて自動化するためのハードウェアで、無人運用(BVLOS: Beyond Visual Line Of Sight)を前提としたシステムとして設計されています。

MQTT とは

MQTT(Message Queuing Telemetry Transport) は、IoT デバイス向けに設計された 軽量・低遅延のメッセージングプロトコルです。
Publish/Subscribe 方式を採用しており、サーバ(Broker)を介して双方向通信を行うのが特徴です。

クラウドとデバイスの間で 高速・低帯域でリアルタイム通信を行えるため、ドローン、センサー、ロボット、スマートホームなど幅広い分野で利用されています。

Python での MQTT 利用例(paho-mqtt)

MQTT は Python から簡単に扱うことができ、実際の IoT デバイスやドローン制御の前に試す用途としても便利です。
以下は代表的な MQTT クライアントライブラリ paho-mqtt を使ったサンプルです。

インストール

pip install paho-mqtt

① MQTT Subscribe(購読:メッセージを受け取る側)

import paho.mqtt.client as mqtt

BROKER = "test.mosquitto.org"
TOPIC = "sample/test"

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe(TOPIC)

def on_message(client, userdata, msg):
    print(f"Received message: {msg.payload.decode()} from topic: {msg.topic}")

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect(BROKER, 1883, 60)
client.loop_forever()

② MQTT Publish(配信:メッセージを送る側)

import paho.mqtt.client as mqtt
import time

BROKER = "example.com"
TOPIC = "sample/test"

client = mqtt.Client()
client.connect(BROKER, 1883, 60)

for i in range(5):
    message = f"Hello MQTT {i}"
    client.publish(TOPIC, message)
    print("Sent:", message)
    time.sleep(1)

client.disconnect()

③ ポイント解説

用語 意味
Broker MQTT のメッセージ中継サーバ。Publish を受け取り、Subscribe に送る
Topic メッセージのカテゴリ。例:drone/telemetry, dock/status
Publish Broker に対してメッセージを送信
Subscribe 特定の Topic のメッセージを購読

ドローンの「スティック操作」

ドローンを操縦する際は、

  • 通常の送信機(RCコントローラー)
  • DJI Cloud API(DRCモード)

どちらを使用しても、操作の基本は同じで 4つの軸(Roll / Pitch / Yaw / Throttle) を組み合わせて飛行します。

これら 4 つの操作軸により、ドローンは 3 次元空間で自由に移動・旋回できます。
basic_movements_multicopter.png

4つの軸(Roll / Pitch / Yaw / Throttle) を使って機体を操作します。

これら4軸でドローンは3次元空間を自由に動くことができます。

物理コントローラー(RC)のスティック配置について

本記事で説明しているスティック操作は、
一般的に最も広く利用されている「モード2」 の配置を前提としています。
(DJI 送信機もデフォルトはモード2)

左スティック:Yaw(旋回)+ Throttle(上昇/下降)

右スティック:Roll(左右移動)+ Pitch(前後移動)

動き 物理コントローラーのスティック(RC) API フィールド 補足:RC 数値と API の関係
Roll(ロール) 左右移動 右スティック 左右 roll RCの中央 = 1024(中立)、最大 ±660(364〜1684)
Pitch(ピッチ) 前後移動 右スティック 上下 pitch 1024 が中立 / –660 で後退 / +660 で前進
Yaw(ヨー) 左右旋回 左スティック 左右 yaw 1024 が中立 / –660 で左旋回 / +660 で右旋回
Throttle(スロットル) 上昇・下降 左スティック 上下 throttle 1024 が中立 / –660 で下降 / +660 で上昇

リアルタイム飛行制御の操作フロー(シーケンス図)

command-flight-working-scenes-en.png

REF: https://developer.dji.com/doc/cloud-api-tutorial/en/feature-set/dock-feature-set/drc.html#live-flight-controls-interaction-sequence-diagram

クラウドから操作権限を奪取(Grab)してドローンを制御する手順

DJI Cloud API および DJI Dock を使用して
Webアプリからリアルタイムでドローンを制御するためには、
Authority(操作権限)を取得する必要があります。

Authority は以下の用途に必須です:

  • Live Flight Controls(スティック操作)
  • ジンバル操作
  • 機体ライト・スピーカー制御
  • 緊急停止コマンド

この権限は複数クライアントで共有できず、
最初に権限を取得したクライアントが優先されます。

MQTTで操作権限を取得する:payload_authority_grab

Topic : thing/product/{gateway_sn}/services
Method: payload_authority_grab
Payload :

{
  "bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
  "data": {
    "payload_index": "39-0-7"
  },
  "tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
  "timestamp": 1654070968655,
  "method": "payload_authority_grab"
}

payload_indexには、機械の情報です。下のリンクで取得できます。
https://developer.dji.com/doc/cloud-api-tutorial/en/overview/product-support.html#enumeration-values-of-aircraft-rc-and-dock

REF : https://developer.dji.com/doc/cloud-api-tutorial/en/api-reference/dock-to-cloud/mqtt/dock/dock3/drc.html#payload-control-authority-grab

DRC モードへ入る(drc_mode_enter)

DRC(Direct Remote Control)モードは、
クラウド経由でドローンへリアルタイム指令(スティック操作など)を送るために必要な状態です。

通常の流れは以下:

  • payload_authority_grab で操作権限を取得
  • drc_mode_enter で DRC モードに入る
  • Live Flight Controls / Gimbal Controls / Payload Controls 実行

MQTT で DRC モードに入る:drc_mode_enter

Topic : thing/product/{gateway_sn}/services
Method: drc_mode_enter
Payload :

{
	"bid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
	"data": {
		"hsi_frequency": 1,
		"mqtt_broker": {
			"address": "mqtt.dji.com:8883",
			"client_id": "sn_a",
			"enable_tls": true,
			"expire_time": 1672744922,
			"password": "jwt_token",
			"username": "sn_a_username"
		},
		"osd_frequency": 10
	},
	"tid": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx",
	"timestamp": 1654070968655,
	"method": "drc_mode_enter"
}

REF : https://developer.dji.com/doc/cloud-api-tutorial/en/api-reference/dock-to-cloud/mqtt/dock/dock3/drc.html#enter-live-flight-controls-mode

MQTT でスティック制御を送信:drc_control

Topic : thing/product/{gateway_sn}/drc/down
Method: stick_control
Payload :

{
    "seq": 1,
    "method": "stick_control",
    "data": {
        "roll": 1024,
        "pitch": 1024,
        "throttle": 1024,
        "yaw": 1024,
        "gimbal_pitch": 1024
    }
}

REF : https://developer.dji.com/doc/cloud-api-tutorial/en/api-reference/dock-to-cloud/mqtt/dock/dock3/drc.html#drc-stick-control

まとめ

本記事では、DJI Dock と DJI Cloud API を用いて、
クラウド経由でドローンをリアルタイム制御するための基本フローを紹介しました。

操作権限の取得、DRC モードへの移行、そしてスティック操作という
「飛行をクラウドから動かすために欠かせない要素」を理解することで、
自社システムや Web アプリケーションへのドローン統合が一気に実現しやすくなります。

これらの技術が、皆さまのドローン自動運用や遠隔監視システムの開発に
少しでも役立てば幸いです。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?