[Picam360]固定用ネジ&スペーサー

カメラを固定するためにネジとスペーサーを使っています。

カメラをカメラ固定用プレートに固定するためにM2.6×5鍋ネジ4本を使います。

Raspberry Piの台座にM2.6×5のメスメス・スペーサー4本を使います。

Raspberry Piとカメラ固定用プレートとの空間にM2.6×10のオスメス・スペーサー4本を使います。

カメラ固定用プレートの固定のためにM2.6z5鍋ネジ4本を使います。

[部品情報]
BSB-2610E x4
ASB-2605E x4
B05-2605 x8

[キット購入]
カメラ固定プレートと固定用ネジ・スペーサーのセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Picam360]カメラ固定プレート

カメラ固定プレートは、外径寸法が38x38mmで固定用穴寸法が34x34mmのカメラをネジで固定し、Raspberry Piに固定されるようにOpenSCADで設計します。

[手順]

Step1.
まず外径は、角を丸くするためにminkowskiを使います。minkowskiは最初に定義した形状の外径を2番目に定義した形状でトレースします。2番目にcircleを指定することで角が丸くすることができます。
minkowski_squareという角が四角いモジュールを用意しました。これを用いて、Raspberry Piの固定穴に合う65x56mmの四角形を作ります。


module minkowski_square(dimension, r=2)
{
    minkowski()
    {
        square([dimension.x-r*2,dimension.y-r*2], center=true);
        circle(r=r);
    }
}

//outline of raspi dimention
translate([65/2, 56/2])
    minkowski_square(dimension=[65,56], r=2, $fn=100);

Step2.
次に、カメラ取り付け用の穴を開けます。camera_mount_hole_2Dというモジュールでカメラに実装されている部品に干渉しないように穴を調整します。
その穴を、differenceでStep1の形状から差分を取って開けます。


module camera_mount_hole_2D(size1,size2)
{ 
    minkowski_square(dimension=size1, r=1, $fn=100);
    minkowski_square(dimension=size2, r=1, $fn=100);
}
difference(){
    //outline of raspi dimention
    translate([65/2, 56/2])
        minkowski_square(dimension=[65,56], r=2, $fn=100);

    //camera : outline 38x38, hole 34x34
    camera_bolt_r = 2.7/2;
    translate([0, 3, 0]){
        translate([65/2, 56/2])
            camera_mount_hole_2D(size1=[24,38], size2=[38,24]);
        translate([65/2,56/2])
            for(i=[0:1]){
                mirror([i,0])
                    for(j=[0:1]){
                        mirror([0,j])
                            translate([34/2, 34/2])
                                circle(camera_bolt_r);
                    }
            }
    }
}

Step3.
次に、Raspberry Piの取り付け穴を開けます。
Raspberry Piの形状の設計値は、次の図の通りで、穴の位置は端から3.5mmの場所にありますので、4隅に穴を開けます。


difference(){
    //outline of raspi dimention
    translate([65/2, 56/2])
        minkowski_square(dimension=[65,56], r=2, $fn=100);

    //camera : outline 38x38, hole 34x34
    camera_bolt_r = 2.7/2;
    translate([0, 3, 0]){
        translate([65/2, 56/2])
            camera_mount_hole_2D(size1=[24,38], size2=[38,24]);
        translate([65/2,56/2])
            for(i=[0:1]){
                mirror([i,0])
                    for(j=[0:1]){
                        mirror([0,j])
                            translate([34/2, 34/2])
                                circle(camera_bolt_r);
                    }
            }
    }

    //raspi attachemnt holes
    raspi_bolt_r = 2.7/2;
    translate([3.5, 3.5])
        circle(r=raspi_bolt_r);
    translate([61.5, 3.5])
        circle(r=raspi_bolt_r);
    translate([3.5, 52.5])
        circle(r=raspi_bolt_r);
    translate([61.5, 52.5])
        circle(r=raspi_bolt_r);

}

