The PCD (Point Cloud Data) file format

PCDファイル形式

出典:http://pointclouds.org/documentation/tutorials/pcd_file_format.php#pcd-file-format

Why a new file format?

PCD用のファイル形式が必要な理由

PCDファイル形式は、車輪を再発明するものではない。既存のファイル形式を補完し、PCLが$n-D$点群(ポイントクラウド)処理にもたらす拡張機能をサポートするためのものである。

PCDは、3次元の点群データをサポートするファイル形式の最初のものではない。特にコンピュータグラフィックス(CG)や計算幾何学分野では、レーザスキャナを使用して得られた任意のポリゴンや点群(ポイントクラウド)を記述する形式が多数作られている。例えば次のようなものがある:

  • PLY : スタンフォード大学(Turk et al.)によって開発されたポリゴンファイル形式
  • STL : 3D Systemsによって作成されたステレオリ・ソグラフィーCADソフトウェアに固有のファイル形式
  • OBJ : Wavefront Technologiesによって最初に開発されたジオメトリ定義ファイル形式
  • X3D : 3Dコンピュータグラフィックス・データを表現するためのISO標準のXMLベースのファイルフォーマット
  • その他たくさん http://en.wikipedia.org/wiki/Category:Graphics_file_formats

上記のすべてのファイル形式には次節で説明するようにいくつかの問題がある。これらは今日のセンシング技術とアルゴリズムが発明されるまでの間に異なる目的と年代で作成されたものであるから、問題があるのは自然なことである。

PCD versions

PCDのバージョン

ポイント・クラウド・ライブラリ(PCL)バージョン1.0のリリース前に、PCDファイル形式にはいろいろな形式があった。これらはPCD_Vx(例えば、PCD_V5、PCD_V6、PCD_V7など)という番号が付けられ、それぞれPCDファイルのバージョン番号0.xを表す。

ただし、PCLでのPCDファイル形式の正式な開始時点は、バージョン0.7(PCD_V7)である。

File format header

ファイルフォーマットヘッダ

各PCDファイルには、ファイルに格納されているポイントクラウドデータの特定の属性を識別して宣言するヘッダが含まれている。 PCDのヘッダーはASCIIでエンコードしなければならない。

注意: PCDファイルで指定された各ヘッダ・エントリとアスキーで書かれたポイントデータ(下記参照)は、改行\nで区切られている。

バージョン0.7以降、PCDヘッダには以下のエントリが含まれている。

  • VERSION (バージョン): PCDのファイル形式のバージョン
  • FIELDS (フィールド): 点が持てる次元/フィールドそれぞれの名前

例:

FIELDS x y z                                # XYZ data
FIELDS x y z rgb                            # XYZ + colors
FIELDS x y z normal_x normal_y normal_z     # XYZ + surface normals
FIELDS j1 j2 j3                             # moment invariants
...
  • SIZE : 各次元のサイズをバイト単位で指定。

例:

* unsigned char / charは1バイト
* unsigned short / shortは2バイト
* unsigned int / int / floatは4バイト
* doubleは8バイト

  • TYPE : 次元の型をcharとして指定。現在受け入れ可能な型は次の通り:

    • I : 符号付きの型int8(char)、int16(short)、およびint32(int)を表す。
    • U : 符号なしの型を表すuint8(符号なしのchar)、uint16(符号なしのshort)、uint32(符号なしのint)
    • F : 浮動小数点型を表す
  • COUNT : 各次元に含まれる要素の数を指定。たとえば、$x$データには通常1個の要素があるが、VFHのような特徴記述子には308個の要素がある。基本的に、これは各点で$n-D$ヒストグラム記述子を導入する方法で、それらを1つの連続したメモリ・ブロックとして扱うことができる。デフォルトではCOUNTが存在しない場合、すべての次元数は1に設定される。

  • WIDTH : ポイントクラウドデータセットの幅をポイント数で指定。 WIDTHには2つの意味がある。(HEIGHTも参照のこと)

    • 非組織化データセットのクラウド内のポイントの総数を指定(POINTSと同じ)。
    • 組織化ポイントクラウド・データセットの幅(行内のポイントの総数)を指定

