「点群」の知識が必要になり勉強始めてみたら面白かった話

## 本記事を執筆したモチベーション
筆者は、今月(2023/12)から業務にて「点群」を扱うことになった。研修にてチラッと触れられてはいたが、知識として身についている内容はほとんどなかった。そこで、キャッチアップ期間を設けてもらい自分なりに基礎的な内容について少しだけ勉強してみた。
そして点群について勉強する内に、業務関係なしに内容が面白いと感じたため折角なので本記事を執筆するに至った。

そんな経緯で執筆することとなった本記事は、自分が点群について勉強した内容の備忘録&簡易的なアウトプットである。業務内容には触れずに、点群に関する一般知識(ググったり書籍を読めば載っているような内容)について自分なりに解釈しまとめたものとなる。そういった事情もあり、本記事には**表現や解釈に誤りを含む可能性がある**ことを、あらかじめ断っておく。

## 点群とは
- 読んで字の如く、「点の群れ」で、それ自体は単なる点の集合(から構成されるデータ形式)に過ぎない。英語では point cloudと呼び、PCという風に表記されることもある。
    - ちなみに数学用語で、別の意味の「点群(point **group**)」があるらしいので注意。この記事で扱うのは point cloudの方。
- (点の集合から成るデータ形式なので理論上は4次元以上の空間の点を扱うことも出来なくはなさそうだが、) 一般的には**3次元空間の点**のことを指す。
    - 実用上は、点の集合によって3次元空間中の立体物を表現することが多いと思われる

### データ形式としての点群についてもう少し詳しく
- 点群を構成する個々の点が持つ情報は、**座標**と**色**の2種類である。
    - 座標は空間における位置のことで、直交座標系における(x,y,z)の3つの値から表現される
    - 点が色情報を持つこともあり、その場合はRGB等の形式で色情報を保持している

## 身近な点群
上記の無味乾燥な説明で点群に興味を持つ人は少ないかもしれない。だが、点群が持つ真価は、データ形式そのものの性質よりも**点群データを取得したり操作したりする強力なツールが揃っている**ことにあると考えている。

### LiDARとは
そして、点群に関するツールの中で最も有名なのは、おそらくiPhoneのLiDARだろう。

- Light Detection and Ranging、Laser Imaging Detection and Ranging　の頭文字で、「ライダー」と読む(らしい)。
- LiDAR自体は単なるレーザー光を用いた計測手法で、Appleの特許とかではない
- 一部のiPhone及びiPad (2020年以降に発売され機種名に「Pro」とつくもの)にLiDARが搭載されている

重要なのは、iPhoneという身近なツールにLiDARが搭載されたことにより、特別な知識や技術がなくても誰もが現実空間上の物体をスキャンして(3D)点群データを取得できるようになった事だと思われる。

#### 代表的な3次元計測手法

LiDARに触れたついでに、点群データを取得するスキャン手法についても少し触れる。
点群データを取得するにあたって最低限必要なのは観測点(カメラ)と対象点(スキャンする物体)の**距離を測定する**ことだが、距離を測定する原理に応じ、スキャン手法は以下の2種類に大別される。

- ステレオ法
    - 2つ以上の観測点から対象点を撮影し、その視差から奥行きを計算する手法
        - (目が2つあることで奥行きが分かるのと同様の原理だと思われる)
    - 内部的には三角測量を用いて奥行きを計算しているらしい
        - 三角測量は2点間の距離と角度から対象点の距離を計算する手法。詳細はwikipedia等に任せるが、原理自体は単純で高校数学レベルの知識で解ける

- ToF (Time of Flight)
    - 光を照射し、反射光が返ってくるまでの時間を計測することにより対象点までの距離を測定する手法
        - (コウモリやイルカが超音波でやっているエコロケーションの光バージョンといった感じだろうか)

先ほど述べたLiDARはこのToFに分類される手法である。
上記はあくまでも大まかな分類であり、ステレオ法やToFの中でもさらに細かく分類分けされることには留意して欲しい。

### 点群データを取得できて何が嬉しいのか？

ここまでで点群データを取得する方法について述べてきたが、一体取得した点群データはどのように活用できるのだろうか？
ゲーム制作に興味のある筆者としては、モデリングしなくても現実世界の物体をスキャンしてゲーム中に登場させられそうだな……とか思ったりするのだが、多くの人に影響し得るものとしては「デジタルツイン」が挙げられる。
デジタルツインとは、端的に言えば「現実世界をデジタル世界にそっくりそのまま再現(=双子(ツイン))してしまおう！」というアイデアのこと。これが実現すれば、例えば流行りのメタバースなんかだったら、よりリアルな体験が得られることが期待されるだろう。デジタルツインにより実現できる事はメタバースの体験向上の他にも多岐に渡ると思われるが、「点群」というトピックから逸脱してしまうので本記事では割愛する。

