博客 / 詳情

返回

HarmonyOS 6.0 雲台、機械臂等機械體設備與手機交互能力Mechanic Kit介紹

HarmonyOS 6.0 雲台、機械臂等機械體設備與手機交互能力Mechanic Kit介紹

去年在公司得了一個大疆osmo mobile SE雲台,最近出去玩的時候想着用一下拍點視頻,下載了嚐鮮版的DJ Mimo發現只支持Osmo Mobile 7/7P/8的連接,SE還不支持,還得用卓易通版本,由此心中好奇手機和雲台控制的原理是什麼,HarmonyOS 上面如何實現,於是翻文檔研究發現HarmonyOS 6.0上新推出了Mechanic Kit直接提供瞭解決方案。
image.png

背景介紹

image.png
在智能硬件生態快速發展的當下,雲台、機械臂等機械體設備已從專業領域走向消費級市場:短視頻創作者用雲台實現畫面穩定跟蹤,直播主播依賴機械臂完成多角度拍攝,工業場景中機械臂則通過手機遠程操控完成精準作業。但跨設備交互的核心訴求——統一的控制接口、低適配成本、穩定的智能跟蹤能力——卻長期未能得到滿足。

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/名稱/類型)
智能跟蹤控制 攝像頭跟蹤開關、跟蹤佈局設置(默認/左側/中間/右側)、跟蹤狀態監聽
設備狀態監控 三軸角度查詢、旋轉軸最大範圍查詢、旋轉軸狀態監聽、運動參數(最大轉速/連續旋轉時間)查詢

運作機制

image.png
如上圖所示,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';
  2. 獲取已連接設備列表

    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);
    }
  3. 監聽設備連接狀態變化

    // 定義連接狀態回調函數
    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);
    }
  2. 監聽跟蹤狀態變化並處理

    // 定義跟蹤狀態回調函數
    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吸引人的是人臉檢測算法與接口標準制定。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.