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

在 DJI SDK 4.9 中增加了对 Phantom 4 RTK这款设备的支持。我们第一时间在业务上使用了基于网络 RTK 的 Phantom 4 RTK 。本文介绍 DJI SDK 中如何配置 RTK。

RTK 设置流程

总体步骤如下图所示:

  1. 检查设备是否支持 RTK
  2. 检查是否启用 RTK 模块,设置启用 RTK 模块。RTK 模块也可以关闭,关闭后无人机使用普通的 GPS 卫星定位。
  3. 设置 RTK 信号源。目前 DJI 无人机支持两种 RTK 信号源:本地基站(D-RTK 2)和网络 RTK。需要强调的是目前 DJI 的网络 RTK 只支持千寻网络 RTK。千寻网络 RTK 目前只在国内有信号。因此目前目前还不支持在海外使用网络 RTK 。
  4. 信号源选择了网络 RTK 后,配置千寻提供的账户密码。目前千寻厘米级的网络 RTK 一个月服务费 400,包年 3600。
  5. 启动网络 RTK 服务。启动服务后需要等待千寻下播差分信号,因此虽然 RTK 服务启动成功,但并不是立刻就能获得高精度 RTK 定位,还需要等待一段时间。
  6. 检测 RTK 状态,检查 RTK 是否已经成功启用。 # 代码 ## 设备是否支持 RTK 没有一个状态直接表示是否支持 RTK,只能通过能否获得 DJIRTK 实例判断:
if DJISDKManager.aircraft?.flightController?.rtk == nil {
    // 不支持 RTK 设置
}

如果 flightController 上的 rtk 属性不为 nil,那么说明设备支持 rtk 设置。

启用 RTK 模块

通过 DJIRTK 实例设置:

- (void)setRTKEnabled:(BOOL)enabled withCompletion:(DJICompletionBlock)completion;

- (void)getRTKEnabledWithCompletion:(void (^)(BOOL enabled, NSError *_Nullable error))completion;

与其他设备不同,Phantom 4 RTK 即使 RTK 模块处于关闭状态,如果卫星信号足够好,无人机依然会同步 RTK 坐标给 sdk。但是飞控不会使用这个坐标导航。

设置 RTK 信号源类型:DJIRTKReferenceStationSource

和前面一样在 DJIRTK 实例上进行设置,有一个枚举,目前支持两种 RTK 信号源:本地基站和网络 RTK。

/**
 *  Sets the reference station source that provides real-time corrections for the
 *  RTK air system. It is only supported by Phantom 4 RTK. For Matrice 210 RTK and
 *  Matrice 600 series, the reference station is always the physical base station.
 */
- (void)setReferenceStationSource:(DJIRTKReferenceStationSource)source withCompletion:(DJICompletionBlock)completion;

/**
 *  All the possible state of `DJIRTKReferenceStationSource`.
 */
typedef NS_ENUM(uint8_t, DJIRTKReferenceStationSource) {

    /**
     *  RTK is using the D-RTK 2 base station as the reference station.
     */
    DJIRTKReferenceStationSourceBaseStation,

    /**
     *  RTK is using third-party network service as the reference station. The network
     *  service should use  NTRIP(Networked Transport of RTCM via  Internet Protocol).
     */
    DJIRTKReferenceStationSourceCustomNetworkService,

    DJIRTKReferenceStationSourceUnknown = 0xFF,
};

设置千寻网络账号:DJIRTKNetworkServiceProvider

RTK 网络设置相关的对象不在 DJIRTK 对象里,直接定义在 DJISDKManager 中:DJISDKManager.rtkNetworkServiceProvider()
DJIRTKNetworkServiceProvider 负责网络 RTK 服务的账户配置、服务启动停止、状态监听。

账户设置:DJIRTKNetworkServiceSettings

networkServiceSettings() 可以获取配置的账户信息:

let setting = DJISDKManager.rtkNetworkServiceProvider().networkServiceSettings()

为了保证网络服务配置在运行过程中不被意外更改,DJI 使用了与 OC 中相似的策略,DJIRTKNetworkServiceSettings 上的属性都是只读的,只有 DJIMutableRTKNetworkServiceSettings 对象才可以设置属性:

 DJIMutableRTKNetworkServiceSettings : DJIRTKNetworkServiceSettings
/**
 *  The IP address or the domain name of the server that provides RTK network
 *  services.
 */ (nonatomic, readwrite) NSString *serverAddress;

