概述

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云台角度调节滑块
图传画面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 支持一台遥控器同时管理多个机器人连接:

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,以获取最新的功能改进和问题修复。

下一步