智能跟踪使用教程
智能跟踪使用教程
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