ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
visionOS向けエンタープライズAPIのご紹介
visionOS向けの新しいエンタープライズAPIを使用して、Apple Vision Proで従業員やユーザーの生産性を高める空間体験を創出する方法を学びましょう。
関連する章
- 0:00 - Introduction
- 2:36 - Enhanced sensor access
- 11:38 - Platform control
- 18:39 - Best practices
リソース
- Building spatial experiences for business apps with enterprise APIs for visionOS
- Forum: Business & Education
関連ビデオ
WWDC24
-
ダウンロード
こんにちは Kyle McEachernです Vision Pro Enterprise チームのエンジニアです 今日は visionOS向け エンタープライズAPIと呼ばれる 機能セットについてお話しします Vision Proのリリース以降 エンタープライズのお客様から ビジネスの変革に役立つ アプリを構築するための 新しい機能を求める声が届いています 今日はこれらの エンタープライズAPIによって visionOSに追加される 新しい機能をご紹介します Vision Proを利用すれば 様々なエンタープライズ環境で 作業をより簡単により生産的に より正確に行えるようになります 例えばより効果的なコラボレーションと コミュニケーションのための 新しい空間体験が得られます 複雑なタスクを簡単にするための ガイド付き作業アクティビティを作成したり これまで不可能だったまったく新しい 空間体験を実現することもできます こうした様々な環境をサポートするため Appleは今年 エンタープライズのお客様と そのアプリに新たな可能性をもたらす 6つの新しいAPIを提供します 素晴らしいですよね APIの詳細な説明に入る前に 重要な点を理解しておく必要があります これらのAPIは多くの業界で 広範な用途をサポートする一方 既存のAPIよりはるかに高いレベルで デバイス機能へアクセスすることができます Appleはプライバシーが 基本的人権だと考えているため これらのAPIももちろん プライバシーを考慮して設計されています これらのAPIが適切な状況でのみ 使用されることを保証するために 管理されたエンタイトルメントと アプリのエンタイトルメントを有効にする デベロッパアカウントに紐付く ライセンスファイルが必要です
これらのAPIはエンタープライズでの 利用のみを想定しているため エンタイトルメントを利用できるのは 独自の社内向けアプリや 他の企業向けにカスタムメイドされ Apple Business Managerを通じて 組織のユーザーに個別に配布される アプリのみとなります 最初のカテゴリは センサーアクセスを強化し Vision Proのビジュアル機能を向上させる APIで構成されています これには メインカメラへのアクセス キャプチャとストリーミング機能の改善 カメラを通じた機能の強化が含まれます
2つ目のカテゴリはプラットフォームの コントロールに焦点を当てています Apple Neural Engineを介した 高度な機械学習機能 強化されたオブジェクトトラッキング機能 負荷の高い作業に対する演算性能を高めるため アプリのパフォーマンスを調整する機能が 含まれます 今日はこれらのカテゴリについて 6つの新しいAPIの実装方法と それらの使用例について説明し 最後にベストプラクティスをお伝えします では 最初のカテゴリ強化された センサーアクセスから始めていきましょう 最も一般的なリクエストの1つが メインカメラへのアクセスですので ここから始めていきます この新しいAPIを有効にすると Vision Proの周囲の環境全体を 見ることができます このAPIにより アプリが Vision Proのメインカメラビデオフィードに アクセスできるようになります
このフィードを分析して 解釈し見えている物に基づいて 実行するアクションを決定することで 多くの高度な空間機能を 利用できるようになります
例えばこちらは生産ラインでの使用例です メインカメラフィードと コンピュータビジョンのアルゴリズムを 使用して異常を検出し 品質基準を満たさない部品を迅速に特定して それを良品と交換することができます ではメインカメラフィードにアクセスし それをアプリに埋め込む方法を見ていきましょう この「main-camera-access.allow」 エンタイトルメントと アプリと共にビルドされた有効な エンタープライズライセンスファイルにより APIを利用し ビデオフィードを取得することができます エンタイトルメントがセットアップされたら コア変数を設定します まずCameraFrameProviderを セットアップし サポート対象フォーマットを 「main」と定義して メインカメラからフィードを 取得できるようにします さらにARKitSessionと CVPixelBufferを作成して フィードを保存および表示します 次にメインカメラへのアクセスのために ユーザー承認をリクエストした後 CameraFrameProviderを ARKitSessionに渡して実行します
これが完了したら CameraFrameProviderから ビデオフレームを取得し 「main」フォーマットの CameraFrameUpdatesを リクエストして アクセスするための変数に保存します 最後に 受け取った各フレームを取得し ユーザーの左側にある 「main」カメラからのサンプルを .left値から取り出して Pixel Bufferに入れます これでアプリ内で 自由に使用できるようになります 簡単ですね メインカメラへのアクセスは エンタープライズアプリに 非常に多くの可能性をもたらします ここではその一部しか挙げていませんが 実に様々な業界にわたって 真の影響力を持つ可能性を秘めています 今日はそのお話しができるので とてもワクワクしています 次に スクリーンキャプチャに パススルービデオを 含める方法をご紹介しましょう これまで Vision Proで スクリーンキャプチャを行うと ユーザーが開いている すべてのウィンドウがキャプチャされましたが 背景は削除され ユーザーの周囲の パススルービデオフィードは含まれませんでした これからはVision Proで ユーザーが見ている すべての物をキャプチャし 共有することができます このAPIを使うと visionOSでのスクリーンキャプチャに パススルーカメラのフィードを含めた 完全な空間ビューが実現します ユーザーが見ているすべてが含まれ それをキャプチャして保存することも 別のデバイスのユーザーにアプリを介して ストリーミングすることもできます 開いているアプリを含む ユーザーの全視野をキャプチャする際に ユーザーのプライバシー保護のため この機能はフィードを受信するための Broadcast Upload Extensionと ReplayKitを介したvisionOSの 内蔵ブロードキャスト機能を使用します つまり スクリーンキャプチャや 共有を開始するたびにユーザーは システムのボタンを 使用する必要があります 例えば現場の技術者が オフィスの専門家に 電話をかける場合などに この機能が役立ちます 現場の作業員はパススルーカメラと その上のvisionOSのウィンドウを含む 実際の視界を共有できます その後オフィスにいる専門家と ハンズフリーで連携し その場の状況に応じた フィードバックを受けることができます それでは実装方法を見ていきましょう Main Camera APIと同様に 「include-passthrough」 エンタイトルメントファイルを設定し スクリーンキャプチャを行う際 パススルーカメラと一緒に 空間ビューにアクセスできるようにします それだけです このエンタイトルメントを持つアプリから システムのスクリーンキャプチャを行うと 通常の黒い背景がパススルーカメラのビューに 自動的に置き換えられ このビューを共有する機能が キャプチャで有効になります とてもシンプルです ワンステップで変更できるのが 素晴らしいですね このAPIをアプリで使用すると リモートでデバッグしたり 別の場所にいる作業者同士で 専門的なアドバイスを提供し合う機能を ユーザーに提供できます これにより知識のある個人が様々な場面で サポートできる範囲が拡大します 数か月前 自分ではんだ付けを 学ぼうとしていたときに この機能があればよかったのですが! 最後は空間バーコードとQRコードのスキャンです Vision ProがバーコードとQRコードを 自動的に検出して解析するようになりました 検出されたコードに基づいて 独自のアプリ機能を実現できます QRコードやバーコードが検出されると アプリは検出されたコードの種類 ユーザーに関する空間的な位置 そのコードのペイロードの内容に関する 情報を受け取ります これには無数の潜在的な使用例があります QRコードとバーコードの用途が 無数にあるのと同様です
例えば 倉庫で使用する場合 リクエストされたアイテムを探し出す作業者が パッケージのバーコードを見るだけで それが目的のアイテムであることを 確認できます 手作業での識別に頼ったり アイテムの持ち運びや 移動が不便なスキャナを 持ち歩いたりする必要がなくなります このAPIでは「barcode-detection.allow」 エンタイトルメントを使用します ではアプリでバーコード検出を セットアップする方法を見ていきましょう
まず ARKitSessionをセットアップして バーコードを検出するために必要な .worldSensing許可が 有効になっていることを確認します
次に 新しくvisionOSに導入された BarcodeDetectionProvider変数を 有効にします HandDetectionProviderを セットアップする既存の機能と同様に これがバーコードの検出と追跡の 基礎になります この場合 これら3つのシンボロジーを渡すことで Code-39バーコード QRコード UPC-Eタイプのバーコードを検出します ドキュメントには Vision Pro Enterprise APIで サポートされる すべての シンボロジーがリストアップされています
次に この BarcodeDetectionProviderに 接続されたARKitSessionを開始します そしてそのプロバイダからの更新を待ち 受け取ったらそれを処理します
このAPIは新しいコードが検出されると 「added」イベントを送信します 例えばコードを ハイライトすることができます コードの位置が移動した場合は 「updated」イベントを使用して UIの更新やコードの追跡を行い コードが見えなくなった場合は 「removed」イベントを使用して UIをクリーンアップします それだけです 空間バーコード 自動検出 これらがアプリで利用可能になります 物流やエラーチェック 部品の選別 あるいは特定の時点でユーザーに コンテキストデータを提供するなど 様々な用途があります それではこれらの新しいAPIを使用して 以前は不可能だった体験を どのように実現できるかを示す一例の デモを簡単にご紹介します 私は最近ある電子部品を 組み立てようとして失敗し サポートセンターの友人 Naveenの助けが必要になりました 私はここで近日中に プレゼンテーションで使用する 電子部品を組み立てようとしています 残念ながら 行き詰まってしまいました 幸い「SupportCenter」 エンタープライズアプリがあります このような時リアルタイムでサポートを 受けることができるアプリです Support Centerアプリを開き サポート担当者に接続して ライブでサポートを受けることができます 本社の友人 Naveenが担当のようです 彼なら助けてくれるはずです Naveenは私の作業状況を確認するため カメラを有効にして共有するように求めます を クリックするとメインカメラフィードを Naveenと共有することができます こちらにプレビューが表示され 私が見ている映像を確認して それをNaveenに送ります
一目では簡単に判別できない キットのようなので キットの説明書を見たいと Naveenは言います 箱にコードがあり それをスキャンすると 該当するキットの説明書が 自動的に表示さます アプリでを クリックし 箱を持って側面のコードを見ると 説明書がアプリに表示されました
説明書が見つかったことを Naveenに伝えると 画面全体を共有するよう求められます これでNaveenは説明書と 私の視界を同時に確認でき 私と同じものを見ている状態になります これを行うには をクリックし メニューでアプリの名前を選んで をクリックします これでNaveenは 私の視界全体を見ることができます では 彼が見ているものを確認してみましょう こちらがNaveenの視界です Support Centerエージェントビューで 私の視界全体が 共有されているのがわかります 彼は私のキットを確認し 説明書と比較しながら 最後の手順が完了していないことを 教えてくれました キットを完成させるには ピン45にワイヤーを 接続する必要があるようです
作業に戻り ピン45にワイヤーを接続するとビンゴ! ステータスライトが緑色に点灯し キットが完成しました Naveenが挨拶をし 私はアプリを終了します サポートのおかげで 重要な会議の準備が整いました 一安心です もちろん このデモは 使用例を簡単に示すために 新しい機能を特定の方法で 1つのアプリにまとめたものです 実際には 必要な機能はこれらのうち 1つか2つだけかもしれませんし 使用方法がまったく異なるかもしれません これらの機能は柔軟かつ パワフルに設計されているため 様々な業界のエンタープライズ環境に 対応できます では次のカテゴリに進みましょう 強化されたプラットフォームコントロールです まず最初に デバイスに搭載されている Apple Neural Engineへのアクセスを Vision Proに提供します これにより CPUとGPUだけでなく Apple Neural Engineを介して オンデバイスで機械学習タスクを 実行できるようになります その結果 Vision Proの既存の CoreML機能が強化されます Apple Neural Engineへのアクセスを 必要とするモデルや それによって強化されるモデルを 実行できるようになります
例えば 先にお伝えした メインカメラアクセス機能の実装時に Vision Proが欠陥のある製品を 識別するような場合は お客様は異常検出のための自社の カスタム機械学習モデルを実装できます このモデルはApple Neural Engineを 必要とする機能を持っており デバイス上で完全に機能することにより ローカルですべてを検出することができます
Appleシリコンは Appleのすべての 機械学習プラットフォームを支え 各モデルはCPU GPU Apple Neural Engine上で実行されます このエンタイトルメントがない場合 visionOSのモデルはVision Proの CPUとGPU上で実行されます このエンタイトルメントがある場合 アプリはApple Neural Engineを 演算デバイスとして利用し パワフルな機械学習機能を有効にして モデルを実行できます
実装されると CoreMLはデバイスでの 現在のリソース使用量 利用可能な演算デバイス モデルの特定のニーズなど 様々な要因に基づいて モデルを最も効率的に実行する 処理ユニットを動的に決定し モデルの計算をそこで実行します Apple Neural Engineをモデルで 利用できるようにする方法を見ていきましょう 非常に簡単なプロセスで実装できます 他のすべてのAPIと同様 エンタイトルメントとライセンスを セットアップする必要があります Apple Neural Engineの場合は 「neural-engine-access」 エンタイトルメントが必要です このエンタイトルメントがあれば Neural Engineを使用して モデルを実行できます Apple Neural Engineに アクセスできることをコードで確認するには 例えば このスニペットのように MLModelクラスのプロパティである 「availableComputeDevices」を確認し その結果に基づいてアクションを実行します これらはAPIの一部ではなく アプリが使用する可能性のある 例示的なメソッド呼び出しです 次に適切であれば モデルを呼び出したとき システムがNeural Engineを利用して そのモデルを実行します Neural Engineを利用できない場合や その利用が効率的でない場合 CoreMLはGPUまたはCPUに フォールバックして演算を実行します この動的意思決定システムにより このエンタイトルメントを持つ アプリで実行される 任意の機械学習モデルは 可能な限り効率的かつ 自動的に実行されます すごいですね 次にパラメータ調整による 既知のオブジェクトトラッキング機能の 強化について説明します 既知のオブジェクトトラッキングは visionOS 2.0の新機能です アプリは特定の参照オブジェクトを プロジェクトに組み込み それを表示エリア内で検出して追跡できます Appleはエンタープライズのお客様向けに この新機能を強化し そのユースケースに最適な オブジェクトトラッキングを 調整および最適化できるよう 構成可能なパラメータを提供しています これには一度にトラッキングできる オブジェクトの最大数の変更が含まれます また 静的オブジェクトおよび ユーザーの視界内を移動する 動的オブジェクトの トラッキングレートの変更や Vision Proの視界内における 既知のオブジェクトの新しいインスタンスの 検出率の変更も含まれます
ただし このAPIには 同じベースライン演算能力があります そのため状況によっては ユースケースに適した パラメータを1~2個増やして その効果を最大限に高めたい場合 他のパラメータを減らして 演算要件のバランスを調整し システムの健全性を維持しつつ アプリに必要な機能を 提供する必要があります
これは多様なツールや 部品をトラッキングして使用する必要がある 複雑な修理環境向けに構築された アプリで使用できるでしょう 技術者は機械の部品を交換するための ガイド付き手順に 従うことができるようになります また多数の関連オブジェクトに関する 蓄積された知識よって強化され 修理中に必要な部品をその場で ハイライト表示することもできます ではどのように実装するのでしょうか とてもシンプルです このAPIのエンタイトルメントは 「object-tracking-parameter -adjustment.allow」です オブジェクトトラッキングコードの セットアップに必要になります
まず TrackingConfigurationを セットアップします 次に その構成変数で 新しいターゲット値を設定します ここでは トラッキングオブジェクトの最大数を デフォルトの10から15に増やしています
毎回これらの値をすべて設定する必要はなく 変更する値だけで構いません ここでは選択肢を示すために すべての値を設定しています 次に ObjectTrackingProviderを セットアップします ここでは先ほど設定したカスタムの TrackingConfigurationと共に 求めている参照オブジェクトを渡します これらの参照オブジェクトはvisionOS 2.0の 既知のオブジェクトトラッキングと同様 「.referenceObject」ファイルです これらのファイルを作成するプロセスは このセッションの リンクドキュメントで見つかります
次に そのObjectTrackingProviderを 使用して ARKitSessionを開始するだけで すべて完了です トラッキングされる オブジェクトの最大数も増えました 皆さんのユースケースでは 一度に多数の異なるオブジェクトを トラッキングする必要があるかもしれませんし デフォルトの検出率よりも詳細に トラッキングする必要があるかもしれません そこで私たちはこれを顧客のニーズに応じて 調整できるよう設計し アプリで最高の体験を 生み出せるようにしています 最後に パフォーマンスの余裕を増やすための アプリの演算設定について説明します ここまで説明してきた 新しいエンタープライズAPIを使用すれば アプリとデバイスを 限界まで活用することができます ここではさらに一歩進み アプリの演算設定を使用します このエンタイトルメントを使用すると エンタープライズのデベロッパは Vision Proデバイスでの 演算能力をさらに高め 多少の周囲騒音と引き換えに ファンの回転速度を少し上げて システムをスムーズに 動作させることができます
どれほど重い作業負荷でも デベロッパは 演算能力と冷却管理 バッテリー駆動時間 ユーザーの快適性の バランスを取る必要があります デフォルト設定ではVision Proは ほとんどのユースケースについて これら3つが最適なバランスになるように 調整されています 一方 このエンタイトルメントを使用すると エンタープライズの特定のユースケースで そのトレードオフが有効であれば 他の2つの領域を少し犠牲にして CPUとGPUの演算能力を 高めることができます その結果 ユーザーはVision Proの パフォーマンスを最大限に引き出し エンタープライズアプリの あらゆる可能性を追求することができます 例えば 非常に複雑で高精細な 3Dデザインをスペース内に読み込み 歩き回りながら確認する場合 アプリ演算設定を有効にすると レンダリングとパフォーマンスが向上します この設定を有効にするには 「app-compute-category」 エンタイトルメントを設定するだけです 拡張演算能力を利用できることが システムで自動的に認識され 必要に応じてファンを作動させて デバイスのスムーズな実行が維持されます この設定はアプリ全体に適用され アプリコードによって オンまたはオフされることはありません このエンタイトルメントがある場合 システムは作業負荷に応じて CPUとGPUの電力使用量および ファンを自動的に調整します この設定はアプリ全体に適用され コードで特定のメソッドを呼び出すことで 制御されるわけではありません Vision Proの状態や 作業負荷に応じて 動的に有効化または無効化されることを 覚えておきましょう この機能には動的な性質があるため 似たような状況でも 体験は異なる場合があります 最後に visionOSでこれらの新しい エンタープライズAPIを実装する際の ベストプラクティスについてお話しします 常に環境の安全性に配慮し Vision Proを使用するユーザーが デバイスを装着して 安全に作業できる場所にいることを 確認してください
既存のAPIを調査し 特定のユースケースに必要な機能が すでにカバーされていないかを 確認してください 既存のSDKには 素晴らしい体験を 構築するための優れた機能が すでに多数含まれています アプリに必要なエンタイトルメントだけを リクエストしてください Appleはデベロッパが エンタープライズアプリの開発目標を 達成するために必要なものを提供しつつ ユーザーのプライバシーを保護し 目的の限定を考慮したいと考えています
そして最後に 従業員のプライバシーを守ることです この追加レベルのアクセス 特にメインカメラフィードへの 直接アクセスを可能にするAPIは 職場や従業員との関係を考慮して 利用する必要があります 職場の人々のプライバシーを尊重しつつ エンタープライズのニーズに必要なもの だけを構築するようにしてください visionOS向けエンタープライズAPIの 概要は以上です 皆さんのニーズを満たす 理想的な空間アプリのアイデアと その実装とのギャップを埋める上で これらの新しいAPIが役立つことを 願っています これらのAPIは 強化されたセンサーアクセスと プラットフォームコントロールの両方に パワフルな新機能をもたらします Appleはこれらを 様々な方法で利用できる 「ビルディングブロック」として 設計しており エンタープライズのビジネスニーズに応じて カスタムアプリを 作成できるようにしています これらを利用して 今後 皆さんが 何を作り出すのか楽しみでなりません 終了する前に 最後のガイダンスを お伝えしたいと思います まず ここで取り上げたAPIの ドキュメントをぜひご確認ください このセッションの関連リソースに ドキュメントへのリンクが記載されています ご自身のニーズに合うAPIをひとつ または複数選択したら その適格性に必要なユースケースがあることを 必ず確認してください つまり 自社の従業員や 顧客の従業員のために設計された 社内向けエンタープライズアプリです それらを確認した上で ご希望のAPIに関連する 適切なエンタイトルメントを 申請してください 申請方法や場所に関する情報も このセッションのリソースに 記載されています これらの新しいAPIに関する フィードバックや 今後のvisionOSバージョンで望まれる 機能についてもぜひお聞かせください そして最後に 今年のセッション 「What’s new in device management」 をチェックして Apple Vision Proをエンタープライズで 管理する最新の手法を学んでください 「Introducing enterprise APIs for visionOS」を ご視聴いただきありがとうございました
-
-
3:36 - Main Camera Feed Access Example
// Main Camera Feed Access Example let formats = CameraVideoFormat.supportedVideoFormats(for: .main, cameraPositions:[.left]) let cameraFrameProvider = CameraFrameProvider() var arKitSession = ARKitSession() var pixelBuffer: CVPixelBuffer? await arKitSession.queryAuthorization(for: [.cameraAccess]) do { try await arKitSession.run([cameraFrameProvider]) } catch { return } guard let cameraFrameUpdates = cameraFrameProvider.cameraFrameUpdates(for: formats[0]) else { return } for await cameraFrame in cameraFrameUpdates { guard let mainCameraSample = cameraFrame.sample(for: .left) else { continue } self.pixelBuffer = mainCameraSample.pixelBuffer }
-
7:47 - Spatial barcode & QR code scanning example
// Spatial barcode & QR code scanning example await arkitSession.queryAuthorization(for: [.worldSensing]) let barcodeDetection = BarcodeDetectionProvider(symbologies: [.code39, .qr, .upce]) do { try await arkitSession.run([barcodeDetection]) } catch { return } for await anchorUpdate in barcodeDetection.anchorUpdates { switch anchorUpdate.event { case .added: // Call our app method to add a box around a new barcode addEntity(for: anchorUpdate.anchor) case .updated: // Call our app method to move a barcode's box updateEntity(for: anchorUpdate.anchor) case .removed: // Call our app method to remove a barcode's box removeEntity(for: anchorUpdate.anchor) } }
-
13:17 - Apple Neural Engine access example
// Apple Neural Engine access example let availableComputeDevices = MLModel.availableComputeDevices for computeDevice in availableComputeDevices { switch computeDevice { case .cpu: setCpuEnabledForML(true) // Example method name case .gpu: setGpuEnabledForML(true) // Example method name case .neuralEngine: runMyMLModelWithNeuralEngineAvailable() // Example method name default: continue } }
-
15:39 - Object tracking enhancements example
// Object tracking enhancements example var trackingParameters = ObjectTrackingProvider.TrackingConfiguration() // Increasing our maximum items tracked from 10 to 15 trackingParameters.maximumTrackableInstances = 15 // Leaving all our other parameters at their defaults trackingParameters.maximumInstancesPerReferenceObject = 1 trackingParameters.detectionRate = 2.0 trackingParameters.stationaryObjectTrackingRate = 5.0 trackingParameters.movingObjectTrackingRate = 5.0 let objectTracking = ObjectTrackingProvider( referenceObjects: Array(referenceObjectDictionary.values), trackingConfiguration: trackingParameters) var arkitSession = ARKitSession() arkitSession.run([objectTracking])
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。