🪧

【iOS 17】DockKit 入門

2024/03/29に公開

DockKitはDockKit対応アクセサリを動かすためのフレームワークです。本記事では、belkinから発売されたAuto-Tracking Stand Pro with DockKit (DockKitスタンド)を使用して、DockKit対応アクセサリをコントロールする方法について説明します。
https://www.belkin.com/jp/auto-tracking-stand-pro-with-dockkit/P-MMA008.html
本記事を最後までお読みいただくことで、AVFoundationのカメラAPIを使用したアプリであれば、DockKit対応アクセサリを自在に動かすことができるようになります。

事前準備

DockKitスタンドの場合、台座部分にiPhoneを近づけると、DockKit対応アクセサリの検出処理が開始し、検出状況がアクションシート上に表示されます。

DockKitスタンドのペアリングが開始するとペアリング状況が表示されるので、台座部分にiPhoneを近づけたままペアリングが完了するまで待機します。

ペアリングが完了したらDockKitスタンドにiPhoneをセットして、ビデオキャプチャ機能を搭載したアプリを起動しましょう。

被写体のトラッキング (追跡)

まずは、カメラの映像が捉えた被写体をトラッキングしてみます。DockKitスタンドに被写体をトラッキングさせるための特殊な実装は不要です。AVFoundationのカメラAPIを使用してビデオキャプチャ機能を実装したアプリは、DockKitスタンドに被写体をトラッキングさせることができます。DockKitはAVCaptureSession と連携しているので、AVCaptureSessionstartRunning() を実行するだけで、DockKitスタンドが被写体のトラッキングを開始します。

ビデオ撮影機能の実装方法については以下の記事でまとめていますので必要に応じてご参照ください。
https://zenn.dev/naoya_maeda/articles/6f35ef13a5e895

DockKitにはDockKit対応アクセサリの動きをカスタマイズするためのAPIが用意されています。以降では、DockKitに用意されているAPIを使用して、DockKitスタンドにオリジナルの動作を行わせる方法について説明します。

DockKit対応アクセサリを表すクラス

DockAccessory

DockAccessory はDockKit対応アクセサリを表すクラスです。DockKit対応アクセサリにオリジナルの動作を実行させるためには、DockAccessory オブジェクトに対して、オリジナルの動作を実行させるための設定を行います。DockAccessory はDockKit対応アクセサリのモデル名やファームウェアのバージョンといったハードウェア情報を提供します。

DockKit対応アクセサリを管理するクラス

DockAccessoryManager

DockAccessoryManager はiPhoneと接続したDockKit対応アクセサリを管理するクラスです。iPhoneと接続したDockKit対応アクセサリとの接続状態を提供し、接続したDockAccessory オブジェクトを取得することができます。

接続したDockKit対応アクセサリの取得

DockAccessoryManager.shared.accessoryStateChanges

DockAccessoryManager.shared.accessoryStateChanges で、iPhoneと接続しているDockKitスタンドの状態を取得することができます。状態は.docked.undocked の2種類が用意されており、状態が.docked になっているDockAccessory オブジェクトを取得します。

システムトラッキングの無効化

setSystemTrackingEnabled(_:)

DockKitスタンドにオリジナルの動作を行わせるためには、システムトラッキングをオフにして被写体の自動トラッキング機能を無効化する必要があります。DockAccessoryManagersetSystemTrackingEnabled(_:)false を代入することで、システムトラッキングをオフにすることができます。

被写体の表示位置を変更

setFramingMode(_:)

デフォルトの設定では、ビデオフレーム内中央揃えに被写体が表示されるようにトラッキングが行われます。左揃え・右揃えのような特定の位置に被写体を表示したい時は、DockAccessorysetFramingMode(_:)DockAccessory.FramingMode を代入します。setFramingMode(_:) の引数には、DockAccessory.FramingMode
用意されている.automatic.left.center.right のいずれかの要素を指定します。

被写体の表示位置 case
自動調整 .automatic
左揃え .left
中央揃え .center
右揃え .right
  • 左揃え
  • 右揃え

領域を指定

DockAccessorysetRegionOfInterest(_:) で被写体の表示領域を数値で指定することもできます。座標はiPhoneのディスプレイ左上隅が起点となります。 表示領域は正規化された座標で定義します。

DockKitスタンドのモーターをコントロール

DockKitスタンドのモーターをコントロールすることができます。DockKitスタンドは XとYの2つの回転軸で動作します。

DockAccessorysetAngularVelocity(_:) で、DockKitスタンドのモーターをコントロールします。setAngularVelocity(_:) の引数には、Vector3D 型のオブジェクトを指定します。

Vector3D 型オブジェクト初期化時に、x軸、y軸それぞれの回転速度を指定します。setAngularVelocity(_:) 実行後にタスクをスリープさせることで、スリープ時間中モーターの回転を継続させることができます。
上記のコードでは、毎秒0.5ラジアンの速度でy軸を中心に左回転方向に、2秒間モーターを回転させています。

アニメーション

DockKitスタンドをアニメーションで動かすことができます。デフォルトで用意されているアニメーションタイプはEnumDockAccessory.Animation で定義されており、アニメーションのタイプは.kapow.no.wakeup.yes の4種類です。DockAccessoryanimate(motion:) でアニメーションを行うことができます。

Kapow

No

Wakeup

Yes

今回は、DockKitスタンドをコントロールするための方法を説明しました。本記事では触れていませんが、特定のオブジェクトを追跡することもできます。

本記事の続きも書いていますので、是非ご覧いただけますと幸いです。
https://zenn.dev/naoya_maeda/articles/e066b5afecdda0

参考資料

・Integrate with motorized iPhone stands using DockKit
https://developer.apple.com/videos/play/wwdc2023/10304/

Discussion