概要
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 はシングルトンマネージャーパターンで構成され、主要クラスは以下の通りです:
| マネージャー | クラス名 | 機能 |
|---|---|---|
| グローバル管理 | AliusRCManager | SDK 初期化、バージョン管理、グローバル設定 |
| テレメトリ管理 | 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 | ジンバル角度調整スライダー |
| 映像伝送画面 | FPVVideoView | OSD 重畳対応の低遅延映像画面 |
| 信号インジケーター | 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 SDK | DJI MSDK | Android API | リリース日 |
|---|---|---|---|
| 1.2.0 | 5.10.0 | 29+ | 2025 Q2 |
| 1.1.0 | 5.9.0 | 29+ | 2025 Q1 |
| 1.0.0 | 5.8.0 | 29+ | 2024 Q4 |
最新の機能改善とバグ修正を取得するため、常に最新バージョンの SDK を使用することを推奨します。
次のステップ
- 統合ガイド —— Alius RC を完全なロボットシステムに統合
- 技術仕様 —— ハードウェアパラメータの確認
- DJI MSDK 5.x 公式ドキュメント —— developer.dji.com にアクセス