注意: 組織化ポイントクラウド・データセットとは、画像(や行列)に似たポイントクラウドに与えられた名前である。そこではデータが行と列に分割された構造をもつ。 このようなポイントクラウドの例には、ステレオカメラやTime Of Flightカメラ(3次元距離画像カメラ、光の移動速度を利用し、発光した光が対象物に反射して、帰ってくるまでの時間を距離に置換えた方式)からのデータが含まれる。 組織化データセットの利点には、隣接する点(例えばピクセル)間の関係を知ることにより、最近傍演算がとても効率的であるため、計算を高速化し、PCLの特定のアルゴリズムのコストを下げることがある。

例:

WIDTH 640     # 1行に640個の点
  • HEIGHT - ポイントクラウド・データセットの高さをポイント数で指定。 HEIGHTには2つの意味がある:
    • 組織化ポイントクラウドデータセットの高さ(行の総数)の指定
    • 非組織化データセットの場合は$1$に設定される(データセットが組織化されているかどうかの確認のために使用される)。

例:

WIDTH 640              #画像のように整理された構造, 640行480列からなる、
HEIGHT 480             #したがって、このデータセットには 640 * 480 = 合計307200 の点がある

例:

WIDTH 307200
HEIGHT 1                # 307200個の点からなる組織化されていない点群データセット
  • VIEWPOINT : データセット内の点を取得した視点を指定。 これは後で、異なる座標系間の変換を構築したり、一貫した方向を必要とする面法線などの機能を補助したりするために使用されることがある。

視点情報は、平行移動$(t_x, t_y, t_z)+$四つ組$(q_w, q_x, q_y, q_z)$として指定される。 デフォルト値は次のとおり。

VIEWPOINT 0 0 0 1 0 0 0
  • POINTS : クラウド内のポイントの総数を指定。 バージョン0.7時点ではその目的が冗長であるため、将来のバージョンでこれを削除する予定である。

例:

POINTS 307200   # クラウド内のポイントの総数
  • DATA : 点群データが格納されるデータ型を指定。バージョン0.7では、asciibinaryの2つのデータ型がサポートされている。 詳細は、次節参照。

注: ヘッダーの最後の行(DATA)の直後の次のバイトは、ポイントクラウドデータの一部とみなされ、そのように解釈される。

警告 ヘッダーエントリは、上記の順序で正確に指定する必要がある。つまり

VERSION
FIELDS
SIZE
TYPE
COUNT
WIDTH
HEIGHT
VIEWPOINT
POINTS
DATA

Data storage types

データ格納型

バージョン0.7時点では、$\bf .PCD$ファイル形式はデータの格納に2つのモードがある:

  • ascii形式: それぞれの点は別々の行に記入
p_1
p_2
p_3
p_4
...

p_n

注: PCLバージョン1.01からは、NANは"nan"(非数値データ)を表す

  • binary形式ではデータはpcl::PointCloud.pointsの配列/ベクトルの完全なメモリコピーである。 Linuxシステムでは、データへの最速の読み込み/書き込みアクセスにmmap / munmap操作を使用する。

行、スペース、もしくはタブで区切られたascii以外の他の文字を含まない単純なascii形式でも、binaryダンプ形式でもポイントクラウドデータを保存することで、どのようなアプリケーションに用いるかにより2つの領域の最適な性質がもてる、つまり単純さと速さである。ascii形式では、ユーザーはポイントクラウド・ファイルを開き、gnuplotのような標準的なソフトウェアツールを使ってプロットしたり、sedawkなどのツールを使ってそれらを操作することができる。

Advantages over other file formats

他のファイル形式に対する利点

