Skip to main content

智能跟踪使用教程

智能跟踪使用教程

1.概述

​ 固定翼无人机的智能跟踪,是指借助融合无人机的视觉技术、深度学习技术、传感器技术以及实时控制技术,达成对动态或静态目标的自动检测、识别与持续追踪。

2. 智能跟踪

2.1 开启智能跟踪

  • 获取需要开启跟踪的镜头

    //指定无人机设备
    val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return

    //使用广角镜头进行识别跟踪
    val specLensId = droneDevice.getCameraAbilitySetManger().getLenId(LensTypeEnum.WideAngle, droneDevice.getGimbalDeviceType())
  • 配置跟踪参数

    val bean = ExtendAIDetectConfigBean().apply {
    //当前的场景类型:建议使用通用场景:SCENE_TYPE_UNIVERSAL
    sceneType = AiDetectSceneTypeEnum.SCENE_TYPE_UNIVERSAL,

    //可指定AI识别内容:参考DetectTargetEnum取值, 默认为空,会根据指定场景识别
    targetTypeList = null,

    //指定镜头:镜头不同,能力也存在差异
    lensId= specLensId,

    //指定开启的AI功能:参考FuncEnum
    dfAIFunc = FuncEnum.AI_DETECT
    }

    enum class FuncEnum(val value: Int) { // AI 功能枚举
    // AI识别
    AI_DETECT(40),

    //目标锁定
    OBJECT_TRACKING(41),

    //AI识别+目标锁定
    AI_DETECT_OBJECT_TRACKING(42),
    }
  • 开启跟踪指令

    val keyManager = deviceDrone?.getKeyManager()
    val createKey = KeyTools.createKey(AITrackingKey.KeyExtendIntelligentLockEnter)

    keyManager?.performAction(createKey, bean, object : CommonCallbacks.CompletionCallbackWithParam<Void> {
    override fun onSuccess(t: Void?) {
    Log.d(TAG, "[KeyExtendIntelligentLockEnter][onSuccess]")
    }

    override fun onFailure(error: IAutelCode, msg: String?) {
    Log.e(TAG, "[KeyExtendIntelligentLockEnter][onFailure][error]$error")
    }
    })

2.2 获取识别结果

  • 监听识别结果上报
val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return
val key = KeyTools.createKey(AIServiceKey.KeyAiDetectTarget)
val keyManager = droneDevice.getKeyManager()

//新建AI识别监听器
private val trackListener = object : CommonCallbacks.KeyListener<DetectTrackNotifyBean> {
override fun onValueChange(oldValue: DetectTrackNotifyBean?, newValue: DetectTrackNotifyBean) {
newValue.infoList.forEach {
val type = DetectTargetEnum.getEnglishName(DetectTargetEnum.findEnum(it.type))
Log.i(TAG, "Type:$type, $it")
}
}
}

//开始监听识别上报
keyManager.listen(key, trackListener)
data class DetectTrackNotifyBean(
//时间戳
var timestamp: Long = 0,

//frameId
var frameId: Int = 0,

//分辨率宽度
var resolutionWidth: Int = 0,

//分辨率高度
var resolutionHeight: Int = 0,

//数量
var objNum: Int = 0,

//目标框数组
var infoList: List<DetectObjectBean> = emptyList(),

//图片唯一ID(本次开机唯一),如果本次没有保存图片就置为0
var imageId: Int = 0,

//图片路径,如果本次没有保存图片就置为空字符串
var imageUrl: String = "",

//镜头id
var lensId: Int = 0,
)
  • 目标框数组信息:

    根据结果中的分辨率和目标位置信息,可以确定识别的目标在视频画面中的位置

data class DetectObjectBean(
//目标的像素坐标x
var startX: Float = 0f,

//目标的像素坐标y
var startY: Float = 0f,

//目标框宽度
var width: Float = 0f,

//目标框的高度
var height: Float = 0f,

//目标的类型
var type: Int = 0,

//目标跟踪类型
var status: Int = 0,

//目标ID
var objectId: Int = 0,
)

2.3 目标锁定

  • 用户可以根据识别的结果来锁定跟踪目标,或者框选某一范围内的目标进行跟踪
val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return
val key = KeyTools.createKey(AITrackingKey.KeyIntelligentLockStart)
val keyManager = droneDevice.getKeyManager()

//锁定参数设置
val obj = result.infoList.firstOrNull() ?: return
val bean = TrackTargetRectBean(
obj.startX, obj.startY, obj.startX + obj.width,
obj.startY + obj.height, result.lensId,
AiDetectSceneTypeEnum.SCENE_TYPE_UNIVERSAL, obj.objectId
)

//开始锁定目标
keyManager.performAction(key, bean, object : CommonCallbacks.CompletionCallbackWithParam<Void> {
override fun onSuccess(t: Void?) {
Log.d(TAG, "[KeyIntelligentLockStart][onSuccess]")
}

override fun onFailure(error: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyIntelligentLockStart][onFailure][error]$error")
}
})
  • 锁定参数说明
