---
title: "HoloLens 2でBCPDを用いた空間位置合わせシステムについて"
emoji: "📝"
type: "tech"
topics: []
published: true
published_at: "2021-04-21 15:41"
cover: "./20210421143158.jpg"
category: "info"
description: "ホロラボ 斎藤です。今回、R＆Dチームの取り組みの一つとして、BCPDを用いた空間位置合わせに関する調査を行ってみました。 1. はじめに AR/MRにおいて、コンテンツを含む仮想空間と現実空間を合わせることはとても重要です。 それぞれの空"
original_url: "https://blog.hololab.co.jp/entry/2021/04/21/154111"
---
![](./20210421143158.jpg)

ホロラボ 斎藤です。今回、R＆Dチームの取り組みの一つとして、BCPDを用いた空間位置合わせに関する調査を行ってみました。

# 1\. はじめに

AR/MRにおいて、コンテンツを含む仮想空間と現実空間を合わせることはとても重要です。 それぞれの空間の位置、回転、およびスケールを合わせることによって、ユーザーに違和感なく現実への情報の重ね合わせを行うことができます。

そこで、今回はBCPD（Bayesian Coherent Point Drift）という点群位置合わせの手法の一つを用いて、HoloLens 2で空間位置合わせを行ってみました。

まずはデモ動画をご覧になってください。

<iframe width="560" height="315" src="https://www.youtube.com/embed/rZnvQtv1Jl8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen=""></iframe>

[www.youtube.com](https://www.youtube.com/watch?v=rZnvQtv1Jl8)

# 2\. 空間位置合わせとは

特にHoloLens2では、仮想空間の座標系の原点位置および回転は、アプリ起動時の端末位置および回転となります。 しかし、このままだと現実との空間座標系が合っていないため、仮想空間を現実に重畳できません。 したがって、何らかの方法で仮想空間と現実空間の位置合わせを行う必要があります。

今回のデモでいうと、仮想的な家具を示すオブジェクト（水色がベッド、ピンク色がたんす）を、空間位置合わせを使って、 現実の家具の位置へ重畳することにあたります。仮想的な家具を示すオブジェクトの初期配置は起動位置によって違うため、 起動後に仮想空間と現実空間の位置回転の差分を計算し、仮想空間の補正をしていきます。

<figure><img src="./20210421104348.png" alt="デモにおける空間位置合わせのイメージ" loading="lazy"><figcaption>デモにおける空間位置合わせのイメージ</figcaption></figure>

仮想空間と現実空間の位置合わせのために、よく使われる手法としては、画像マーカーを用いる方法が挙げられます。 また既存サービスとしては、Microsoft社のAzure Spatial Anchors \*1 や、Azure Object Anchors \*2、およびPTC社のVuforia \*3 などが挙げられます。 現状 HoloLens 2 以外では、Immersal \\ \*4 も注目されています。 ホロラボにおいても、位置合わせに関する研究開発を行っています。

# 3\. BCPD（Bayesian Coherent Point Drift）とは

点群位置合わせ手法の一つで、点と点の対応関係を効率よく導くことができる手法です。基本的には非剛体の点群位置合わせ手法ではありますが、パラメータを調整して剛体位置合わせに用いることもできます。 

<https://github.com/ohirose/bcpd>

[github.com](https://github.com/ohirose/bcpd)

今回は、BCPDを剛体位置合わせ用のパラメータを指定することで、あらかじめ取得した部屋の点群と、位置合わせしたいタイミングでの部屋の点群の間のRST行列を得ます。 ここでのRST行列とは、回転（Rotate）・拡大縮小（Scale）・平行移動(Translate)を含む4行4列の行列を指します。 下記図は、あらかじめ取得した部屋の点群（青色）と、位置合わせしたいタイミングでの部屋の点群（緑色）、変換した結果の点群（水色）の関係を示しています。

<figure><img src="./20210330140122.webp" alt="BCPDを使った部屋の点群位置合わせ" loading="lazy"><figcaption>BCPDを使った部屋の点群位置合わせ</figcaption></figure>

# 4\. システム概要

システム概要図を以下に示します。

<figure><img src="./20210330142732.jpg" alt="システム概要図" loading="lazy"><figcaption>システム概要図</figcaption></figure>

まず、今回あらかじめ部屋の点群(ターゲット点群)を取得しておきます。

①まず、位置合わせしたいタイミングでの部屋の点群データ(インプット点群)を取得します。 取得にはMRTKのサービスロケータから取得できるSpatial Mapを使用しています。 （Spatial Understandingも使えると思います。）

②次に取得した部屋の点群データ(インプット点群)をローカルネットワークを介してPCへ送信します。 今回BCPDの計算自体は計算用のPCを用意して、ローカルネットワークを介してやり取りをしています。 ただ、手法としてはHoloLens 2上で計算することもできるはずです。

③インプット点群と、あらかじめ取得しておいたターゲット点群を使ってBCPDの計算を行い、二つの点群の間のRST行列を取得します。

④取得した二つの点群の間のRST行列をHoloLens2端末へ送信します。

⑤二つの点群の間のRST行列を用いて、空間をの位置合わせを行います。

# 5\. おわりに

今回はHoloLens 2における、BCPD（Bayesian Coherent Point Drift）という点群位置合わせの手法の一つを用いた空間位置合わせシステムを開発しました。 現在、2章で紹介した他の手法と比較して、精度、計算の速さ、利用点群の組み合わせ（例えば、全部屋をターゲットとして、インプットを一部屋にした場合はどうなるか？）についても調査を進めています。 また、点群取得デバイスが違う場合（例えば、iPadのLidarで取得した点群をターゲットにした場合）ではどうすればよいか？などについても研究を進めていきたいと考えています。

\*1 Azure Spatial Anchors :

[https://azure.microsoft.com/ja-jp/services/spatial-anchors/](https://azure.microsoft.com/ja-jp/services/spatial-anchors/)

\*2 Azure Object Anchors :

[https://azure.microsoft.com/ja-jp/services/object-anchors/](https://azure.microsoft.com/ja-jp/services/object-anchors/)

\*3 Vuforia :

[https://developer.vuforia.com/](https://developer.vuforia.com/)

\*4 Immersal : [https://immersal.com/](https://immersal.com/)
