WWDC23 "Integrate with motorized iPhone stands using DockKit"の要約
DockKitが初めて発表されたときのWWDC23のセッション "Integrate with motorized iPhone stands using DockKit" (DockKitを利用した電動iPhoneスタンドとの統合)を要約しました。
なおiOS 18でのDockKitの新機能について知りたい方はWWDC24の "What’s new in DockKit" を要約した下記記事をご参照ください。
またDocKit入門には下記記事がおすすめです。
本セッションは一世代前のものではありますが、しくみの解説等このセッションでしか述べられていない内容も多く、WWDC24以降でDockKitに興味を持った方にも有益かと思います。
DockKit入門 - Introduction to DockKit
DockKitとは
DockKitは、iPhoneを電動カメラスタンドの中央演算装置として機能させるためのフレームワークです。
DockKitスタンドは、ピッチとヨーのモーションモデルと自動システムトラッカーをサポートすることで、iPhoneカメラの視野を360度のパンと90度のチルトに拡張します。これにより、ユーザーはカメラアプリでフレームに収まることを気にすることなく、コンテンツに集中することができます。これらのスタンドには、電源やトラッキングを無効にするためのシンプルなボタンや、トラッキングが有効でフレーム内にいるかどうかを知らせるLEDインジケーターが含まれている場合があります。携帯電話をスタンドとペアリングすれば、すぐに使えます。すべてのマジックはiPhone本体のアプリケーションとシステム・サービスで行われる。モーター制御と被写体トラッキングはシステムレベルで処理されるため、iOSのカメラAPIを使用するアプリであれば、DockKitを利用することができる。
これにより、ビデオキャプチャ、ライブストリーミング、ビデオ会議、フィットネス、エンタープライズ、教育、ヘルスケアなどのアプリで、より良い体験や新機能を提供する機会が生まれる。
デモ
DockKitについて話すだけでなく、デモをお見せしましょう。
目の前にはDockKitスタンドのプロトタイプがある。すでにiPhoneとペアリング済みだ。スタンドに置くと、iPhoneはDockKitを通じてペアリングされたドックと通信する。では、実際に試してみましょう。内蔵カメラアプリを起動し、このボタンを押すとトラッキングが始まります。
私がテーブルの上を動き回ると、ドックが私を追跡します。緑色のLEDが点滅し、私がフレーム内にいることを示している。
では、バックカメラに切り替えてみましょう。
ドックが180度回転して、私が視野に入るように反応していることに注目してください。超クールだ。しかし、これは内蔵カメラアプリだけでは動作しない。カメラAPIを使用するアプリなら何でもドックで使用できる。
例えば、FILMICPROを使ってみよう。これは現在App StoreからダウンロードできるFILMICPROと同じものです。
アプリを起動すると、デフォルトで背面カメラになっている。
そして、これらはすべて箱から出してすぐに使える。DockKitスタンドがあれば、周囲の空間やオブジェクトとインタラクションできる。例えば、ここに積んである本のところに行き、自分の本について話すことができる、
あるいは、オブジェとインタラクションしながら、自分の空間をアレンジすることもできる。
DockKitアプリケーションを使えば、ストーリーテラーは視野を気にすることなく、ストーリーに集中することができます。
仕組み - How it works
iPhoneに内蔵されたイメージ・インテリジェンスとスムーズなモーターにより、これらのスタンドは本当に生き生きとしている。では、その仕組みを見てみよう。
DockKitシステムトラッカーは、カメラ処理パイプラインの内部で動作し、内蔵の推論によってカメラフレームを分析し、追跡する被写体を決定し、被写体の軌跡を推定し、モーターを駆動することによって被写体を適切にフレーミングします。映画監督が現実世界の出来事を観察し、カメラのパースペクティブを調整するのと同じように、DockKitはカメラフレームから被写体を推測し、ドックへの作動コマンドを通じてモーターを調整します。
モーターの制御は、DockKitスタンドの管理と通信を行うDockKitデーモンによって行われます。
作動コマンドはDockKitプロトコルを介してスタンドに送信され、センサーのフィードバックはモーター制御のループを閉じるために使用されます。
トラッキングを処理するために、カメラフレームはISP推論によって分析され、毎秒30フレームでDockKitに渡されます。
多人数シナリオをサポートするために、Visual Understanding Frameworkがあります。顔と体のバウンディングボックスが生成され、マルチモデル・システムレベル・トラッカーに送られる。
トラッカーは、追跡された各人物や物体に対してトラックを生成し、統計的EKFフィルターを実行して、ギャップや推論によるエラーを滑らかにします。
結局のところ、現実世界の信号は常に完璧とは限らない。被写体のトラッカー推定値は、最終的な軌道とアクチュエーターコマンドに到達するために、電話IMUと同様に、モーターの位置と速度のフィードバックと組み合わされます。
フレーム内に複数の被写体が存在することもよくあります。デフォルトでは、DockKitは中央のフレームで主要な被写体を追跡します。もし被写体が2人目の人物や物体と関わっている場合、DockKitはその人物や物体もフレームに収めようとします。
例えば、ここにはマフムート、スティーブ、ドルフ、ヴァムシがいる。マフムートは緑のバウンディング・ボックスで示される主要な被写体である。検出された顔だけでなく、体のバウンディングボックスもあることに注目してください。他のチームメンバーがMahmutを邪魔したり、すれ違ったりしても、トラッカーは主要な被写体を追跡し続ける。
障害物のために認識や推論が正しくない結果を出しても、統計的なトラッカーはエラーを修正し、マフムートの追跡を続けることができる。
カスタム制御 - Custom control
DockKitはアプリにコードを追加することなく動作します。しかし、DockKitと統合して顧客が喜ぶような新機能を提供すると、本当にエキサイティングなことになります。それでは、DockKitアクセサリをどのようにコントロールできるかを探ってみましょう。
ドックアクセサリーへの参照を取得する
Dockへの参照を取得します。そこから、フレーミングを変更したり、追跡対象を指定したり、システム追跡を停止した後にモーターを直接制御したりすることができます。
最初に、ドックアクセサリーの状態変化を登録します。ドッキングまたはドッキング解除の通知は、人がiPhoneを互換性のあるドックアクセサリにドッキングしたり、ドックアクセサリから取り外したりしたときに発生します。この通知は、トラッキングの動作を変更するための前提条件です。
DockAccessoryManager
のStateイベントを通して、ドックの状態を問い合わせることができます。関連する状態は docked
と undocked
だけです。接続性はDockKit自身が管理します。docked
の状態は、iPhoneがDockKitプロトコルによってドックに接続されていることを意味します。状態イベントを通して、アプリケーションはトラッキングボタンの状態を取得することもできます。iPhoneがドッキングされていることがわかれば、アクセサリーの他の側面をコントロールすることができます。
カメラ視野のトリミングをコントロールする
最も便利なのは、アプリがビデオのトリミング方法を管理することです。
カメラの視野のトリミングをコントロールするには、2つの方法があります。
- まず、自動フレーミングの左、中央、右の配置を選択します、
- または、特定のRegion of interestを指定することができます。
フレーミングモードの指定
デフォルトでは、DockKitは被写体をフレームの中央に配置します。これはビデオストリーミングのような単純なものには適していますが、理想的でない場合もあります。
例えば、あなたのアプリがカスタムグラフィックオーバーレイを挿入する場合です、
このロゴのようなカスタムグラフィックを動画フレームに挿入する場合はどうでしょうか?この場合、被写体がアートワークによって隠されないようにしたいでしょう。
フレーミングモードを変更するだけで、これを修正することができます。ここでは、フレームの左3分の1に配置されたグラフィックとのバランスをとるために「右」を指定している。
この簡単なコードで、この動画のオープニングの構図は完璧になりました。
Region of interestの指定
トリミングを制御するもう1つの方法は、ビデオフレーム内の特定のRegion of interestを指定することです。
このビデオ会議アプリを例にとってみよう。すべてのビデオフレームは正方形のアスペクト比にトリミングされるようになっている。しかし、DockKitのデフォルトのフレーミングでは、誰かの顔が切れてしまう可能性があります。
DockKitアクセサリにRegion of interestを設定することで、この問題を解決できます。
-
iPhoneのディスプレイの左上が原点とみなされます。
-
Region of interestは正規化座標で定義される。
この例では、DockKitアクセサリに、Region of interestは中央の正方形であることを伝えています。
Region of interestを調整することで、被写体はフレーム内で完璧に切り取られています。
カスタムモーター制御
DockKitを使えば、ユーティリティとして、あるいはアフォーダンスとして、アプリ内でカスタムモーター制御を行うこともできます。これにより、新しい機能の可能性が広がります。
DockKitはデフォルトでシステムトラッキングを有効にしているので、モーターの制御や独自のカスタムトラッキングを行う前に、この値をfalseに設定する必要があります。
DockKitのスタンドは2つの回転軸で動作します: XとYです。
チルト、具体的にはピッチ回転は、マグネットドックポイントの後ろにあるモーターと一直線上にあるX軸を中心に行われます。
Yawと呼ばれるPanの場合、回転はスタンドの根元にあるモーターと一直線に並ぶY軸の周りになります。これをコードで制御する例を見てみよう。
毎秒0.1ラジアンのピッチを下げながら、毎秒0.2ラジアンの低速でモーターを右に移動させたいとします。
まず、初速度ベクトルを定義します、
そのベクトルをドックに送る。
タスクをスリープさせることで、2秒間動きを継続させることができる。
また、別のベクトルで方向を反転させ、0.2rad/sで左に移動し、0.1rad/sでピッチアップする。
Custom inference
モーターを直接制御するだけでなく
推論をコントロールすることもできます。
Visionフレームワーク、独自のカスタムMLモデル、またはアプリケーションが必要とする知覚アルゴリズムを使用することができます。カスタム推論の出力から、オブジェクトを追跡するためにDockKitに送り込むオブザベーションを構築します。
では、オブザベーションとは何でしょうか?オブザベーションとはカメラフレーム内の興味のある対象を表す矩形のバウンディングボックスのことです。
つまり、あなたが追跡したいものです。それは顔であったり、動物であったり、手であったりします。
正直なところ、時間をかけて観察できる物体や点であれば何でもいいのだ。
バウンディング・ボックスは、左下の原点を基準とした正規化座標で定義される。
例えば、この検出された顔のオブザベーションを作成するために、ざっくり (0.25, 0.5)
のバウンディング・ボックスを使います。幅と高さは画像フレーム全体に対するパーセンテージで指定します。
オブザベーションを作成するには、正規化された座標で CGRect
を作成し、そこからオブザベーションを作成します。その際、オブザベーションのタイプを "humanFace "か "object "のどちらかに指定したい。
humanFace "オプションを使用することで、システムレベルの多人数トラッキングとフレーミングの最適化が有効になります。
オブザベーションが作成されると、トラッカーに与えることができます。まず、現在のカメラ情報を取得することから始めます。この場合、DockKitに座標が画面左下からの相対座標であることを知らせるために、向きを "補正 "し、変換の必要がないことを指定しています。そして、オブザベーション配列とカメラ情報をドックアクセサリに渡します。これで、観察・追跡したい多くのもののバウンディングボックスを完全に手作業で計算する必要がなくなりました。
Visionフレームワークはカスタム推論に最適です。
というのも、Visionフレームワークには、ボディ・ポーズ検出、動物ボディ・ポーズ検出、バーコード認識など、追跡可能な観察に簡単に変換できるバウンディング・ボックスを返す多くの組み込みリクエストがすでに含まれているからです。そしてVisionの座標系はDockKitと同じなので、変換せずに直接渡すことができます。DockKitにデバイスの向きを知らせるだけです。
では、カスタム観測をコードで実装してみましょう。
このケースでは、デフォルトの顔と体のトラッキングを、手のポーズ検出リクエストを使って手のトラッキングに置き換えたいと思います。
Visionリクエストとリクエストハンドラを作成することから始めましょう-このユースケースでは、VNDetectHumanHandPoseRequestを使用します-次に、リクエストを実行します。認識されたポイントに基づいてオブザベーションを構築することができます。簡単のために、私は親指の先端に注目していますが、他の指の関節や手全体を使用してオブザベーションを構築することもできます。そして最後に、DockKitにオブザベーションを渡してトラッキングさせます。
それでは実際に使ってみましょう!カスタムカメラアプリを起動してトラッキングを開始します。
手を左に動かすと、スタンドが左にパンして追従していることに注目してください。そして、私が手を右に動かすと、スタンドは反対方向に追従する。
私が手を上に振り上げると、スタンドは私の手をフレームに収めるように傾き、私が手を下に振り下ろすと、また追従する。完璧です。
デバイスアニメーション
DockKit APIを使ってモーターを直接制御できるので、アニメーションでデバイスに命を吹き込むことができます!
-
ドックの動きは、確認のためのアフォーダンスとして、あるいは感情を伝える方法として使うことができます。
-
直接モーターを制御して独自のカスタムアニメーションを作成し、押したり引いたりするような、携帯電話との物理的なインタラクションをエミュレートすることができます。
内蔵アニメーションには、Yes、No、Wakeup、Kapowがあります。デバイスが起動するたびに、Wakeupアニメーションを見ることができます。先ほどのカスタムハンドトラッキングアプリに戻ると、特定のハンドジェスチャーが発生するたびに、内蔵アニメーションをトリガーすることができます。
これを行うには、まずカスタムのハンドアクション分類モデルをトレーニングする必要があります。これは、Create MLアプリを使って簡単にできます。これらのモデルを作成する方法については、2021年のビデオ「Classify hand poses and actions」を必ずご覧ください。
カスタムモデルがハンドジェスチャーが発生したと予測したら、いつでもアニメーションをトリガーすることができます。まずシステムトラッキングを無効にし、アニメーションを開始します。アニメーションはスタンドの現在位置から始まり、非同期で実行されます。アニメーションが実行されたら、システムトラッキングを再度有効にして下さい。では、デモに戻って実際に見てみましょう。
私が少し後ろに下がると、アプリは私の手をトラッキングし続けます。カメラを押すようなジェスチャーをすると、カパッ!
カメラが振り子のように前後に揺れる。楽しいのでもう一回やってみよう。
そして、カパッ!このようなアニメーションを使って、体験を終わらせたり、何かを表現したりすることができる。ぜひ試してみてほしいし、カスタム・モーター・コントロールを使って独自のアニメーションを作ることもぜひ考えてみてほしい。
まとめ
-
DockKitでは、モーター駆動のスタンドを使ってオブジェクトを追跡する機能が導入され、アプリケーションに360度の視野が与えられます。
-
オブジェクトはシステムレベルで追跡することも、カスタム推論を使用してアプリケーションで追跡することもできます。
-
また、感情や実用性を伝えるためのアフォーダンスとして、アプリケーションで機械的な動きを使用することができます。
DockKitのカスタムトラッキングにVisionフレームワークを使う方法をもっと知りたい方は、"Detect animal poses in Vision"を是非ご覧ください。あなたがこれらの素晴らしいアクセサリを手にし、あなたのアプリにどのような体験がもたらされるのか見るのが待ち遠しいです。
Discussion