概要

Alius RC の開発体系は、DJI MSDK 5.x と自社開発の Alius RC SDK の上に構築されています。MSDK 5.x は DJI ハードウェアプラットフォームとの通信基盤機能(フライトコントロール、映像伝送、ジンバル、バッテリー等)を提供し、Alius RC SDK は MSDK の上にテレメトリデータ取得、指令発行、状態同期、物理ボタンマッピングなどの高機能をラッピングし、開発者がより少ないコードでより完全な操作体験を実現できるようにします。

本文書は Android 開発経験のあるエンジニア向けで、読者が Java/Kotlin、Android 開発基礎、Gradle ビルドツールに精通していることを前提としています。

アーキテクチャ概要

┌────────────────────────────────────────────┐
│              お客様のAndroidアプリ              │
├────────────────────────────────────────────┤
│              Alius RC SDK                   │
│  ┌──────────┐ ┌──────────┐ ┌────────────┐  │
│  │テレメトリ │ │ 指令制御  │ │ キーマッピング│  │
│  │管理      │ │          │ │            │  │
│  ├──────────┤ ├──────────┤ ├────────────┤  │
│  │データ    │ │ 接続管理  │ │ UI コンポ  │  │
│  │チャネル  │ │          │ │ ーネント   │  │
│  └──────────┘ └──────────┘ └────────────┘  │
├────────────────────────────────────────────┤
│              DJI MSDK 5.x                   │
│  ┌──────────┐ ┌──────────┐ ┌────────────┐  │
│  │ Flight   │ │ Camera   │ │ Gimbal      │  │
│  │ Control  │ │ Manager  │ │ Manager     │  │
│  ├──────────┤ ├──────────┤ ├────────────┤  │
│  │ Battery  │ │ RTK      │ │ Perception  │  │
│  └──────────┘ └──────────┘ └────────────┘  │
├────────────────────────────────────────────┤
│          Android HAL / Hardware             │
└────────────────────────────────────────────┘

DJI MSDK 5.x 統合手順

1. プロジェクト依存関係の設定

app/build.gradle に依存関係を追加:

android {
    compileSdkVersion 34
    defaultConfig {
        minSdkVersion 24
        targetSdkVersion 34
    }
    packagingOptions {
        exclude 'META-INF/rxjava.properties'
    }
}

dependencies {
    // DJI MSDK 5.x
    implementation 'com.dji:dji-sdk-v5-aircraft:5.10.0'
    implementation 'com.dji:dji-sdk-v5-network:5.10.0'

    // Alius RC SDK
    implementation 'com.alius-tech:alius-rc-sdk:1.2.0'

    // 汎用依存関係
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'io.reactivex.rxjava3:rxjava:3.1.8'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.2'
}

2. Application 初期化

Application クラスを作成して SDK 登録を完了:

public class RcApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        initDjiSdk();
    }

    private void initDjiSdk() {
        // 最初に Helper.install() を呼び出して so ライブラリをロード
        Helper.install(this);

        SDKManager.getInstance().init(this, new SDKManagerCallback() {
            @Override
            public void onRegister(DJIError error) {
                if (error == DJIError.COMMON_SUCCESS) {
                    // MSDK 登録成功、Alius RC SDK を初期化
                    AliusRCManager.getInstance().init(
                        RcApplication.this,
                        new AliusRCInitCallback() {
                            @Override
                            public void onSuccess() {
                                Log.i("AliusRC", "Alius RC SDK initialized");
                            }
                            @Override
                            public void onFailure(int errorCode, String msg) {
                                Log.e("AliusRC", "Init failed: " + msg);
                            }
                        }
                    );
                }
            }

            @Override
            public void onProductDisconnect(int productId) {
                // 切断処理
            }

            @Override
            public void onProductConnect(int productId) {
                // 接続復旧処理
            }

            @Override
            public void onComponentChange(int productId, 
                BaseComponent component, ComponentChangeType type) {
                // コンポーネント変更処理
            }
        });
    }
}

3. AndroidManifest.xml 設定

<manifest xmlns:android="http://schemas.android.com/apk/res/android">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:name=".RcApplication"
        ...>

        <meta-data
            android:name="com.dji.sdk.API_KEY"
            android:value="${DJI_APP_KEY}" />

    </application>
</manifest>

Alius RC SDK API 概要

コアマネージャー

Alius RC SDK はシングルトンマネージャーパターンで構成され、主要クラスは以下の通りです:

マネージャークラス名機能
グローバル管理AliusRCManagerSDK 初期化、バージョン管理、グローバル設定
テレメトリ管理TelemetryManagerリアルタイムテレメトリデータの購読とキャッシュ
指令制御CommandManager運動制御指令の発行
接続管理ConnectionManager複数通信リンクの接続状態管理
キーマッピングKeyMappingManager物理ボタンとジョイスティックの機能マッピング
データチャネルDataChannelManagerカスタムデータ伝送チャネル