実際には、既存のファイル形式のどれもPCDファイルの柔軟性とスピードを提供しないため、PCDファイル形式が作られた。その明確な利点のいくつかを紹介する:

  • 組織化ポイントクラウド・データセットを保存して処理する能力: これはリアルタイムのアプリケーションや拡張現実、ロボットなどの研究分野にとって非常に重要。
  • バイナリのmmap / munmapデータ型は、データをディスクにロードして保存するための最速の方法である。
  • いろいろなデータ型(サポートされている基本の型:char、short、int、float、double)でデータを記憶することで、ポイントクラウドデータを記憶と処理に関して柔軟かつ効率化することが可能。なお無効な点の次元は、通常、NAN型として扱われる。
  • 特徴記述子の$n-D$ヒストグラム: 3D知覚/コンピュータビジョン・アプリケーションにとって非常に重要

さらに、ネイティブタイプとしてPCLとは異なるファイル形式を導入し、それを変換するという遅延を持ち込むのではなく、ファイル形式を制御することによって、PCLに最もよく適合させることができ、したがってPCLアプリケーションに関して最高のパフォーマンスを得ることができるというのも付加的な利点である。

注意: PCL(Point Cloud Data)はPCLのネイティブファイル形式であるが、pcl_ioライブラリはOBJ, PCD, PLY, STL, VTK形式のファイル形式のデータを保存し読み込むことができる。(Open3Dでは pcd, ply, xyz, xyzrgb, xyzn, pts形式を read_point_cloud関数がサポートしている).

PCDファイルの例を以下に示す。それがどのようなデータかという解釈は読者に任せる。

# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z rgb
SIZE 4 4 4 4
TYPE F F F F
COUNT 1 1 1 1
WIDTH 213
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 213
DATA ascii
0.93773 0.33763 0 4.2108e+06
0.90805 0.35641 0 4.2108e+06
0.81915 0.32 0 4.2108e+06
0.97192 0.278 0 4.2108e+06
0.944 0.29474 0 4.2108e+06
0.98111 0.24247 0 4.2108e+06
0.93655 0.26143 0 4.2108e+06
0.91631 0.27442 0 4.2108e+06
0.81921 0.29315 0 4.2108e+06
0.90701 0.24109 0 4.2108e+06
0.83239 0.23398 0 4.2108e+06
0.99185 0.2116 0 4.2108e+06
0.89264 0.21174 0 4.2108e+06
0.85082 0.21212 0 4.2108e+06
0.81044 0.32222 0 4.2108e+06
0.74459 0.32192 0 4.2108e+06
0.69927 0.32278 0 4.2108e+06
0.8102 0.29315 0 4.2108e+06
0.75504 0.29765 0 4.2108e+06
0.8102 0.24399 0 4.2108e+06
0.74995 0.24723 0 4.2108e+06
0.68049 0.29768 0 4.2108e+06
0.66509 0.29002 0 4.2108e+06
0.69441 0.2526 0 4.2108e+06
0.62807 0.22187 0 4.2108e+06
0.58706 0.32199 0 4.2108e+06
0.52125 0.31955 0 4.2108e+06
0.49351 0.32282 0 4.2108e+06
0.44313 0.32169 0 4.2108e+06
0.58678 0.2929 0 4.2108e+06
0.53436 0.29164 0 4.2108e+06
0.59308 0.24134 0 4.2108e+06
0.5357 0.2444 0 4.2108e+06
0.50043 0.31235 0 4.2108e+06
0.44107 0.29711 0 4.2108e+06
0.50727 0.22193 0 4.2108e+06
0.43957 0.23976 0 4.2108e+06
0.8105 0.21112 0 4.2108e+06
0.73555 0.2114 0 4.2108e+06
0.69907 0.21082 0 4.2108e+06
0.63327 0.21154 0 4.2108e+06
0.59165 0.21201 0 4.2108e+06
0.52477 0.21491 0 4.2108e+06
0.49375 0.21006 0 4.2108e+06
0.4384 0.19632 0 4.2108e+06
0.43425 0.16052 0 4.2108e+06
0.3787 0.32173 0 4.2108e+06
0.33444 0.3216 0 4.2108e+06
0.23815 0.32199 0 4.808e+06
0.3788 0.29315 0 4.2108e+06
0.33058 0.31073 0 4.2108e+06
0.3788 0.24399 0 4.2108e+06
0.30249 0.29189 0 4.2108e+06
0.23492 0.29446 0 4.808e+06
0.29465 0.24399 0 4.2108e+06
0.23514 0.24172 0 4.808e+06
0.18836 0.32277 0 4.808e+06
0.15992 0.32176 0 4.808e+06
0.08642 0.32181 0 4.808e+06
0.039994 0.32283 0 4.808e+06
0.20039 0.31211 0 4.808e+06
0.1417 0.29506 0 4.808e+06
0.20921 0.22332 0 4.808e+06
0.13884 0.24227 0 4.808e+06
0.085123 0.29441 0 4.808e+06
0.048446 0.31279 0 4.808e+06
0.086957 0.24399 0 4.808e+06
0.3788 0.21189 0 4.2108e+06
0.29465 0.19323 0 4.2108e+06
0.23755 0.19348 0 4.808e+06
0.29463 0.16054 0 4.2108e+06
0.23776 0.16054 0 4.808e+06
0.19016 0.21038 0 4.808e+06
0.15704 0.21245 0 4.808e+06
0.08678 0.21169 0 4.808e+06
0.012746 0.32168 0 4.808e+06
-0.075715 0.32095 0 4.808e+06
-0.10622 0.32304 0 4.808e+06
-0.16391 0.32118 0 4.808e+06
0.00088411 0.29487 0 4.808e+06
-0.057568 0.29457 0 4.808e+06
-0.0034333 0.24399 0 4.808e+06
-0.055185 0.24185 0 4.808e+06
-0.10983 0.31352 0 4.808e+06
-0.15082 0.29453 0 4.808e+06
-0.11534 0.22049 0 4.808e+06
-0.15155 0.24381 0 4.808e+06
-0.1912 0.32173 0 4.808e+06
-0.281 0.3185 0 4.808e+06
-0.30791 0.32307 0 4.808e+06
-0.33854 0.32148 0 4.808e+06
-0.21248 0.29805 0 4.808e+06
-0.26372 0.29905 0 4.808e+06
-0.22562 0.24399 0 4.808e+06
-0.25035 0.2371 0 4.808e+06
-0.29941 0.31191 0 4.808e+06
-0.35845 0.2954 0 4.808e+06
-0.29231 0.22236 0 4.808e+06
-0.36101 0.24172 0 4.808e+06
-0.0034393 0.21129 0 4.808e+06
-0.07306 0.21304 0 4.808e+06
-0.10579 0.2099 0 4.808e+06
-0.13642 0.21411 0 4.808e+06
-0.22562 0.19323 0 4.808e+06
-0.24439 0.19799 0 4.808e+06
-0.22591 0.16041 0 4.808e+06
-0.23466 0.16082 0 4.808e+06
-0.3077 0.20998 0 4.808e+06
-0.3413 0.21239 0 4.808e+06
-0.40551 0.32178 0 4.2108e+06
-0.50568 0.3218 0 4.2108e+06
-0.41732 0.30844 0 4.2108e+06
-0.44237 0.28859 0 4.2108e+06
-0.41591 0.22004 0 4.2108e+06
-0.44803 0.24236 0 4.2108e+06
-0.50623 0.29315 0 4.2108e+06
-0.50916 0.24296 0 4.2108e+06
-0.57019 0.22334 0 4.2108e+06
-0.59611 0.32199 0 4.2108e+06
-0.65104 0.32199 0 4.2108e+06
-0.72566 0.32129 0 4.2108e+06
-0.75538 0.32301 0 4.2108e+06
-0.59653 0.29315 0 4.2108e+06
-0.65063 0.29315 0 4.2108e+06
-0.59478 0.24245 0 4.2108e+06
-0.65063 0.24399 0 4.2108e+06
-0.70618 0.29525 0 4.2108e+06
-0.76203 0.31284 0 4.2108e+06
-0.70302 0.24183 0 4.2108e+06
-0.77062 0.22133 0 4.2108e+06
-0.41545 0.21099 0 4.2108e+06
-0.45004 0.19812 0 4.2108e+06
-0.4475 0.1673 0 4.2108e+06
-0.52031 0.21236 0 4.2108e+06
-0.55182 0.21045 0 4.2108e+06
-0.5965 0.21131 0 4.2108e+06
-0.65064 0.2113 0 4.2108e+06
-0.72216 0.21286 0 4.2108e+06
-0.7556 0.20987 0 4.2108e+06
-0.78343 0.31973 0 4.2108e+06
-0.87572 0.32111 0 4.2108e+06
-0.90519 0.32263 0 4.2108e+06
-0.95526 0.34127 0 4.2108e+06
-0.79774 0.29271 0 4.2108e+06
-0.85618 0.29497 0 4.2108e+06
-0.79975 0.24326 0 4.2108e+06
-0.8521 0.24246 0 4.2108e+06
-0.91157 0.31224 0 4.2108e+06
-0.95031 0.29572 0 4.2108e+06
-0.92223 0.2213 0 4.2108e+06
-0.94979 0.24354 0 4.2108e+06
-0.78641 0.21505 0 4.2108e+06
-0.87094 0.21237 0 4.2108e+06
-0.90637 0.20934 0 4.2108e+06
-0.93777 0.21481 0 4.2108e+06
0.22244 -0.0296 0 4.808e+06
0.2704 -0.078167 0 4.808e+06
0.24416 -0.056883 0 4.808e+06
0.27311 -0.10653 0 4.808e+06
0.26172 -0.10653 0 4.808e+06
0.2704 -0.1349 0 4.808e+06
0.24428 -0.15599 0 4.808e+06
0.19017 -0.025297 0 4.808e+06
0.14248 -0.02428 0 4.808e+06
0.19815 -0.037432 0 4.808e+06
0.14248 -0.03515 0 4.808e+06
0.093313 -0.02428 0 4.808e+06
0.044144 -0.02428 0 4.808e+06
0.093313 -0.03515 0 4.808e+06
0.044144 -0.03515 0 4.808e+06
0.21156 -0.17357 0 4.808e+06
0.029114 -0.12594 0 4.2108e+06
0.036583 -0.15619 0 4.2108e+06
0.22446 -0.20514 0 4.808e+06
0.2208 -0.2369 0 4.808e+06
0.2129 -0.208 0 4.808e+06
0.19316 -0.25672 0 4.808e+06
0.14497 -0.27484 0 4.808e+06
0.030167 -0.18748 0 4.2108e+06
0.1021 -0.27453 0 4.808e+06
0.1689 -0.2831 0 4.808e+06
0.13875 -0.28647 0 4.808e+06
0.086993 -0.29568 0 4.808e+06
0.044924 -0.3154 0 4.808e+06
-0.0066125 -0.02428 0 4.808e+06
-0.057362 -0.02428 0 4.808e+06
-0.0066125 -0.03515 0 4.808e+06
-0.057362 -0.03515 0 4.808e+06
-0.10653 -0.02428 0 4.808e+06
-0.15266 -0.025282 0 4.808e+06
-0.10653 -0.03515 0 4.808e+06
-0.16036 -0.037257 0 4.808e+06
0.0083286 -0.1259 0 4.2108e+06
0.0007442 -0.15603 0 4.2108e+06
-0.1741 -0.17381 0 4.808e+06
-0.18502 -0.02954 0 4.808e+06
-0.20707 -0.056403 0 4.808e+06
-0.23348 -0.07764 0 4.808e+06
-0.2244 -0.10653 0 4.808e+06
-0.23604 -0.10652 0 4.808e+06
-0.20734 -0.15641 0 4.808e+06
-0.23348 -0.13542 0 4.808e+06
0.0061083 -0.18729 0 4.2108e+06
-0.066235 -0.27472 0 4.808e+06
-0.17577 -0.20789 0 4.808e+06
-0.10861 -0.27494 0 4.808e+06
-0.15584 -0.25716 0 4.808e+06
-0.0075775 -0.31546 0 4.808e+06
-0.050817 -0.29595 0 4.808e+06
-0.10306 -0.28653 0 4.808e+06
-0.1319 -0.2831 0 4.808e+06
-0.18716 -0.20571 0 4.808e+06
-0.18369 -0.23729 0 4.808e+06