data class TrackTargetRectBean(
//起始点x坐标
val startX: Float = 0F,

//起始点y坐标
val startY: Float = 0F,

//宽度
val width: Float = 0F,

//高度
val height: Float = 0F,

//当前的镜头id
var lensId: Int? = null,

//使用场景,默认为:SCENE_TYPE_UNIVERSAL
var sceneType: AiDetectSceneTypeEnum,

//目标ID
var objectId: Int? = 0
)

2.4 解除锁定目标

解除锁定目标,只需要把跟踪框的宽高设置为零即可

val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return
val key = KeyTools.createKey(AITrackingKey.KeyIntelligentLockStart)
val keyManager = droneDevice.getKeyManager()

val bean = TrackTargetRectBean(0.5f, 0.5f, 0f, 0f, 0)

keyManager.performAction(key, bean, object : CommonCallbacks.CompletionCallbackWithParam<Void> {
override fun onSuccess(t: Void?) {
Log.d(TAG, "[KeyIntelligentLockStart][onSuccess]")
}

override fun onFailure(error: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyIntelligentLockStart][onFailure][error]$error")
}
})

2.5 停止跟踪

val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice()?: return
val key = KeyTools.createKey(AITrackingKey.KeyExtendIntelligentLockExit)
val keyManager = droneDevice.getKeyManager()

val bean = ExtendAIExitBean().apply {
//指定要停止的AI功能
dfAIFunc = FuncEnum.AI_DETECT
//指定镜头ID
lensId = specLensId
}


keyManager.performAction(key, func, object : CommonCallbacks.CompletionCallbackWithParam<Void> {
override fun onSuccess(t: Void?) {
Log.d(TAG, "[KeyExtendIntelligentLockExit][onSuccess]")
}

override fun onFailure(error: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyExtendIntelligentLockExit][onFailure][error]$error")
}
})

3. 参数设置

3.1 跟踪模式

注意:跟踪模式需要飞机起飞后才能设置

val key = KeyTools.createKey(DFCommonCmdKey.KeyAircraftTracking)
val bean = DFAircraftTrackingBean(true, DFTrackingTypeEnum.STANDARD)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
keyManager?.performAction(key, bean, object: CommonCallbacks.CompletionCallbackWithParam<Void> {
override fun onSuccess(t: Void?) {
Log.d(TAG, "[KeyAircraftTracking][onSuccess]")
}

override fun onFailure(error: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyAircraftTracking][onFailure][error]$error")
}
})

data class DFAircraftTrackingBean(
var enable: Boolean = true, //是否启用跟踪
var trackingType: DFTrackingTypeEnum = DFTrackingTypeEnum.STANDARD //跟踪模式
)

固定翼无人机支持的跟踪模式有:标准跟踪,同步跟踪,盘旋跟踪等,参见DFTrackingTypeEnum

3.2 跟踪角度

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackAngle)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//参数为角度值,范围[0,360]
keyManager?.setValue(key, 90f, object: CommonCallbacks.CompletionCallback {
override fun onSuccess() {
Log.d(TAG, "[KeyTrackAngle][onSuccess]")
}

override fun onFailure(code: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyTrackAngle][onFailure][error]$error")
}
})

3.3 跟踪角度类型

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackAngleType)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//角度类型:1 绝对角度;2 相对角度
keyManager?.setValue(key, 1f, object: CommonCallbacks.CompletionCallback {
override fun onSuccess() {
Log.d(TAG, "[KeyTrackAngleType][onSuccess]")
}

override fun onFailure(code: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyTrackAngleType][onFailure][error]$error")
}
})

3.4 跟踪半径

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackRadius)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//跟踪半径,单位:米,范围[200, 3000]
keyManager?.setValue(key, 2000f, object: CommonCallbacks.CompletionCallback {
override fun onSuccess() {
Log.d(TAG, "[KeyTrackRadius][onSuccess]")
}

override fun onFailure(code: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyTrackRadius][onFailure][error]$error")
}
})

3.5 跟踪距离

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackDistance)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//跟踪距离,单位:米,范围[0, 3000]
keyManager?.setValue(key, 2000f, object: CommonCallbacks.CompletionCallback {
override fun onSuccess() {
Log.d(TAG, "[KeyTrackDistance][onSuccess]")
}

override fun onFailure(code: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyTrackDistance][onFailure][error]$error")
}
})

3.6 跟踪环绕方向

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackDirection)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//跟踪环绕方向 -1:顺时针; 0:自动;1:逆时针;
keyManager?.setValue(key, 0, object: CommonCallbacks.CompletionCallback {
override fun onSuccess() {
Log.d(TAG, "[KeyTrackDirection][onSuccess]")
}

override fun onFailure(code: IAutelCode, msg: String?) {
Log.e(TAG, "[KeyTrackDirection][onFailure][error]$error")
}
})

4. 参考代码

可参考Demo AIRecognizeFragment