HarmonyOS 6.0 云台、机械臂等机械体设备与手机交互能力Mechanic Kit介绍

去年在公司得了一个大疆osmo mobile SE云台,最近出去玩的时候想着用一下拍点视频,下载了尝鲜版的DJ Mimo发现只支持Osmo Mobile 7/7P/8的连接,SE还不支持,还得用卓易通版本,由此心中好奇手机和云台控制的原理是什么,HarmonyOS 上面如何实现,于是翻文档研究发现HarmonyOS 6.0上新推出了Mechanic Kit直接提供了解决方案。
在这里插入图片描述

背景介绍

在这里插入图片描述

在智能硬件生态快速发展的当下,云台、机械臂等机械体设备已从专业领域走向消费级市场:短视频创作者用云台实现画面稳定跟踪,直播主播依赖机械臂完成多角度拍摄,工业场景中机械臂则通过手机远程操控完成精准作业。但跨设备交互的核心诉求——统一的控制接口、低适配成本、稳定的智能跟踪能力——却长期未能得到满足。

Android生态缺乏统一的机械体设备交互标准,iOS接入门槛高且接口封闭,开发者需为不同平台、不同厂商设备做大量定制化开发,用户也面临设备兼容性差、功能体验不一致的问题。在此背景下,HarmonyOS 6.0推出Mechanic Kit(机械体设备控制器API集合),version 20 起为开发者提供统一的机械体设备交互方案,解决跨设备、跨厂商的适配难题。

Android、iOS云台交互能力介绍

在HarmonyOS Mechanic Kit推出前,Android和iOS平台的云台/机械臂交互方案均存在明显短板,难以满足开发者和用户的核心需求:

Android平台

Android系统未提供统一的机械体设备交互标准,手机与云台的交互主要依赖蓝牙或USB的自定义通信协议。核心问题体现在:

  1. 碎片化严重:开发者需对接不同厂商的私有SDK,适配不同品牌云台的指令集,同一功能需为不同设备做多次开发;
  2. 智能跟踪能力弱:智能跟踪功能需开发者自行集成人脸检测算法,结合云台运动控制逻辑定制开发,开发成本高且体验参差不齐;
  3. 兼容性差:不同厂商的通信协议不互通,用户更换设备后需重新适配,体验割裂。

iOS平台

iOS对外设交互管控严格,云台设备需通过MFi(Made for iPhone/iPad)认证才能接入,核心痛点包括:

  1. 接入门槛高:MFi认证流程复杂、成本高,中小厂商难以适配;
  2. 接口封闭:系统仅开放基础蓝牙通信接口,无专用的机械体设备控制API,智能跟踪、精准轨迹控制等高级功能需基于Core Bluetooth框架从零开发;
  3. 功能拓展性有限:受限于系统权限,高级操控功能难以实现,且认证专属协议导致设备互通性差。

HarmonyOS 6 Mechanic Kit 能力架构介绍

Mechanic Kit是HarmonyOS 6.0为机械体设备控制器提供的API集合,核心围绕mechanicManager模块构建,提供完整的三方机械体设备配件集成方案,满足手机与云台、机械臂等设备的交互需求。Mechanic Kit主要提供的能力场景有:

  • 智能拍摄辅助:通过机械体设备实现人脸跟踪和物体追踪,提升拍摄质量。
  • 拍摄控制:手机作为控制终端,操控云台或机械臂等机械体设备进行精准的角度调整和运动轨迹控制。

核心定位与能力范围

Mechanic Kit覆盖机械体设备交互全流程,核心能力可分为三大模块:

能力模块 核心功能
设备连接管理 设备发现(获取已连接设备列表)、连接状态监听、设备信息查询(ID/名称/类型)
智能跟踪控制 摄像头跟踪开关、跟踪布局设置(默认/左侧/中间/右侧)、跟踪状态监听
设备状态监控 三轴角度查询、旋转轴最大范围查询、旋转轴状态监听、运动参数(最大转速/连续旋转时间)查询

运作机制

在这里插入图片描述

如上图所示,Mechanic Kit通过系统层统一管理指令传输和设备控制,无需开发者关注底层细节:

  1. 智能跟踪运作机制:相机驱动检测到人脸后,将人脸信息上报至相机服务;相机服务结合人脸位置与相机参数,将指令上报至机械体控制服务;控制服务将信息转换为转动指令,通过蓝牙下发至机械体设备。开发者仅需调用开放接口,即可完成智能跟踪全流程控制。
  2. 精准设备操控机制:应用通过Mechanic Kit接口下发控制指令(如指定旋转速度、轨迹),机械体设备接收指令后执行运动操作,指令传输链路由系统层统一管理,保障操控的精准性与实时性。

约束限制

使用Mechanic Kit需满足基础条件,确保功能正常运行:

  1. 机械体设备需符合Mechanic Kit协议标准(厂商需宣称支持该Kit);
  2. 若使用智能跟踪功能,开发设备的相机驱动需支持人脸检测,并上报符合HDI接口规范的Metadata;
  3. 开发设备需与机械体设备建立稳定蓝牙连接;
  4. 前台应用需获取相机权限,高级转动控制功能需系统应用权限;
  5. 操作范围受限于机械体设备的硬件运动限位。