テレメトリデータの取得

// リアルタイムテレメトリデータを購読
TelemetryManager tm = AliusRCManager.getInstance().getTelemetryManager();

// バッテリー情報を購読(毎秒更新)
tm.subscribeBatteryInfo(batteryInfo -> {
    int percent = batteryInfo.getChargeRemainingInPercent();
    double voltage = batteryInfo.getVoltage();
    double temperature = batteryInfo.getTemperature();
    updateBatteryUI(percent, voltage, temperature);
});

// 飛行/運動状態を購読(200Hz 更新)
tm.subscribeAttitude(attitude -> {
    double roll = attitude.getRoll();     // ロール角
    double pitch = attitude.getPitch();   // ピッチ角
    double yaw = attitude.getYaw();       // ヨー角
    updateAttitudeDisplay(roll, pitch, yaw);
});

// GPS 位置を購読
tm.subscribeGPSSignal(gpsData -> {
    double lat = gpsData.getLatitude();
    double lng = gpsData.getLongitude();
    int satellites = gpsData.getSatelliteCount();
    updateGPSDisplay(lat, lng, satellites);
});

// 速度情報を購読
tm.subscribeVelocity(velocity -> {
    double vx = velocity.getX();  // m/s
    double vy = velocity.getY();
    double vz = velocity.getZ();
    updateSpeedDisplay(vx, vy, vz);
});

制御指令の発行

CommandManager cm = AliusRCManager.getInstance().getCommandManager();

// 基本移動制御(仮想ジョイスティック使用)
// x: 前後 (-1.0 ~ 1.0)
// y: 左右 (-1.0 ~ 1.0)
// z: 上下 (-1.0 ~ 1.0)
// yaw: 回転 (-1.0 ~ 1.0)
cm.sendMovementCommand(0.5f, 0.0f, 0.0f, 0.0f, new CommandCallback() {
    @Override
    public void onResult(CommandError error) {
        if (error == null) {
            // 指令実行成功
        } else {
            Log.e("Command", "Error: " + error.getDescription());
        }
    }
});

// 緊急ブレーキ
cm.emergencyBrake();

// 帰還(ロボットが対応している場合)
cm.startGoHome(new CommandCallback() {
    @Override
    public void onResult(CommandError error) {
        // 結果処理
    }
});

// 飛行/運動モードの設定
cm.setFlightMode(FlightMode.POSITION_HOLD, null);

物理ボタンマッピング

KeyMappingManager km = AliusRCManager.getInstance().getKeyMappingManager();

// C1 ボタンを「撮影」にマッピング
km.mapKey(PhysicalKey.C1, KeyAction.SINGLE_CLICK,
    () -> getCameraManager().capturePhoto(null));

// C2 長押しを「緊急ブレーキ」にマッピング
km.mapKey(PhysicalKey.C2, KeyAction.LONG_PRESS,
    () -> getCommandManager().emergencyBrake());

// ダイヤルをジンバルチルト制御にマッピング
km.mapWheel(WheelDirection.CW, degrees -> {
    GimbalManager gm = getGimbalManager();
    gm.rotate(GimbalAxis.PITCH, -degrees * 0.5f, null);
});

km.mapWheel(WheelDirection.CCW, degrees -> {
    GimbalManager gm = getGimbalManager();
    gm.rotate(GimbalAxis.PITCH, degrees * 0.5f, null);
});

// マッピングを有効化
km.enable();

カスタムデータチャネル

Alius RC SDK は映像ストリームから独立したカスタムデータ伝送チャネルを提供し、ロボットの状態情報報告と制御パラメータの送信に使用できます。

DataChannelManager dcm = AliusRCManager.getInstance().getDataChannelManager();

// カスタムデータ型を登録
dcm.registerDataType(1001, "CUSTOM_STATUS", CustomStatus.class);

// ロボット側にデータを送信
SensorData data = new SensorData();
data.setTimestamp(System.currentTimeMillis());
data.setTemperature(25.6);
data.setPressure(1013.2);
dcm.sendData(1001, data, new DataCallback() {
    @Override
    public void onSuccess() {
        Log.d("DataChannel", "Data sent successfully");
    }
    @Override
    public void onFailure(int errorCode) {
        Log.e("DataChannel", "Send failed: " + errorCode);
    }
});

// ロボット側から報告されたデータを受信
dcm.subscribeData(1001, customStatus -> {
    CustomStatus status = (CustomStatus) customStatus;
    updateRobotStatusUI(status);
});

UI コンポーネントライブラリ

Alius RC SDK は、リモコン操作インターフェースを迅速に構築するための既製 Android UI コンポーネントを提供します:

