DJI Mobile SDK:RTK API 使用简介(Android)

本文 RTK 设置流程基于 DJI SDK 4.9 版本

<a name="97fea1c7"></a>

RTK 设置流程

设置步骤:<br />图片来源 RTK API 使用简介(iOS)<br />

  1. 检查设备是否 support RTK
  2. setRtkEnabled 设置 RTK 模块可用
  3. 设置 RTK 的信号源,目前 4.9 版本仅提供了两种信号源设置,本地基站(D-RTK) 和网络 RTK。DJI 自带的平板遥控器是有与本地基站进行对频设置信号源,但本篇的讲解主要基于网络 RTK
  4. 网络 RTK 的设置需要 千寻账号 
  5. 启用网络服务会去校验当前千寻账号是否可用
  6. 检测 RTK 服务是否成功启用

<a name="06e004ef"></a>

代码

<a name="5e435b0a"></a>

检查设备是否支持 RTK

fun isRTKSupport(): Boolean? {
    return getFlightControl()?.isRTKSupported
}

<a name="89c05f0d"></a>

启用 RTK 模块

getFlightControl()?.rtk?.setRtkEnabled(enable) { p0 -> p0.toDJIResult(djiResult) }

<a name="15d6f197"></a>

设置 RTK 信号源

getFlightControl()?.rtk?.setReferenceStationSource(ReferenceStationSource.CUSTOM_NETWORK_SERVICE){
        p0 -> p0.toDJIResult(djiResult)
}

设置 RTK 信号源为网络信号,ReferenceStationSource 所支持的信号有:

  • NONE
  • BASE_STATION
  • CUSTOM_NETWORK_SERVICE
  • UNKNOWN

设置 RTK 网络账号

在设置网络账号之前,需要知道千寻账号所包含的信息:<br />
<br />

  • 设置账号
 val settings = NetworkServiceSettings.Builder()
            .userName(userName)
            .password(psw)
            .ip(ip)
            .port(port)
            .mountPoint(mountPoint).build()


DJISDKManager.getInstance().rtkNetworkServiceProvider.customNetworkSettings = settings

启用网络 RTK 服务

1、 启用网络服务

DJISDKManager.getInstance().rtkNetworkServiceProvider.startNetworkServiceWithCompletion { djiError -> djiError.toDJIResult(djiResult) }

在启用网络账户成功之后,我们需要检测当前的账户是否可用。

2、 检测账户是否可用

DJISDKManager.getInstance().rtkNetworkServiceProvider.addNetworkServiceStateCallback {
         netWorkServiceState ->
         val state = netWorkServiceState.channelState
}

检测账户是一个监听的过程,他会不停的返回当前账户的设置状态,channelState 返回的是枚举类 NetworkServiceChannelState,这里列举几个常见的信息:

  • TRANSMITTING (已连接,即账户设置成功)
  • LOGIN_FAILURE (登录失败,账号错误或是过期)
  • AIRCRAFT_DISCONNECTED (飞机未连接)
  • DISABLED (当前不可用)
  • NETWORK_NOT_REACHABLE (当前连接设备没有网络)
  • READY (准备开始连接)
  • DISCONNECTED (服务断开)

<a name="a3c54691"></a>

检测 RTK 是否启动使用

DJI 提供了 setStateCallback 实时监听当前飞机是否正在使用 RTK 信号

getFlightControl()?.rtk?.setStateCallback {
       rtkState ->
}

 <br />rtkState 实时返回当前 RTK 情况,包括基站、定位、GPS、北斗、卫星数量等信息,但最重要的信息是判断当前 RTK 信号是否正在被使用:

rtkState.isRTKBeingUsed()

<a name="82c58241"></a>

拓展

由于电池的局限性,对于土方测量工程来说,飞完一块地表一块电池是完全不够用的,为了实现一个 feature 的完整性,我们采用断电续飞的方式,即低电量作业时返航更换电池,重新飞回到返航工作点继续剩余的飞行。但目前我们遇到的挑战是 Phantom 4 RTK 的账户信息是保存在飞机上的,更换电池时飞机就失去了 RTK 信号,这时我们需要重新设置一遍千寻的账号,重新启动 RTK 网络服务,但重复的流程会给用户带来极不友好的体验,我们需要的是在用户无感知的情况下,重新连接上 RTK 信号。

<a name="29753c30"></a>

提出解决方案

用户在第一次进入应用设置 RTK 账户时,检测当前账户可用时将用户信息保存到 SharedPreferences。每次断电开机时,我们能检测到当前飞机的连接状态,我们可以根据这个状态获取到飞机是否已连接,如果连接的话,取出第一次操作时存储的用户信息,我们自动为用户设置一遍账户,并启动 RTK 网络服务。

<a name="38164c8b"></a>

实现

  • 保存账户信息
if (networkServiceState.getChannelState() == NetworkServiceChannelState.TRANSMITTING) {
    SpManager.putString(MeshConstant.QianXunAccount.NAME, strAccount);
    SpManager.putString(MeshConstant.QianXunAccount.PASSWORD, strPassword);
    SpManager.putString(MeshConstant.QianXunAccount.HOST, strHost);
    SpManager.putString(MeshConstant.QianXunAccount.PORT, strPort);
    SpManager.putString(MeshConstant.QianXunAccount.MOUNT, strMount);
 }
  • 连接监听

在 registerSDK 时,conComponentChange 会返回当前连接无人机的状态

mDJISDKManagerCallback = new DJISDKManager.SDKManagerCallback() {
...
      
    public void onComponentChange(BaseProduct.ComponentKey componentKey, BaseComponent baseComponent, BaseComponent baseComponent1) {
    if (baseComponent1 != null) {
         baseComponent1.setComponentListener(new BaseComponent.ComponentListener() {
                 
                 public void onConnectivityChange(boolean isConnected) {
                         Log.d("TAG", "onComponentConnectivityChanged: " + isConnected);
                         notifyStatusChange(isConnected);
                    }
          });
    }
 }

这个地方为了解耦,采用了 EventBus 通知需要该状态的页面

 private void notifyStatusChange(boolean isConnected) {
        DJIProductEvent event = new DJIProductEvent();
        event.setConnect(isConnected));
        EventBus.getDefault().post(event);
  }
  • 自动注册
 
 public void onConnectEvent(DJIProductEvent event) {
    if(!event.isConnect()) return;
    //todo 实现上述设置 RTK 账号步骤
 }
© 著作权归作者所有
这个作品真棒,我要支持一下!
奇志技术团队博客 http://meshtech.co/
0条评论
top Created with Sketch.