Mechanic Kit接口介绍

Mechanic Kit的接口围绕“连接管理-智能跟踪-状态监控”设计,所有接口均从API version 20开始支持,核心接口及功能如下:

接口名 描述
on(type: 'attachStateChange', callback: Callback<AttachStateChangeInfo>): void 注册设备连接状态变化监听,实时感知设备连接/断开事件
off(type: 'attachStateChange', callback?: Callback<AttachStateChangeInfo>): void 取消设备连接状态监听
getAttachedMechDevices(): MechInfo[] 获取已连接的机械体设备列表(含ID、名称、类型等信息)
setCameraTrackingEnabled(isEnabled: boolean): void 启用/禁用摄像头智能跟踪功能
getCameraTrackingEnabled(): boolean 查询摄像头跟踪功能的启用状态
on(type: 'trackingStateChange', callback: Callback<TrackingEventInfo>): void 注册跟踪状态变化监听,感知跟踪启用/禁用、布局变更等事件
off(type: 'trackingStateChange', callback?: Callback<TrackingEventInfo>): void 取消跟踪状态变化监听
setCameraTrackingLayout(trackingLayout: CameraTrackingLayout): void 设置摄像头跟踪布局(默认/左侧/中间/右侧)
getCameraTrackingLayout(): CameraTrackingLayout 查询当前设备的跟踪布局配置
on(type: 'rotationAxesStatusChange', callback: Callback<RotationAxesStateChangeInfo>): void 注册旋转轴状态变化监听,感知轴启用状态、旋转限制等变化
off(type: 'rotationAxesStatusChange', callback?: Callback<RotationAxesStateChangeInfo>): void 取消旋转轴状态变化监听

上述接口覆盖了机械体设备交互的核心场景,开发者可通过简洁的接口调用完成全流程开发,无需关注底层协议适配和硬件通信细节。

Mechanic Kit 开发步骤

本节以最常用的”智能拍摄跟踪“场景,基于Mechanic Kit开发机械体设备交互应用,需遵循“开发准备-连接管理-智能跟踪控制-调试验证”的流程,以下为详细步骤:

一、开发准备

  1. 硬件准备:准备符合Mechanic Kit协议的云台/机械臂设备;若验证智能跟踪功能,开发设备(手机)的相机驱动需支持人脸检测;
  2. 环境准备:将HarmonyOS SDK更新至API version 20及以上版本;
  3. 连接准备:确保机械体设备已通过蓝牙与开发设备完成配对并建立稳定连接;
  4. 权限准备:为应用配置相机权限(用于智能跟踪),若需高级控制功能,配置对应的系统权限。

二、管理设备连接状态

设备连接状态是交互的基础,需实现连接/断开的实时感知与处理:

  1. 导入核心模块
import { mechanicManager } from '@kit.MechanicKit';
  1. 获取已连接设备列表
let savedMechanicIds: number[] = [];

try {
    const devices = mechanicManager.getAttachedMechDevices();
    console.info('Connected devices:', devices);

    devices.forEach(device => {
        console.info(`Device ID: ${device.mechId}`);
        console.info(`Device Name: ${device.mechName}`);
        console.info(`Device Type: ${device.mechDeviceType}`);
        
        // 筛选云台设备并保存ID
        if (device.mechDeviceType === mechanicManager.MechDeviceType.GIMBAL_DEVICE) {//云台枚举值: mechanicManager.MechDeviceType.GIMBAL_DEVICE
            savedMechanicIds.push(device.mechId);
            console.info(`GIMBAL_TYPE device saved ID: ${device.mechId}`);
        } else {
            console.info(`Skip non-gimbal devices: ${device.mechId}`);
        }
    });

    console.info('List of saved gimbal device IDs:', savedMechanicIds);
} catch (err) {
    console.error('Error getting attached devices:', err);
}
  1. 监听设备连接状态变化
// 定义连接状态回调函数
const attachStateChangeCallback = (info: mechanicManager.AttachStateChangeInfo) => {
    if (info.state === mechanicManager.AttachState.ATTACHED) {
        console.info('Device attached:', info.mechInfo);
        handleDeviceAttached(info.mechInfo);
    } else if (info.state === mechanicManager.AttachState.DETACHED) {
        console.info('Device detached:', info.mechInfo);
        handleDeviceDetached(info.mechInfo);
    }
};

// 注册连接状态监听
mechanicManager.on('attachStateChange', attachStateChangeCallback);

// 处理设备连接事件
function handleDeviceAttached(mechInfo: mechanicManager.MechInfo) {
    console.info(`New device is connected: ${mechInfo.mechName} (ID: ${mechInfo.mechId})`);
    savedMechanicIds.push(mechInfo.mechId);
    // 此处可添加UI更新、设备初始化等逻辑
}

