ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Core Motionの新機能
Core Motionの最新アップデートを活用して、アプリでのモーションデータの利用を拡大する方法を確認しましょう。また、Apple WatchでHealthKitワークアウトを記録する際に、より高い周波数のセンサーデータをストリーミングする方法やシュノーケリングなどの水中アクティビティで水深や水温などの水浸データを取得する方法を紹介します。AirPodsなどのオーディオデバイスからiPhoneやMacなどの接続デバイスに、姿勢、加速度、回転数などのモーションデータをストリーミングする方法も見ていきます。
リソース
関連ビデオ
WWDC23
WWDC20
-
ダウンロード
♪ ♪
こんにちは!Erinです CoreMotionチームのエンジニアです CoreMotionの素晴らしい アップデートをお伝えするのが楽しみです CoreMotionは慣性センサーからの モーションデータにアクセスするための 中心的なフレームワークとして機能します ハードウェアの進化に伴い モーションキャプチャの 能力も向上しています 衝突検知や落下検知 空間オーディオなどは センシング能力の向上に 依拠する機能のほんの一例です CoreMotionによって これらの技術進化を 皆さんのアプリでも活用できます このセッションでは モーションデータとの新しい接点に 焦点を当てますが その前に モーションデータを 生成するセンサーについて 簡単に覚えておいてください デバイスの動きを捉えることは デバイスを いかに体験するかの中心をなします Appleのデバイスの多くは 内蔵センサーを使用して 空間を通過する動きを 表現する際に役立ちます Apple Watchを例に取り上げます 内蔵センサーには 加速度を測定する― 加速度計のほか 回転を測定するジャイロスコープ 磁場を測定する磁力計 そして 圧力を測定する圧力計があります これらを組み合わせることで デバイスの 空間内での動きや向きを追跡できます デバイスの動作イメージの生成は 私たちが享受する― 多くの機能の根幹をなすものです その日の歩数や ワークアウトで消費したカロリーなどの 記録も含まれています 星空を探索する 天体観測アプリのように デバイスの向きに依拠する体験も サポートします 交通事故や転倒を検知して 安全を守る機能も 同じセンサーを使った動きの追跡に 依拠しています これは多数ある可能な応用例の一部です 皆さんがCoreMotionを どのように活用するか楽しみです いくつかセンサーの概要をお伝えしたので 次はAirPodsのような オーディオ製品から モーションデータを取得する方法や 水浸データの更新を取得する方法 そして最後に より高いレートのセンサーデータを ストリーミングする新しい方法を説明します まずはヘッドフォンのモーションから 少し前にダイナミックヘッド トラッキングによる空間オーディオが 音楽や映画の体験方法を変えました ダイナミックヘッドトラッキングは iPhoneやApple Watchと 同じデバイスモーション アルゴリズムに依拠しています 数年前にCMHeadphoneMotionManagerが 導入されたとき ダイナミックヘッドトラッキングを 可能にしたものと 同じデータが利用可能になりました 接続されたiOSまたはiPadOSデバイスに 姿勢やユーザー加速度 回転数データをストリーミングすることで 頭の動きが追跡できます ヘッドトラッキングはゲームから フィットネスアプリまで 素晴らしい機能を多数引き出しました そして今年 macOSに CMHeadphoneMotionManagerが 登場します 詳細をご説明します CMHeadphoneMotionManagerは まず最初に iOSとiPadOS 14で 利用可能になりました 今年からはmacOS 14にも 搭載されます CMHeadphoneMotionManagerを 使用すれば AirPods Proのような ダイナミックヘッドトラッキングによる 空間オーディオをサポートする オーディオ製品から 接続されたiOS iPadOSまたは macOSデバイスにデバイスモーションを ストリーミングできます iPhoneやApple Watchと 同じように 対応デバイスからのストリーミング中に CMDeviceMotionで 姿勢やユーザー加速度 回転率のデータを検出します SensorLocationのような CMHeadphoneMotionManagerに固有の 追加情報にも注目してください これはデータのソースが左耳か右耳なのか 曖昧さの回避に役立ちます データはリモートデバイスから ストリーミングされるため 接続タイミングを理解することが重要です CMHeadphone MotionManagerDelegateを使うと 接続状態の更新を 簡単にモニタリングできます その使い方をお見せします
CMHeadphoneMotion ManagerDelegateプロトコルを採用し 接続状態の更新に応答します オーディオデバイスがiPhone iPad Macなどの対応ストーリーミングデバイスに 接続されている場合 データは利用可能です 自動耳装着検出が有効な場合 ヘッドトラッキングに 影響するイベントも受け取ります イヤーバッドを耳から外すと 切断イベントが発生し 戻すと接続イベントが発生します
同様に 自動頭部検出が 有効になっている場合 オーバーイヤーヘッドホンの着脱が これらのイベントを発生させます CMHeadphoneMotionManagerが これらのイベントをモニタリングし データをストリームするよう設定するのは 簡単です 方法をお見せします ストリーミングを開始する前に デバイスのモーションデータが 利用可能であることを確認したいはずです isDeviceMotionAvailable プロパティで確認できます 先ほど説明した接続イベントを受け取る デリゲートを割り当てます その後 データストリーミングを開始します CMHeadphoneMotionManagerは データを取得するためのプッシュとプルの 両インターフェイスを公開しています この例ではプッシュを使用します startDeviceMotionUpdatesで 操作キューとハンドラを指定します モーションデータにアクセスするので 認証は重要です アプリのユーザーは Info.plistに追加した Motion Usage Descriptionキーで モーションデータの承認を促されます authorizationStatusプロパティを チェックすることで モーションデータに対する 権限の有無を確認し 権限レベルに関係なくシームレスな 体験が提供できます 一度認証され データストリーミングが 開始されると 各デバイスの モーションアップデートによる姿勢情報で 頭部のポーズを追跡するのは簡単です 例えば 基準となる姿勢を startingPoseとして記録しておき multiplyメソッドを使うことで 元の姿勢に対する現在のサンプルの 相対的な変化を簡単に取得できます 姿勢やユーザー加速度 回転数データとともに 各デバイスの モーションアップデートには センサーの位置情報が含まれます モーションデータは一度に1つのイヤーバッド から配信されるため これは重要なことです 各サンプルで提供される SensorLocation列挙を使用すると どのイヤーバッドがデータを取得したか 識別できます データをストリーミングするイヤーバッドは 自動耳装着検出が有効になっている場合 インイヤーの状態など さまざまな影響を受ける可能性があります 例えば 右のイヤーバッドから データがストリーミングされている際 自動耳装着検出を有効にして耳から外すと 左のイヤーバッドが データストリームを引き継ぎます よって よりシームレスな ヘッドトラッキング体験が可能になります 便利なヘッドトラッキングが さまざまな体験への扉を開きました 例えば 腕立て伏せの回数を数えたり 姿勢をモニターしたりすることが さらに容易になりました 今回 macOSがサポートされたことで ヘッドトラッキング対応オーディオ製品から さらに幅広いデバイスに モーションデータが ストリーミング可能になりました 皆さんが CMHeadphoneMotionManagerで 何を制作されるのかとても楽しみです 頭の動きを追跡するために圧力を測定する― 必要はありません CMWaterSubmersionManagerの 素晴らしいアップデートを使用して 水中のアクティビティと やり取りする方法をお話しします シュノーケリングや海水浴のような 水中アクティビティでは 水中や水浸状態について 知っておくと面白い情報がたくさんあります あなたがいる場所の水深や水温に 興味があるのではないでしょうか また いつ水中に潜ったのか 陸地やボートに戻ったか あるいは アクティビティ中の水面気圧も 知っておくと便利です 内蔵された気圧計を使用すると CMWaterSubmersionManagerが 水中活動中に これらのメトリックを追跡できます 詳細を説明します CMWaterSubmersionManagerは watchOS 9搭載のApple Watch Ultraで 使用可能です CMWater SubmersionManagerDelegateを 使用して 水深 水温 水浸状態のデータをモニタリングします Shallow Depth and Pressure機能を アプリに追加し 自動起動設定を― 構成することで アプリのユーザーが 水中での活動を開始する時に シームレスな体験を 提供できるようにしてください CMWaterSubmersion Managerの使い方を説明します 水浸状態の追跡を開始するには 可用性を確認したあと CMWater SubmersionManagerを設定します そして水浸状態やイベントの更新を 受け取るデリゲートを割り当てます アップデートの受信方法をお伝えします CMWaterSubmersionManager Delegateによって簡単に取得できます 受信可能なアップデートは多数あります 入水時や出水時などの水浸状態の更新は CMWaterSubmersionEventの didUpdateメソッドによって配信されます アプリのエンタイトルメントの 不足時にアップデートを 受信しようとした場合や 対応外のプラットフォーム上にある場合など 問題が発生したときに errorOccurred updateが表示されます 水温の更新はCMWaterTemperatureで 配信されます 時計の温度が水温と 等しくなるまで数秒かかるため 不確実性が伴います よって水中に入ったばかりの頃は 不確実性が高く 水中で過ごす時間が長くなると 収束し始めます なお 水温の取得は水浸時のみ有効です CMWaterSubmersionMeasurement を使用すると深度や圧力 表面圧 水浸状態の更新を受信できます 水中での活動中 測定値は一定間隔で アプリに配信されます 水深のようなデータの一部は 水浸状態の時のみ適用されるので あくまでオプションであることに 留意してください 水中の深さは 特定の深さの状態に対応しています これがどのようにマッピングされるか お見せしましょう
まず 水浸前の状態から始めましょう 水深1メートル以上では submergedShallow状態になります 1メートルを超えると submergedDeep状態になります Shallow Depth and Pressure 機能を使えば アプリのユーザーが 減圧症のリスクを最小限に抑える― 水深ゾーン内にいることを 簡単に確認できます 最大水深は6メートルに保たれ その水深に近づくと知らせてくれます 最大深度プロパティを使って モニタリングしている深度が確認できます 6メートルに近づくと ApproachingMaxDepthになります 6メートルを超えると pastMaxDepth状態になります データは6メートルまで提供され pastMaxDepthはやや不確実性があります それ以上になると sensorDepthError状態になります CMWaterSubmersionManagerは 水深をゾーンに分けることで 安全性とセンサーの制限に焦点を当てた 水深の変化を簡単にモニタリングできます 最大深度6メートルを超える ユースケースに関心がある場合は ドキュメントにて 管理されたエンタイトルメントに関する 詳細を確認できます CMWaterSubmersionManagerがあれば どの方法を選択しても 素晴らしいウォータースポーツ体験を これまで以上に簡単に創出できます 水中以外にも 多くのスポーツが存在しますが そうした活動中にCMBatched SensorManagerを使って 高レートのモーションデータを 取得する方法を共有します まず 背景から説明します モーションデータの 配信方法についてはお話ししました デバイスモーションアルゴリズムは 内蔵の加速度計とジャイロスコープからの データを融合し Apple Watchのような デバイスが空間を移動する様子を 簡単に追跡する方法を提供します CMMotionManagerは これらサンプルをリアルタイムで サンプルごとにアプリに配信します 最大対応周波数は100Hzです つまり デバイスの瞬時の姿勢に 依拠するUIコンポーネントなど 低遅延の要件がある場合に 最適な選択肢となります これは新しいCMBatchedSensor Managerを使った 高レートデータの配信方法と 比較するとどうでしょう? CMBatchedSensorManagerは センサーデータのバッチを 固定スケジュールで提供し 1 秒ごとにデータのバッチを配信します 高レートのデータを低いオーバーヘッドで アプリに配信できるのです 既存のCMMotionManagerが 100Hzであるのに対し 800Hzの加速度センサーと 200Hzのデバイスの動きになります 転倒や衝突の検知など 私たちの安全を守る機能を 支えるものと同じデータストリームに アクセス可能になりました
データはバッチ処理されるため CMBatchedSensorManager の 使用を考える際に 考慮すべき点がいくつかあります アプリがワークアウト中心の 機能で 高レートのデータの恩恵を 享受できる一方で 厳しい低遅延要件がない場合 CMBatchedSensorManagerが 適しています より高いレートのセンサーデータが どのように提供されるか および既存のインターフェイスによる 提供との比較について説明しました 使い方をいくつかご紹介します 多くのスポーツは 短時間の インパクトを伴う競技が中心です これにはゴルフやテニス 野球などの アクティビティが含まれます このような場合 スイングの動きで より多くの情報を得ることが フォームの評価や試合の向上に 重要となるかもしれません そこで より高いレートのセンサーデータの 取得が重要です 具体的な例で理解を深めましょう 野球のスイングに注目します
スイングにはいくつか段階があります この図では スイング前のセットアップ 実際のスイング そしてインパクト後の フォロースルーが確認できます スイングの質にとって重要な指標は 当たるまでの時間です つまり 打者がバットを振り始めてから バットがボールに当たるまでの 経過時間のことです 高レートのセンサーデータを使うと 3つのステップに分けることができます バッターの手首には X Y Z方向の指標を持つ Apple Watchがありますね 重力のベクトルが下を向いた状態で 手首がバッターの周囲を移動する軌道を 青色でイメージすることができます 当たるまでの時間を計算するため まず800Hzの加速度センサーを使って バットとボールが当たる インパクト点を検出します そして200Hzのデバイスの動きで 重力に沿った回転を使って スイングの開始を特定します 最後にスイングの開始からインパクトまでの タイムスタンプの差を 計算することができます スイング中のセンサーデータを視覚化して 求めているものを 把握してみましょう ここでは1スイングを含む 1秒間のウィンドウにおける z方向の加速度計データをプロットしました 0.5秒から0.6秒の間に バーストしているのがわかります 私たちのインパクト点検出アルゴリズムは この観測を中心に行われます 800Hzの加速度センサーを上に 100Hzの加速度センサーを下に置いて スイング中の信号情報量を比較しましょう 0.5秒から0.6秒間の注目区間では 10点から80点のデータが得られました これにより何が起こっているのか より細かく把握することができます これはインパクトなどの興味のある要素に 焦点を絞る際に役立ちます 同じスイングをデバイスの 動きの観点から見てみましょう これは200Hzで重力に沿った回転数を プロットしたものです 0.3秒あたりから回転数が変わり始め スイングが始まるのがわかります これらを並べてみましょう プロットを時間ごとに並べると 800Hzの加速度センサーと 200Hzのデバイスの動きが 接触までの時間を計算する上で どのように役立っているかがわかります センサーストリームへのスイングの 表示のされ方がわかったので CMBatchedSensorManagerで データストリーミングと処理を開始できます
まず このプラットフォームでデータが 利用可能かどうか確認します そのためにisAccelerometer Supportedを確認します 同様のプロパティを使用してデバイスの モーションサポートが確認できます Apple Watch Series 8とUltraは ハイレート加速度センサーと デバイスモーションを両方サポートします
ワークアウト中心のAPIなので データを取得するには HealthKitワークアウトセッションが アクティブである必要があります HealthKitワークアウトセッションに入ると アップデートの受信を開始できます Swiftの非同期サポートにより センサーデータのバッチ受信や 各バッチの処理は簡単です ループを抜ける条件を 評価するようにしてください 例えば ワークアウトが 終了した場合などです
モーションデータが非許可の場合や サポート外のプラットフォームでは エラーが表示されます 各データのバッチごとに やりたいことに注目しましょう バッチごとにフィード関数を呼び出して データに対してアルゴリズムを実行します バットがボールと接触したとき Z方向に顕著な反応が 現れることを期待します Z軸は時計のクラウンに対して 垂直であることを忘れないでください この残響はインパクトの近似値です このことを念頭に置いて 加速度センサーのバッチを処理します 接触時に力が変位する際の 高い周波数特性を より明確に分離したいと思います そのためにzサンプルを fzとしてフィルターにかけます フィルターにかけたデータを使用して フィルタリングされた信号の ピークをインパクト点として近似します そのサンプルに関連するインデックスを impactIndexとして記録しておきます フィルタリングされた信号から引き出された impactIndexを使って 元のバッチデータからインパクト時の タイムスタンプを取得できます ここで接触時間を計算する 2つ目のステップに入ります 重力に沿った回転を利用して スイングの開始を検出するのです
バッターがスイングするときの Apple Watchの軌道を想像してください ボールを捕らえるため 体の周りを回る軌道をたどるでしょう よってスイング中は重力に沿った回転数が ゼロにならず スイング外では重力に沿った回転数が ゼロに近くなると予想します ローカルバッファに高周波の デバイスの動きをストリーミングすることで 回転数データを使ってスイングが どこで始まったか特定できます 私の計算関数を詳しく見ていきましょう 関心のあるポイント つまりインパクトの タイムスタンプ周辺を調査するため ローカルバッファを逆方向に反復します スイングの開始は インパクトより前だとわかるので バッファ内の各サンプルを処理する前に 一連のshouldProcessチェックが 実行できます デバイスのモーションサンプルが インパクト時刻以前のものだと 確認するタイムスタンプチェックを 含むことができます スイングの持続時間にも制限を設けられます スイングの開始はボールに接触する前の 一定の時間を超えることはありません これは理にかなっています
一連の初期チェックに 合格したサンプルについては computeRotation関数で 重力に沿った回転を計算し 各軸の回転率と重力の値の積を合計します 重力に沿った回転が計算され スイングの開始を探し始めることができます 単純なスイングスタートのチェックでは 重力に沿った回転数が 一貫して しきい値を満たさないかどうか 確認できます 重力に沿った回転数が そのしきい値を満たさなくなったら それをスイングの開始時間として ループを抜けます 最終確認として 検出したスイングを検証します スイング中の重力に沿った 累積回転を見て 予想されるしきい値の 範囲内だと確認できます これで私が検出した 開始タイムスタンプを返せます これで最終のステップ3に進み 接触までの時間を計算するために 必要なものがすべて揃いました 最初のフィード関数に戻りましょう
CMBatchedSensorManagerを使い 加速度センサーとデバイスのモーション データのストリーミングから始めます Z方向の加速度計のデータを フィルターにかけることで インパクト時間を検出しました そしてインパクトのタイムスタンプ近くで 重力に沿った回転数を 調べることで スイングの開始を特定しました 2つのタイムスタンプの差から 当たるまでの時間を計算します これはセンサーデータに基づいて機能を 開発する方法の簡単な例でした より高い周波数のデータストリームに 含まれる余分な信号情報は そのほか多数の調査への扉を開きます 見ていきましょう この加速度センサーのデータトレースは 先ほどz方向の800Hzの 加速度センサーストリームで確認しました 2つ目のプロットを見てみましょう 似ているようで 少し異なります これはミススイングの痕跡で バットにボールが実際に当たっていません スイングの動き自体は両者とも似ていますが ハイレートのデータストリームが このような違いについて より深い洞察を与えてくれるとわかります 開発したアルゴリズムは これらの違いを利用して 以前は不可能だったことが検出できます 同じデバイスのモーションアルゴリズムが 2つの異なる方法で データを提供するということです CMMotionManagerはサンプルごとに 最大100Hzでデータを送信します よって秒以下の低遅延が要求される場合や ワークアウト以外で モーションベースの機能が必要な場合に 最適な選択肢です 新しいCMBatchedSensorManagerは バッチスケジュールで 200Hzのデバイスモーションと 800Hzの加速度センサーを上限とし 1秒間に1バッチなど より高いレートでデータを配信します このため高レートのデータを活用できる― ワークアウト中心の機能に有効です Apple Watch Series 8と Ultraで利用できます CMBatchedSensorManagerを 使用するために 今回は 野球のスイングに焦点を当てましたが このような高レートのデータストリームは すべてのワークアウト 特に短時間やインパクトベースの活動中の Apple Watchの動きについて 貴重な洞察を提供できます 以上が CMBatchedSensorManagerおよび CoreMotionの新機能の確認でした ヘッドフォンにせよApple Watchにせよ 私たちは動きとインタラクションする 素晴らしい方法を持っています モーションデータを使う― 素晴らしい方法は多数存在します ぜひお試しください 詳しくはドキュメントをご覧ください また フィードバックもぜひお寄せください モーションデータが 移動能力の測定などの健康ベースの機能に どのように変換されるかに関しては WWDC 2020の「Beyond Counting Steps」セッションをご覧ください CMBatchedSensorManagerを活用した ワークアウトの実行については 「Building custom workouts with WorkoutKit」をご覧ください モーションデータを活用した 素晴らしい体験の制作を楽しみにしています ご視聴ありがとうございました
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。