Step4.
最後に、Raspberry Piのピンヘッダが隠れないように、四角で切り込みを入れます。


difference(){
    //outline of raspi dimention
    translate([65/2, 56/2])
        minkowski_square(dimension=[65,56], r=2, $fn=100);

    //camera : outline 38x38, hole 34x34
    camera_bolt_r = 2.7/2;
    translate([0, 3, 0]){
        translate([65/2, 56/2])
            camera_mount_hole_2D(size1=[24,38], size2=[38,24]);
        translate([65/2,56/2])
            for(i=[0:1]){
                mirror([i,0])
                    for(j=[0:1]){
                        mirror([0,j])
                            translate([34/2, 34/2])
                                circle(camera_bolt_r);
                    }
            }
    }

    //raspi attachemnt holes
    raspi_bolt_r = 2.7/2;
    translate([3.5, 3.5])
        circle(r=raspi_bolt_r);
    translate([61.5, 3.5])
        circle(r=raspi_bolt_r);
    translate([3.5, 52.5])
        circle(r=raspi_bolt_r);
    translate([61.5, 52.5])
        circle(r=raspi_bolt_r);

    //pin header
    translate([65/2, 0])
        minkowski_square(dimension=[52,13], r=1, $fn=100);
}

[設計データ]
camera_holder_34x34.scad
camera_holder_34x34.svg
camera_holder_34x34.stl

[キット購入]
カメラ固定プレートと固定用ネジ・スペーサーのセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Picam360]レンズ

Picam360では、レンズに「XHD-F1.00-5M」を採用しています。

[選定理由]
1つのレンズで半天球を撮影する、画角が180度を超えるようなレンズは「スーパーフィッシュアイレンズ」と呼ばれ、用途としては、パノラマカメラの他に、セキュリティカメラや車載カメラなどで広く使われており、様々な種類のレンズが販売されています。
一番簡易に半天球パノラマを撮影する方法は、コンバージョンレンズで既存のレンズにくっつけることです。特に、スマートフォン用のコンバージョンレンズをスマートフォンにクリップで付ける方法がよく使われます。Picam360でも、コンバージョンレンズを試してみましたが、焦点の調整や周辺の解像度、画角が220度を超えるレンズのバリエーションの少なさに難があり、より選択肢の広いM12マウントでイメージサークルが1/3.2″以上のレンズという仕様に辿り着きました。
数々のレンズを入手し撮影テストを重ねた結果、画角と画質のバランスが一番良かった「XHD-F1.00-5M」を採用しました。

[部品情報]
XHD-F1.00-5M
(http://www.xhdoptics.com/)

[キット購入]
レンズとカメラのセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Picam360]picam360-capture

Picam360は、パノラマ映像の画像処理に「picam360-capture」というソフトウェアを実装しています。パフォーマンス重視のために、C言語で実装しました。

[実装コンポーネント]

  • picam360_capture.c
    OpenGLを使用して、パノラマレンダリングをします。
  • video.c
    OpenMAXを使用して、h264動画をデコードします。
  • mjpeg_decoder.cc
    OpenMAXを使用して、mjpeg動画をデコードします。
  • rtp.c
    パケットをRTPプロトコルでストリーミングします。外部コンポーネントも検討しましたが、Raspberry Piで動作させるためにはパフォーマンスに難があり、簡易に内部実装しました。ネットワーク部分をnetcatなどの外部プロセスに移譲することを検討しましたが、こちらもパフォーマンスに難があり、内部に実装しました。

