本文 RTK 设置流程基于 DJI SDK 4.9 版本
RTK 设置流程
设置步骤:
检查设备是否 support RTK
setRtkEnabled 设置 RTK 模块可用
设置 RTK 的信号源,目前 4.9 版本仅提供了两种信号源设置,本地基站(D-RTK) 和网络 RTK。DJI 自带的平板遥控器是有与本地基站进行对频设置信号源,但本篇的讲解主要基于网络 RTK
网络 RTK 的设置需要 千寻账号
启用网络服务会去校验当前千寻账号是否可用
检测 RTK 服务是否成功启用
代码
检查设备是否支持 RTKfun isRTKSupport(): Boolean? {
return getFlightControl()?.isRTKSupported
}
启用 RTK 模块getFlightControl()?.rtk?.setRtkEnabled(enable) { p0 -> p0.toDJIResult(djiResult) }
设置 RTK 信号源getFlightControl()?.rtk?.setReferenceStationSource(ReferenceStationSource.CUSTOM_NETWORK_SERVICE){
p0 -> p0.toDJIResult(djiResult)
}
设置 RTK 信号源为网络信号,ReferenceStationSource 所支持的信号有:
NONE
BASE_STATION
CUSTOM_NETWORK_SERVICE
UNKNOWN
设置 RTK 网络账号
在设置网络账号之前,需要知道千寻账号所包含的信息:
设置账号
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 (服务断开)
检测 RTK 是否启动使用
DJI 提供了 setStateCallback 实时监听当前飞机是否正在使用 RTK 信号
getFlightControl()?.rtk?.setStateCallback {
rtkState ->
}
rtkState 实时返回当前 RTK 情况,包括基站、定位、GPS、北斗、卫星数量等信息,但最重要的信息是判断当前 RTK 信号是否正在被使用:
rtkState.isRTKBeingUsed()
拓展
由于电池的局限性,对于土方测量工程来说,飞完一块地表一块电池是完全不够用的,为了实现一个 feature 的完整性,我们采用断电续飞的方式,即低电量作业时返航更换电池,重新飞回到返航工作点继续剩余的飞行。但目前我们遇到的挑战是 Phantom 4 RTK 的账户信息是保存在飞机上的,更换电池时飞机就失去了 RTK 信号,这时我们需要重新设置一遍千寻的账号,重新启动 RTK 网络服务,但重复的流程会给用户带来极不友好的体验,我们需要的是在用户无感知的情况下,重新连接上 RTK 信号。
提出解决方案
用户在第一次进入应用设置 RTK 账户时,检测当前账户可用时将用户信息保存到 SharedPreferences。每次断电开机时,我们能检测到当前飞机的连接状态,我们可以根据这个状态获取到飞机是否已连接,如果连接的话,取出第一次操作时存储的用户信息,我们自动为用户设置一遍账户,并启动 RTK 网络服务。
实现
保存账户信息
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 账号步骤
}