WWDC Quick Look 💓 By SwiftGGTeam
Integrate with motorized iPhone stands using DockKit

Integrate with motorized iPhone stands using DockKit

元の動画を見る

ハイライト

DockKit は iPhone を電動カメラ マウントの中央コンピューティング ユニットにし、iOS カメラ API を使用するアプリが箱から出してすぐに 360 度パンと 90 度チルトの自動被写体追跡機能にアクセスできるようにします。開発者は、コンポジションの位置合わせをカスタマイズしたり、対象領域を指定したり、DockKit API を通じてモーターを直接制御したり、Vision フレームワークを使用して任意のオブジェクトを追跡するためのカスタム推論モデルを提供したりすることもできます。

主要内容

すぐに使えるシステムレベルのトレース

DockKit マウントは、iPhone カメラの視野をパン (ヨー) 360 度、チルト (ピッチ) 90 度まで拡張します。ユーザーが電話機とホルダーをペアリングすると、iPhone のシステム サービスですべての機能が完了します。

主な設計: モーター制御と被写体の追跡はシステム レベルで処理され、iOS カメラ API を呼び出すアプリは自動的に DockKit 機能を取得します。システム カメラや FiLMiC Pro などのサードパーティ アプリは、コードを変更せずに使用できます。

スタンドにはシンプルな電源ボタン、トラッキング スイッチ、LED インジケータ ライトが付いています。 LED の点滅は、トラッキングがアクティブで、被写体がフレーム内にあることを示します。

01:18

システムトラッカーの仕組み

DockKit システム トラッカーは、カメラ処理パイプラインで実行されます。

  • ISP 推論により 30fps で分析されたカメラ フレーム
  • Visual Understanding Framework は顔と体の境界ボックスを生成します
  • マルチモデルシステムトラッカーは、人や物体ごとに追跡トラックを生成します
  • EKF (拡張カルマン フィルター) は、推論のギャップとエラーを平滑化します。
  • 追跡推定は、モーターの位置/速度フィードバックと携帯電話の IMU データを組み合わせて、最終的な軌道と駆動命令を生成します。

マルチプレイヤー シナリオでは、主要な被写体 (緑色の境界ボックス マーク) がデフォルトで追跡されます。統計トラッカーはエラーを修正し、他のメンバーがパスをブロックしたり横切ったりした場合でも追跡を続けます。

03:52

カスタム構成コントロール

アプリは、DockKit API を通じてビデオのトリミング方法を制御できます。

配置モード: 左、中央、または右の配置を選択します。アートワークによって被写体が隠れることを避けるために、固定 UI オーバーレイ (ロゴなど) のあるシーンに適しています。

関心領域 (ROI): 正規化された座標を使用してトリミング領域を指定します。ビデオ会議など、被写体が途切れないように特定のアスペクト比が必要なシーンに適しています。

07:29

カスタム推論とモーター制御

開発者は次のことができます。

  • システムトラッキングを無効にし、速度ベクトルを直接使用してモーターを制御します
  • Vision フレームワークまたはカスタム ML モデルを使用して推論結果を提供する
  • DockKit トラッカーにフィードするために、推論出力から観測 (正規化された座標の境界ボックス) を構築します。
  • 組み込みアニメーション (Yes、No、Wakeup、Kapow) をトリガーするか、カスタム アニメーションを作成します

10:45

詳細

レジスタブラケットのステータス変更

06:43

import DockKit

// スタンドの接続/切断状態を監視
DockAccessoryManager.shared.stateEvents
    .sink { state in
        switch state {
        case .docked:
            print("iPhone がスタンドに接続されました")
        case .undocked:
            print("iPhone 已从支架移除")
        }
    }
    .store(in: &cancellables)

キーポイント:

  • DockAccessoryManager.sharedDockKit アクセサリを管理するシングルトンです -stateEventsブラケットの接続状態変化を公開 -.dockediPhone が DockKit プロトコルを介してドックに接続されていることを示します
  • ステータス監視は追跡動作を変更するための前提条件です

