【iOS 17】DockKit 入門

DockKitはDockKit対応アクセサリを動かすためのフレームワークです。本記事では、belkinから発売されたAuto-Tracking Stand Pro with DockKit (DockKitスタンド)を使用して、DockKit対応アクセサリをコントロールする方法について説明します。 本記事を最後までお読みいただくことで、AVFoundationのカメラAPIを使用したアプリであれば、DockKit対応アクセサリを自在に動かすことができるようになります。
事前準備
DockKitスタンドの場合、台座部分にiPhoneを近づけると、DockKit対応アクセサリの検出処理が開始し、検出状況がアクションシート上に表示されます。

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

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

ビデオ撮影機能の実装方法については以下の記事でまとめていますので必要に応じてご参照ください。
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スタンドにオリジナルの動作を行わせるためには、システムトラッキングをオフにして被写体の自動トラッキング機能を無効化する必要があります。DockAccessoryManager のsetSystemTrackingEnabled(_:) にfalse を代入することで、システムトラッキングをオフにすることができます。
被写体の表示位置を変更
setFramingMode(_:)
デフォルトの設定では、ビデオフレーム内中央揃えに被写体が表示されるようにトラッキングが行われます。左揃え・右揃えのような特定の位置に被写体を表示したい時は、DockAccessory のsetFramingMode(_:) にDockAccessory.FramingMode を代入します。setFramingMode(_:) の引数には、DockAccessory.FramingMode に
用意されている.automatic 、 .left 、.center 、.right のいずれかの要素を指定します。
| 被写体の表示位置 | case | 
|---|---|
| 自動調整 | .automatic | 
| 左揃え | .left | 
| 中央揃え | .center | 
| 右揃え | .right | 
- 左揃え
   
- 右揃え
   
領域を指定
DockAccessory のsetRegionOfInterest(_:) で被写体の表示領域を数値で指定することもできます。座標はiPhoneのディスプレイ左上隅が起点となります。 表示領域は正規化された座標で定義します。
DockKitスタンドのモーターをコントロール
DockKitスタンドのモーターをコントロールすることができます。DockKitスタンドは XとYの2つの回転軸で動作します。

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

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

No

Wakeup

Yes

今回は、DockKitスタンドをコントロールするための方法を説明しました。本記事では触れていませんが、特定のオブジェクトを追跡することもできます。
本記事の続きも書いていますので、是非ご覧いただけますと幸いです。
参考資料
・Integrate with motorized iPhone stands using DockKit




Discussion