## 点群の勉強
こういった夢のある話を聞けば、少しは点群に興味が湧いて勉強モチベも上がるだろうか。筆者はそういうタイプなので、理論的な話の合間に活用事例を調べたりしてモチベを上げている。
さて、点群の勉強をする上で、筆者は書籍「詳解 3次元点群処理」を読んでいる(詳細は記事末尾の「参考」に記載)。まだ序盤しか読んでおらず理解も浅い状態だが、自分なりに内容をまとめてみようと思う。

### 点群データの取り扱い
本書では、点群データを取り扱う上でオープンソースライブラリである PCL(Point cloud library)を使用している。先ほど「点群が持つ真価は点群データを取得し扱う強力なツールが登場し始めていることにある」と述べたが、こういったライブラリ等の環境が整備されていることも点群というデータ形式の強みの一つだと感じている。
環境構築の手順等は本書やウェブ上の情報を参考にされたし(実は筆者もこれから環境構築をするところである)

### 点群データの回転・拡大/縮小
立体(3次元)データを扱う上で、立体の回転や拡大/縮小はごく基本的な操作である。本書では3次元空間における点の回転と並進の数学的な取り扱いについて述べた後、それを実装したコードが紹介されている。

#### 3次元空間上の点の回転と並進を扱う方法の比較
本書では、回転行列→オイラー角→四元数(クォータニオン)の順で、(数学的に)3次元空間上の点の回転と並進を扱う方法を記載されている。本書が巧みなのは、紹介する順に**点の回転と並進を扱う方法が洗練されてくる**所だ。数式等の詳細な説明は省く(~~筆者は一部理解できていない箇所がある~~)が、本書の説明を要約すると、以下のようになる。

- 回転行列は、任意の回転軸に対するθ°の回転を3×3の行列(自由度は3)で表現したものである。
    - 回転行列は(恐らく)高校数学レベルの知識でも理解できるくらい容易かつ基本的な表現方法だが、自由度が3であるにも関わらず9個もの数字を使用している点で冗長だと言える。
- オイラー角は、3次元空間における回転をx,y,zの三軸に対する回転で表現したものである。
    - 3種類の回転には、「ロール」、「ピッチ」、「ヨー」という名前がついている。文章のみで表現するのは難しいので、本書等の情報を参照されたい。
    - 回転行列からオイラー角を求める際、３つのうち１つが特定の角度(π/2)の場合に他の角度が一位に定まらないことが知られている。この特定の角度のことを特異点と呼び、特異点付近で解が不安定になる現象を「ジンバルロック」と呼ぶ。
- 四元数は、θ°の回転を複素数を使って表現したものである。
    - 特徴としては、いわば回転行列とオイラー角の「いいとこ取り」な手法である。四元数は名前の通りパラメータ数が４つと(回転行列と比較して)パラメータ数が減っている上に、オイラー角の特異点付近で見られるように解が不安定なることもない。
    - (四元数の数学的な説明については、筆者も理解途中であるため説明が不十分な可能性がある)

## おわりに
なんだかまとまりの無い内容だったが、以上が筆者が点群について学んだ内容である。もちろん点群の勉強はこれで終わりではなく、今後も書籍を読んだり実際にコードを動かしてみたりと色々遊んでみる予定である。
冒頭で述べた通り、本記事はあくまで筆者の個人的な備忘録としての側面が強い。それでも、一応「点群」という言葉を聞いたことがない人にも分かりやすく、かつ興味を持ってもらえるように書いたつもりである。この記事をキッカケに点群について勉強を始めるという人が一人でも増えれば幸いである。

## 参考
- [『詳解 3次元点群処理 pythonによる基礎アルゴリズムの実装』 (金崎 朝子 (著), 秋月 秀一 (著), 千葉 直也 (著))](https://www.amazon.co.jp/%E8%A9%B3%E8%A7%A3-3%E6%AC%A1%E5%85%83%E7%82%B9%E7%BE%A4%E5%87%A6%E7%90%86-Python%E3%81%AB%E3%82%88%E3%82%8B%E5%9F%BA%E7%A4%8E%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E5%AE%9F%E8%A3%85-KS%E7%90%86%E5%B7%A5%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E9%87%91%E5%B4%8E/dp/406529343X)