コントロール組成の調整

08:23

// 現在接続されているスタンドアクセサリを取得
guard let accessory = DockAccessoryManager.shared.connectedAccessory else { return }

// 被写体を画面右側に揃え、左側の logo 用に余白を確保
accessory.framingMode = .right

キーポイント:

  • connectedAccessory現在接続されているDockKitアクセサリを返します。 -framingMode次の 3 つのオプションがあります。.left.center.right- デフォルトは.center、被写体は常に画面の中央にあります
  • 整列モードは、固定 UI オーバーレイのあるシーンに適しています

###関心のある分野を指定してください

09:02

// 中央揃えの正方形 ROI を定義(正規化座標、原点は左上)
let roi = CGRect(x: 0.25, y: 0.25, width: 0.5, height: 0.5)
accessory.regionOfInterest = roi

キーポイント:

  • ROI は 0.0 ~ 1.0 の範囲の正規化された座標を使用します。
  • 原点は iPhone ディスプレイの左上隅にあります
  • ビデオ会議用の正方形のトリミングなど、特定のアスペクト比が必要なシナリオに適しています
  • セットアップが完了すると、DockKit は被写体が ROI 内に正しく収まるようにします。

モーターを直接制御

10:12

// システムトラッキングを無効化し、手動制御の準備をする
accessory.isSystemTrackingEnabled = false

// 速度ベクトルを定義:Yaw は右へ 0.2 rad/s、Pitch は下へ 0.1 rad/s
let velocity = DockAccessoryVelocity(
    angularVelocity: .init(yaw: 0.2, pitch: -0.1)
)
accessory.move(withVelocity: velocity)

// 持续 2 秒
try? await Task.sleep(for: .seconds(2))

// 反向运动:向左 0.2 rad/s,向上 0.1 rad/s
let reverseVelocity = DockAccessoryVelocity(
    angularVelocity: .init(yaw: -0.2, pitch: 0.1)
)
accessory.move(withVelocity: reverseVelocity)

キーポイント:

  • 最初に設定する必要がありますisSystemTrackingEnabled = falseモーターを手動で制御するには
  • ヨーは水平回転 (左右) を制御し、ピッチはピッチ (上下) を制御します
  • 速度の単位はラジアン/秒です -move(withVelocity:)新しいコマンドまたは停止コマンドを受信するまで移動を継続します

カスタム推論: ハンド トラッキングを使用して顔トラッキングを置き換える

13:17

import Vision

// 手のポーズ検出リクエストを作成
let handPoseRequest = VNDetectHumanHandPoseRequest()
let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer)

try? handler.perform([handPoseRequest])

// 从检测结果构建 DockKit Observation
var observations: [DockKit.Observation] = []

if let results = handPoseRequest.results?.first,
   let thumbTip = try? results.recognizedPoint(.thumbTip) {
    
    // 親指先の位置から境界ボックスを構築
    let boundingBox = CGRect(
        x: thumbTip.location.x - 0.1,
        y: thumbTip.location.y - 0.1,
        width: 0.2,
        height: 0.2
    )
    
    let observation = DockKit.Observation(
        boundingBox: boundingBox,
        type: .object
    )
    observations.append(observation)
}

// カメラ情報を取得して DockKit に渡す
let cameraInfo = DockKit.CameraInformation(orientation: .corrected)
accessivity.track(observations: observations, cameraInfo: cameraInfo)

キーポイント:

  • VNDetectHumanHandPoseRequest手のキーポイントを検出
  • 観測の境界ボックスは、左下隅を原点とする正規化された座標を使用します。 -type: .humanFaceシステムレベルのマルチプレイヤー追跡の最適化が有効になります -type: .objectカスタムオブジェクト追跡用
  • Vision フレームの座標系は DockKit と一致しているため、変換は必要ありません -orientation: .corrected画面の左下隅を基準にして座標が修正されたことを示します