/**
 *  千寻 RTK 的坐标系通过连接的端口来区分,有三个端口:ITRF 8001,WGS 8002,CGCS 8003
 */ (nonatomic, readwrite) int port;
 (nonatomic, readwrite) NSString *userName;
 (nonatomic, readwrite) NSString *password;

/**
 *  Mountpoint of the network service, which is a source ID for every streamed
 *  NtripSource.
 */ (nonatomic, readwrite) NSString *mountpoint;

通过 setNetworkServiceSettings 方法设置:

let setting = DJIMutableRTKNetworkServiceSettings()
setting.userName = usernameLabel.text.orEmpty
setting.password = passwordLabel.text.orEmpty
setting.serverAddress = serverAddressLabel.text.orEmpty
setting.port = Int32(portLabel.tag)
setting.mountpoint = mountPointLabel.text.orEmpty
DJISDKManager.rtkNetworkServiceProvider().setNetworkServiceSettings(setting)

启动网络 RTK 服务

启动网络服务的方法也定义在 DJIRTKNetworkServiceProvider 上:

DJISDKManager.rtkNetworkServiceProvider().startNetworkService(completion: { (error) in
    if let error = error {
        // 命令执行失败
    }
})

DJISDKManager.rtkNetworkServiceProvider().stopNetworkService(completion: { (error) in
    if let error = error {
        // 命令执行失败
    }
})

检测网络 RTK 是否成功启动

DJIRTKNetworkServiceProvider 上提供了方法监听网络服务的状态变化:

- (void)addNetworkServiceStateListener:(id)listener
                                 queue:(nullable dispatch_queue_t)queue
                                 block:(DJIRTKNetworkServiceStateBlock)block;

- (void)removeNetworkServiceStateListener:(id)listener;

每次状态变化都会返回 DJIRTKNetworkServiceState 实例:

 DJIRTKNetworkServiceState : NSObject<NSCopying>

/**
 *  The state of the channel from the aircraft to the server that provides RTK
 *  network service.
 */ (nonatomic, readonly) DJIRTKNetworkServiceChannelState channelState;

/**
 *  The encountered error if any when building up the channel from the aircraft to
 *  the server  that provides RTK network service.
 */ (nonatomic, nullable, readonly) NSError *error;

DJIRTKNetworkServiceState 实例中真正代表连接的状态的是枚举 DJIRTKNetworkServiceChannelState:

extension DJIRTKNetworkServiceChannelState {
    var name: String {
        switch self {
        case .disabled:
            return "不可用"
        case .networkNotReachable:
            return "网络连接失败"
        case .aircraftDisconnected:
            return "未连接飞行器"
        case .loginFailure:
            return "登录失败"
        case .ready:
            return "准备开始连接"
        case .transmitting: 
            return "已连接"
        case .disconnected:
            return "服务器断开连接"
        case .unknown:
            return "未知"
        }
    }
}

当 DJIRTKNetworkServiceChannelState 的值为 transmitting 时,表示网络 RTK 服务已经成功启用了。

RTK 详细状态信息

RTK 模块的具体状态值都在 DJIRTKState,包含了定位,定位策略,卫星信号接收的情况。通过设置 DJIRTK 中的 delegate 方法可以获得 DJIRTKState:

 DJIRTK : NSObject

/**
 *  DJI RTK delegate.
 */(nonatomic, weak) id<DJIRTKDelegate> delegate;



 DJIRTKDelegate <NSObject>

- (void)rtk:(DJIRTK *_Nonnull)rtk didUpdateState:(DJIRTKState *_Nonnull)state;

- (void)rtk:(DJIRTK *_Nonnull)rtk didUpdateBaseStationBatteryState:(DJIRTKBaseStationBatteryState *)state;

- (void)rtk:(DJIRTK *_Nonnull)rtk didUpdateReferenceStationSource:(DJIRTKReferenceStationSource)source;

DJIRTKState 中的状态信息比较多了,感兴趣的可以自己去看一下。下面提到的 DUXRTKStatusViewController 里的信息都是从 DJIRTKState 获取的。
DJIRTKState 中有一个 isRTKBeingUsed 特别有用,可以通过这个值判断 RTK 是否在使用中。

DUXRTKStatusViewController

在 DJIUX 中还增加了展示 RTK 状态信息的控件:DUXRTKStatusViewController。不过这个界有点不太美观:

© 著作权归作者所有
这个作品真棒,我要支持一下!
奇志技术团队博客 http://meshtech.co/
1条评论

牛逼

top Created with Sketch.