[外部参照コンポーネント]

  • OpenMAX
    画像や動画のエンコード・デコードなどのメディア処理のオープンインターフェースで、Raspberry Piにもサポートされています。Raspberry PiのOpenMAXを使用したプログラムによく登場する、ilclientは少し移植性に欠けます(他のプラットフォームに移植にトライした時にここでハマりました)。可能であれば、OpenMAX単体の実装がいいと思います。特にilclientを使用したイベントの待ち処理の互換性に難がある印象です。Picam360では、MJPEG,h264のハードウェアエンコード・デコードを行い、テクスチャメモリに転送するところで使用しています。
  • OpenGL ES 2.0
    プログラマブルシェーダーを利用して、画像処理を行うことができます。Picam360では、3Dオブジェクトのテクスチャマッピングによりパノラマ画像を作成しています。Vertexシェーダで3Dオブジェクト上にマッピングするテクスチャの座標を計算し、Fragmentシェーダで算出された座標から実際のテクスチャ内のピクセル値を取得します。各シェーダーファイルは、「/path-to-picam360-capture/shader/*.vert,*.frag」に配置されています。新規の入出力画像フォーマットに対応する場合で変更が必要となります。
  • editline
    コマンドラインを扱うためのコンポーネントです。Ctrl+Rで履歴検索が便利です。Picam360でのコマンドライン履歴ファイルは「/path-to-picam360-capture/.picam360_history」に配置されます。
    sudo apt-get install libedit-dev
  • jansson
    jasonファイルを扱うC言語のコンポーネントです。jsonはデータをテキストで簡易に表現できるので扱いが簡単です。Picam360では、設定ファイルでjsonを採用しています。
    sudo apt-get install libjansson-dev

[Files]
source code
ComponentDiagram

[Picam360]microSDカード

Picam360では、microSDカードに「Samsung microSD EVOシリーズ」を採用しています。
Raspberry PiでmicroSDカードが壊れた、という事象に多くの人が悩まされています。この問題に関しては、「信頼できるmicroSDカードを使うこと」と、「書き込みを極力減らすこと」が重要です。1つ目の「信頼できるmicroSDカードを使うこと」は、製造ロットや製品サイクルの速さの問題で信頼できる比較データを取ることは難しいです。最後は、色々使っての経験則を頼ることになります。2つ目の「書き込みを極力減らすこと」も非常に重要で、トラブルが起きる時は書き込み時が多く、随時吐き出すログデータや一時データなどはRAMDISK(メモリ上のファイルシステム)で管理することで大幅に改善できます。Picam360のファームウェアでは、/tmpフォルダがRAMDISKにセットアップされています。

[選定理由]
正確なデータを取ることは難しいですが、様々なメーカーのmicroSDカードを使用した結果の経験則としてこの、「Samsung microSD EVOシリーズ」は非常に安定しています。複数の他のメーカーのmicroSDカードはカーネル部分のデータが壊れ、カーネルパニックを起こすことが多々ありました。ですが、この「Samsung microSD EVOシリーズ」に関しては、ここ数年間に100個程度を使い倒してきましたが1つもカーネルパニックを起こしたことがありません。

[部品情報]
MB-MC32GA
http://www.samsung.com/semiconductor/minisite/jp/memorycard/microsd/evoplus/

[キット購入]
最新ファームウェアがインストール済みのmicroSDカードとRaspberry Pi 3のセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Rouv360]沖縄の美らサンゴの海での実験映像

沖縄の海で動作実験した際に実際の映像です。
操作端末であるスマホの画面録画となっています。
機体が向いている方向に関係なく自分が見たいところを見ながら操作できました。
東京から沖縄の海をリアルタイムにリモートダイビングできること確認しました。

[Picam360]カメラ

Picam360では、カメラに「ELP-USB8MP02G」と「ELP-USB3MP01H」の2つを採用しています。

[選定理由]
まずRaspberry Piでは、CSI(Camera Serial Interface)カメラとUSBカメラの選択肢があります。
CSIカメラは高速でパフォーマンス面で有利ですが、ドライバはクローズされておりOV5647、IMX219の2つのみの選択となります。
ですが、イメージセンサの素子サイズが1/4″と小さく、素子上のピクセルサイズも小さくなります。そのため、感度特性とレンズの解像度の面で不利なことに加え、レンズの選択肢も少なくなります。そこで、その問題を解決するため、IMX219よりも1/3.2″と素子サイズ、ピクセルサイズの大きいIMX179搭載のUSBカメラ「ELP-USB8MP02G」を採用しました。
また、パノラマの画質の面では、一般的な画角90°のレンズに比べ、画角180°を超える超広角のレンズでは、明暗差が大きいため、より広いダイナミックレンジが必要となります。常に逆光の領域が撮影されると考えるとイメージつきやすいと思います。そこで、3MPixelではありますが、1/3″の素子サイズでWDR機能(ダイナミックレンジを向上させる機能)を搭載しているUSBカメラとして「ELP-USB3MP01H」を採用しました。
一方、USBカメラでは、「RICOH THETA」や「Insta360」などのパノラマカメラも選択肢としてあります。ですが、Raspberry PiのOpenGLで扱えるテクスチャサイズに2048×2048の上限があり、パノラマの正距円筒図法フォーマットでは、2048×1024が最大サイズとなります。そのため、魚眼レンズを2048×2048のサイズで撮像する方が、このテクスチャサイズの上限を有効活用することができます。

Jetsonや、今後登場するRaspberry Piの新型など、プラットフォームに応じて最適な選択肢は変わってきます。
Picam360のソフトウェアでは、特定のカメラに制約があるわけではありません。現時点では魚眼レンズの画像のみサポートしていますが、パノラマの正距円筒図法フォーマットやCUBICMAPフォーマットなども今後対応予定です。

[部品情報]
ELP-USB8MP02G
(http://www.elpcctv.com/8megapixel-usb-camera-module-usb20-sony-imx179-color-cmos-sensor-p-222.html)

ELP-USB3MP01H
(https://surveillance-equipment.en.alibaba.com/productgrouplist-803340241/WDR_USB_Camera.html)

[キット購入]
レンズとカメラのセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Picam360]メインコンピュータ

Picam360では、メインコンピュータに「Raspberry Pi 3」を採用しています。

[選定理由]
安価で入手性もよく必要十分な性能を有しています。類似性能の製品に比べ情報が豊富で、多くの人に使われおり最も開発のハードルが低いシングルボードコンピュータです。
性能面では、NvidiaのJetson(https://www.nvidia.com/en-us/autonomous-machines/embedded-systems-dev-kits-modules/)が優位で、パフォーマンス重視のシステムでは検討の価値があります。
画像処理システムとしてのマイナス面では、それぞれ、Raspberry PiではCSI(Camera Sirial Interface)ドライバがクローズされておりCSI接続のカメラの選択肢がOV5647、IMX219の2つに制限されること、JetsonではOpenMAXが正式サポートされておらず、gstreamer経由での使用となるため自由度が下がることが挙げられます。
また、他のRaspberry Piシリーズに関しては、初代やzeroといったarm6系では、WebRTCがビルドできないことに加え、シングルコアのためマルチスレッドによるパフォーマンス向上が見込めないという難点があります。Raspberry Pi 2は同じarm7系ですが、wifiとBluetoothを使うためには追加のUSBデバイスが必要となるためコストパフォーマンスに劣ります。

[部品情報]
RASPBERRY PI 3 MODEL B
(https://www.raspberrypi.org/products/raspberry-pi-3-model-b/)

[キット購入]
最新ファームウェアがインストール済みのmicroSDカードとRaspberry Pi 3のセットはこちらから購入できます。
Picam360 STORE
https://store.picam360.com/

[Picam360]ファームウェア version 1.0rc をリリース

ファームウェア version 1.0rcをリリースしました。
ダウンロードし、SDカードに書き込むことでアップデートできます。
>>Download<<
gzip -dc < /path_to_firmware/picam360-firmware.1.0rc.img.gz | sudo dd of=/dev/rdisk* bs=1m

[ReleaseNote]
・SSPR(サーバーサイドパノラマレンダリング)機能向上
・描画の滑らかさ向上
・Webrtc機能安定化
・直接V4L2からの画像取り込みによりパフォーマンスの向上
・直接UDP,TCP通信を行うことによりパフォーマンスの向上

[Picam360]Introduction

近年のハードウェア環境として、スマートフォンなどの大型ディスプレイ搭載の携帯端末の普及や通信回線のコストの低下、Raspberry Piのような安価で必要十分な性能を持ったボードコンピュータが登場し、個人でも開発可能なハードウェアの幅が大きく広がりました。また、イメージセンサとディスプレイの解像度の相対的変化により、今までのアプリケーションではオーバースペックとなったイメージセンサの解像度を有効活用する動きも注目すべきです。代表例としては、撮影後でもピントを自由に選択できるライト・フィールド・カメラだったり、180度を超える画角を持った半天球パノラマカメラがあり、その流れの中で、2つの半天球パノラマカメラによる全天球パノラマカメラが普及する兆しを見せています。そういった環境変化の中で、「スマホ」x「ネットワーク」x「Raspberry Pi」x「パノラマカメラ」をターゲットとしたオープンソースなシステムがあれば、世界中のMakersの知恵から新しい価値が生まれるのではという期待を込めて「オープンソースのパノラマカメラPicam360」の開発をスタートしました。

「ネットワーク」x「カメラ」の組み合わせであるネットワークカメラは従来からありますが、制限された画角で死角を補うためには、回転機構が必要でした。その場合、データ転送の遅延の制約のもと、ユーザー視点と映像のずれが生じていました。パノラマカメラを用いることでこのずれを改善することができ、回転機構も必要ないためシンプルなシステムになります。しかし、ここで新たな問題として、2K@360°のパノラマ画像では一般的なユーザが見る画像の解像度としては0.5K@90°程度となり解像度に対するビットレートは従来よりも大幅に高くなります。従来ではサイコロの1面だけで済んだものが6面全てが必要となりビットレートが6倍に膨れたと考えればイメージしやすいと思います。YoutubeやFacebookが取り組んでいる、パノラマ映像のブロードキャスティング(1対Nの片方向通信)では、この点が制約となり、高解像度のパノラマ映像をリアルタイムにアップロード・ダウンロードするためには「PC」x「サーバー」のようなハイパフォーマンスな環境が必要となります。一方、「スマホ」x「Raspberry Pi」の組み合わせでは、多くの場合、ピアツーピア(1対1の双方向通信)で接続するので、ユーザが見ているサイコロ1面だけの画像転送で済みます。また、「PC」x「サーバー」と比べると、スマホの相対的解像度とRaspberry Piの相対的GPU性能が相殺され、対コスト比で妥当な性能が見込めます。そこで、Picam360では、SSPR(サーバーサイドパノラマレンダリング)という技術を実装し、「スマホ」x「ネットワーク」x「Raspberry Pi」x「パノラマカメラ」の組み合わせに加え、「リアルタイム」x「ピアツーピア」をターゲットとしたシステムでパフォーマンスを発揮するように開発しました。

Picam360では拡張性を重視し、クライアン側ではWEBアプリ(HTML5+Javascript+WebGL+WebRTC)を採用し、サーバー側ではNode.JS(Javascript+WebRTC)を採用しています。クライアント側、サーバー側どちらもJavascriptで記述されたプラグインを追加することで、機能拡張をすることができるようになっています。WEBアプリでピアツーピア通信を可能にするWebRTCはChrome@Androidは早くから実装されていましたが、iPhoneでは2017.SepのiOS11より実装され、ようやく環境が整いました。

今後とも、Picam360を使った新しい価値が生まれることを願って開発を進めて参ります。また、Picam360を拡張したプロジェクトの記事も掲載していきます。これらを読んでいただい方々のアイデアの種となれば幸いです。