コンポーネントクラス名説明
仮想ジョイスティックRCJoystickViewカスタマイズ可能なスタイルのデュアルスティックコントロール
姿勢インジケーターAttitudeIndicatorViewロール、ピッチ、ヨーの表示
地図コントロールRCMapViewロボット位置と軌跡を統合した地図
テレメトリパネルTelemetryPanelViewバッテリー、速度、高度などのデータパネル
ジンバル制御GimbalControlViewジンバル角度調整スライダー
映像伝送画面FPVVideoViewOSD 重畳対応の低遅延映像画面
信号インジケーターSignalIndicatorView信号強度アイコン表示

使用例:

<com.alius.rc.ui.RCJoystickView
    android:id="@+id/leftStick"
    android:layout_width="160dp"
    android:layout_height="160dp"
    app:stickMode="throttle_yaw"
    app:stickColor="#00D4FF"
    app:baseColor="#1A1A2E" />

<com.alius.rc.ui.FPVVideoView
    android:id="@+id/fpvView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    app:showOSD="true"
    app:osdPosition="top_right" />

マルチロボット対応

Alius RC SDK は1台のリモコンで複数のロボット接続を同時管理できます:

ConnectionManager connMgr = AliusRCManager.getInstance().getConnectionManager();

// 接続中の全ロボットを取得
List<RobotInfo> robots = connMgr.getConnectedRobots();

// 指定ロボットに切り替え(以降の制御指令はこのロボットに送信)
connMgr.setActiveRobot("robot_serial_001");

// ロボット接続変更の監視
connMgr.addConnectionListener(new ConnectionListener() {
    @Override
    public void onRobotConnected(RobotInfo robotInfo) {
        Log.i("RC", "Robot connected: " + robotInfo.getName());
    }
    @Override
    public void onRobotDisconnected(RobotInfo robotInfo) {
        Log.i("RC", "Robot disconnected: " + robotInfo.getName());
    }
});

コードサンプル:完全な操作 Activity

以下は最小限で動作可能な操作 Activity の例です:

public class ControlActivity extends AppCompatActivity {

    private FPVVideoView fpvView;
    private RCJoystickView leftStick, rightStick;
    private TelemetryPanelView telemetryPanel;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_control);

        fpvView = findViewById(R.id.fpvView);
        leftStick = findViewById(R.id.leftStick);
        rightStick = findViewById(R.id.rightStick);
        telemetryPanel = findViewById(R.id.telemetryPanel);

        // ジョイスティック入力を制御指令にバインド
        bindSticks();
        // テレメトリデータ購読を開始
        startTelemetry();
        // 映像伝送画面を起動
        fpvView.startVideoFeed();
    }

    private void bindSticks() {
        CommandManager cm = AliusRCManager.getInstance()
            .getCommandManager();

        leftStick.setOnStickListener((x, y) -> {
            // 左スティック:スロットル + ヨー
            cm.setThrottle(y);
            cm.setYaw(x);
        });

        rightStick.setOnStickListener((x, y) -> {
            // 右スティック:ピッチ + ロール
            cm.setPitch(y);
            cm.setRoll(x);
        });
    }

    private void startTelemetry() {
        TelemetryManager tm = AliusRCManager.getInstance()
            .getTelemetryManager();

        tm.subscribeBatteryInfo(battery ->
            telemetryPanel.updateBattery(battery));

        tm.subscribeAttitude(attitude ->
            telemetryPanel.updateAttitude(attitude));

        tm.subscribeGPSSignal(gps ->
            telemetryPanel.updateGPS(gps));
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        fpvView.stopVideoFeed();
    }
}

デバッグとログ

Alius RC SDK はレベル別ログシステムを提供します:

// ログレベルを設定(DEBUG, INFO, WARN, ERROR)
AliusRCManager.getInstance().setLogLevel(LogLevel.DEBUG);

// カスタムログリスナーを追加
AliusRCManager.getInstance().addLogListener((level, tag, message) -> {
    if (level == LogLevel.ERROR) {
        // エラーログを処理
        uploadErrorLog(tag, message);
    }
});

// 完全なログをエクスポート
String logPath = AliusRCManager.getInstance().exportLogs();

デバッグ時は ADB でリモコンに接続してリアルタイムログを確認できます:

adb logcat -s AliusRC:D DJISDK:D

バージョン互換性

Alius RC SDKDJI MSDKAndroid APIリリース日
1.2.05.10.029+2025 Q2
1.1.05.9.029+2025 Q1
1.0.05.8.029+2024 Q4

最新の機能改善とバグ修正を取得するため、常に最新バージョンの SDK を使用することを推奨します。

次のステップ

  • 統合ガイド —— Alius RC を完全なロボットシステムに統合
  • 技術仕様 —— ハードウェアパラメータの確認
  • DJI MSDK 5.x 公式ドキュメント —— developer.dji.com にアクセス