Skip to main content

Intelligent Tracking Tutorial

Intelligent Tracking Tutorial

1. Overview

​ Intelligent tracking for fixed-wing drones refers to the use of integrated drone vision technology, deep learning technology, sensor technology, and real-time control technology to achieve automatic detection, recognition, and continuous tracking of dynamic or static targets.

2. Intelligent Tracking

2.1 Enable Intelligent Tracking

  • Get the lens required for tracking

    //Specify drone device
    val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return

    //Use wide-angle lens for recognition and tracking
    val specLensId = droneDevice.getCameraAbilitySetManger().getLenId(LensTypeEnum.WideAngle, droneDevice.getGimbalDeviceType())
  • Configure tracking parameters

    val bean = ExtendAIDetectConfigBean().apply {
    //Current scene type: Recommended to use universal scene: SCENE_TYPE_UNIVERSAL
    sceneType = AiDetectSceneTypeEnum.SCENE_TYPE_UNIVERSAL,

    //Specify AI recognition content: Refer to DetectTargetEnum values, default is null, will recognize based on specified scene
    targetTypeList = null,

    //Specify lens: Different lenses have different capabilities
    lensId= specLensId,

    //Specify enabled AI function: Refer to FuncEnum
    dfAIFunc = FuncEnum.AI_DETECT
    }

    enum class FuncEnum(val value: Int) { // AI function enumeration
    // AI recognition
    AI_DETECT(40),

    //Object tracking
    OBJECT_TRACKING(41),

    //AI recognition + object tracking
    AI_DETECT_OBJECT_TRACKING(42),
    }
  • Enable tracking command

    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 Get Recognition Results

  • Listen for recognition result reports
val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return
val key = KeyTools.createKey(AIServiceKey.KeyAiDetectTarget)
val keyManager = droneDevice.getKeyManager()

//Create AI recognition listener
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")
}
}
}

//Start listening for recognition reports
keyManager.listen(key, trackListener)
data class DetectTrackNotifyBean(
//Timestamp
var timestamp: Long = 0,

//frameId
var frameId: Int = 0,

//Resolution width
var resolutionWidth: Int = 0,

//Resolution height
var resolutionHeight: Int = 0,

//Count
var objNum: Int = 0,

//Target frame array
var infoList: List<DetectObjectBean> = emptyList(),

//Image unique ID (unique for current boot), set to 0 if no image is saved this time
var imageId: Int = 0,

//Image path, set to empty string if no image is saved this time
var imageUrl: String = "",

//Lens id
var lensId: Int = 0,
)
  • Target frame array information:

    Based on the resolution and target position information in the results, you can determine the position of the recognized target in the video frame

data class DetectObjectBean(
//Target pixel coordinate x
var startX: Float = 0f,

//Target pixel coordinate y
var startY: Float = 0f,

//Target frame width
var width: Float = 0f,

//Target frame height
var height: Float = 0f,

//Target type
var type: Int = 0,

//Target tracking type
var status: Int = 0,

//Target ID
var objectId: Int = 0,
)

2.3 Target Locking

  • Users can lock tracking targets based on recognition results, or select targets within a certain range for tracking
val droneDevice = DeviceManager.getDeviceManager().getFirstDroneDevice() ?: return
val key = KeyTools.createKey(AITrackingKey.KeyIntelligentLockStart)
val keyManager = droneDevice.getKeyManager()

//Lock parameter settings
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
)

//Start locking target
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")
}
})
  • Lock parameter description
data class TrackTargetRectBean(
//Starting point x coordinate
val startX: Float = 0F,

//Starting point y coordinate
val startY: Float = 0F,

//Width
val width: Float = 0F,

//Height
val height: Float = 0F,

//Current lens id
var lensId: Int? = null,

//Usage scene, default: SCENE_TYPE_UNIVERSAL
var sceneType: AiDetectSceneTypeEnum,

//Target ID
var objectId: Int? = 0
)

2.4 Unlock Target

To unlock a target, simply set the width and height of the tracking frame to zero

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 Stop Tracking

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

val bean = ExtendAIExitBean().apply {
//Specify the AI function to stop
dfAIFunc = FuncEnum.AI_DETECT
//Specify lens 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. Parameter Settings

3.1 Tracking Mode

Note: Tracking mode can only be set after the aircraft takes off

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, //Whether to enable tracking
var trackingType: DFTrackingTypeEnum = DFTrackingTypeEnum.STANDARD //Tracking mode
)

Fixed-wing drones support tracking modes including: standard tracking, synchronized tracking, circling tracking, etc. See DFTrackingTypeEnum

3.2 Tracking Angle

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackAngle)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//Parameter is angle value, range [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 Tracking Angle Type

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackAngleType)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//Angle type: 1 absolute angle; 2 relative angle
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 Tracking Radius

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackRadius)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//Tracking radius, unit: meters, range [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 Tracking Distance

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackDistance)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//Tracking distance, unit: meters, range [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 Tracking Circle Direction

val key = KeyTools.createKey(DFFlightPropertyKey.KeyTrackDirection)
val keyManager = DeviceManager.getDeviceManager().getFirstDroneDevice()?.getKeyManager()
//Tracking circle direction -1: clockwise; 0: automatic; 1: counterclockwise;
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. Reference Code

Please refer to Demo AIRecognizeFragment