組み込みアニメーションをトリガーする

15:53

// システムトラッキングを無効化
accessory.isSystemTrackingEnabled = false

// Kapow アニメーションを発火
accessory.animate(.kapow)

// アニメーションを非同期で実行し、完了後にシステムトラッキングを再度有効化
Task {
    try? await Task.sleep(for: .seconds(3))
    accessory.isSystemTrackingEnabled = true
}

キーポイント:

  • 4 つの組み込みアニメーションがあります:.yes.no.wakeup.kapow- アニメーションはスタンドの現在位置から始まります
  • アニメーションは非同期であり、メインスレッドをブロックしません。
  • アニメーションの実行中にシステム トラッキングを再度有効にすることができます

重要ポイント

1. ライブ ストリーミング アプリケーションに自動追跡を追加する

やるべきこと: DockKit をライブ ストリーミング/ビデオ会議アプリに統合すると、ホストや発言者が常にフレーム内に留まりながら自由に移動できるようになります。

実行する価値がある理由: 従来のライブ ブロードキャストでは、PTZ を操作する専任の人が必要か、アンカーが固定位置に限定されていました。 DockKit の 360 度トラッキングにより、1 人でプロレベルのトラッキング ショットを完了できます。

開始方法: カメラ コードを変更する必要はありません。DockKit 状態のリスニングと構成コントロールを追加するだけです。アプリのUIレイアウトに基づいて選択してください.left.centerまたは.rightアライメントモード。

2. ジェスチャー制御のインタラクティブ カメラを構築する

機能: 顔追跡をジェスチャ認識に置き換え、スタンドがユーザーの手の動きを追跡できるようにします。

実行する価値がある理由: ハンド トラッキングは、指導のデモンストレーション (ポインターに従う)、フィットネス ガイダンス (姿勢の修正)、ゲーム インタラクション、その他のシナリオに使用でき、顔のトラッキングよりも柔軟です。

開始方法: を使用しますVNDetectHumanHandPoseRequest手のキーポイントを検出し、Observation を構築して、DockKit に渡します。さらに、Create ML を使用してジェスチャ分類モデルをトレーニングし、特定のジェスチャを認識した後に組み込みアニメーションをトリガーすることができます。

3. 教育ビデオのインテリジェントなトラッキングを作成する

手順: DockKit ホルダーを使用して、教室またはトレーニング シナリオでインストラクターを自動的に追跡します。インストラクターが黒板に書いたり、動き回ったりするときに、画面が自動的にインストラクターを追跡します。

実行する価値がある理由: 説明ビデオを録画するには、通常、ビデオ撮影者がフォローする必要がありますが、費用がかかり、紛失しやすくなります。 DockKit はあなたの iPhone を自動ビデオ撮影者に変えます。

開始方法: iPhone を DockKit ホルダーに置き、システムレベルの追跡を使用します。インストラクターがホワイトボードに近いときに構図を調整する必要がある場合は、ROI を使用してトラッキング領域を制限できます。

4. モーターアニメーションを使用してインタラクティブなフィードバックを強化します

やるべきこと: 操作の確認、感情の表現、ユーザーの注意の誘導など、スタンドの物理的な動きをアプリ内のインタラクティブなフィードバックとして使用します。

実行する価値がある理由: 物理的な動きは、画面上のアニメーションよりも直感的なフィードバック方法です。スタンドの「はい」、「頭を振ってください」(いいえ)、「目を覚ましてください」などのアニメーションは、明確な意味論を伝えることができます。

開始方法: 主要なインタラクションポイント (ユーザーが設定を完了したり、重要な通知を受け取ったりするなど) で呼び出されます。accessory.animate(.yes)またはモーターのモーションシーケンスをカスタマイズします。ジェスチャー認識と組み合わせることで、スタンドを「押して」スイングするという楽しいインタラクションを実現できます。

関連セッション

コメント

GitHub Issues · utterances