// 处理设备断开事件
function handleDeviceDetached(mechInfo: mechanicManager.MechInfo) {
    console.info(`Device disconnected: ${mechInfo.mechName} (ID: ${mechInfo.mechId})`);
    savedMechanicIds = savedMechanicIds.filter(id => id !== mechInfo.mechId);
    // 此处可添加资源释放、状态重置等逻辑
}

// 无需监听时取消回调
mechanicManager.off('attachStateChange', attachStateChangeCallback);

三、控制设备智能跟踪拍摄

实现智能跟踪功能,需完成跟踪开关控制、状态监听与布局调整:

  1. 启用/禁用摄像头智能跟踪
try {
    // 检查当前跟踪状态
    const isEnabled = mechanicManager.getCameraTrackingEnabled();

    if (!isEnabled) {
        // 开启摄像头跟踪
        mechanicManager.setCameraTrackingEnabled(true);
        console.info('Camera tracking enabled');
    }

    console.info('Is tracking currently enabled:', isEnabled);
} catch (err) {
    console.error('Failed to enable camera tracking:', err);
}
  1. 监听跟踪状态变化并处理
// 定义跟踪状态回调函数
const trackingStateCallback = (eventInfo : mechanicManager.TrackingEventInfo) => {
    switch (eventInfo.event) {
        case mechanicManager.TrackingEvent.CAMERA_TRACKING_USER_ENABLED:
            console.info('The user has enabled camera tracking');
            handleTrackingEnabled();
            break;
        case mechanicManager.TrackingEvent.CAMERA_TRACKING_USER_DISABLED:
            console.info('The user has disabled camera tracking');
            handleTrackingDisabled();
            break;
        case mechanicManager.TrackingEvent.CAMERA_TRACKING_LAYOUT_CHANGED:
            console.info('Tracking layout has changed');
            handleLayoutChanged();
            break;
    }
};

// 注册跟踪状态监听
mechanicManager.on('trackingStateChange', trackingStateCallback);

// 处理跟踪启用/禁用/布局变更事件
function handleTrackingEnabled() {
    console.info('Handling camera tracking enable events');
    updateTrackingUI(true); // 更新UI展示跟踪状态
}

function handleTrackingDisabled() {
    console.info('Handling camera tracking disabled events');
    updateTrackingUI(false);
}

function handleLayoutChanged() {
    try {
        const newLayout = mechanicManager.getCameraTrackingLayout();
        console.info('New Tracking Layout:', newLayout);
        updateLayoutUI(newLayout); // 更新UI展示布局状态
    } catch (err) {
        console.error('Failed to get new layout:', err);
    }
}

// 自定义UI更新函数
function updateTrackingUI(enabled: boolean) {
    console.info('Update tracking UI status:', enabled);
    // 此处可添加按钮状态、提示文案等UI更新逻辑
}

function updateLayoutUI(layout : mechanicManager.CameraTrackingLayout) {
    console.info('Update layout UI:', layout);
    // 此处可添加布局选择器、预览界面等UI更新逻辑
}

// 取消跟踪状态监听
mechanicManager.off('trackingStateChange', trackingStateCallback);

四、调试验证

  1. 建立连接:确保机械体设备与开发设备蓝牙配对成功,且设备放置在可通信范围内;
  2. 功能验证
    • 设备列表验证:调用getAttachedMechDevices,检查返回列表是否包含目标设备;
    • 智能跟踪验证:调用setCameraTrackingEnabled(true)启用跟踪,通过getCameraTrackingEnabled确认状态为开启,打开相机后让人脸出现在画面中,验证设备是否跟随人脸转动;
  3. 结果说明:若设备列表查询成功、跟踪功能正常响应,说明开发与适配流程无误。
    在手机端应用中一般在进入页面时增加连接设备操作入口,设备连接成功后才允许继续后续操作。

总结

HarmonyOS 6.0推出的Mechanic Kit为云台、机械臂等机械体设备与手机的交互提供了统一、高效、低门槛的解决方案,相较于Android和iOS平台,核心优势体现在:

  1. 标准化接口:通过mechanicManager模块整合全流程能力,开发者无需适配不同厂商协议,大幅降低开发成本;
  2. 完整的能力体系:覆盖设备连接、智能跟踪、状态监控全场景,系统层统一管理指令传输,保障体验一致性;
  3. 生态友好性:统一的协议标准降低设备厂商适配成本,助力HarmonyOS生态下机械体设备的规模化普及。

对于开发者而言,Mechanic Kit无需关注底层协议适配和人脸检测算法集成,仅需调用简洁的API即可完成全流程开发;对于用户,标准化的交互体验解决了不同设备兼容性差的问题,提升了使用便捷性。未来,随着HarmonyOS生态的完善,Mechanic Kit有望支持更多类型的机械体设备(如工业机械臂、智能家居执行器),并进一步优化跟踪精度、操控延迟等核心体验,成为智能机械体设备交互的核心基础设施。对于开发者而言,及时接入Mechanic Kit,可快速抢占HarmonyOS生态下智能拍摄、工业控制等场景的开发先机。Mechanic Kit吸引人的是人脸检测算法与接口标准制定。

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