HN 日本語サマリー

← 一覧へ戻る
プログラミング

ハードウェアハッカー向けステレオビジョンボードを自作した

I Built a Stereo Vision Board for Hardware Hackers (rootkitlabs.com)

60 pointsby machinehum9 コメント

要約

著者はRockchip RV1103 SoCを搭載した安価でシンプルなステレオビジョンボードを開発しました。このボードは、ロボット工学における障害物回避やナビゲーション、あるいはスタンドアロンのLinuxデバイスとして利用可能です。記事では、ハードウェア設計、Linuxカーネルとブートローダーの構築、そしてSAD(Sum of Absolute Differences)アルゴリズムを用いたステレオビジョン処理のソフトウェアスタックについて詳細に解説しています。

全文翻訳

ハードウェアハッカー向けステレオビジョンボードを自作した

この記事は完全に人間によって、人間向けに書かれました。


私は特定のチップに興奮することがあります。今回はマイクロプロセッサです。Rockchip RV1103は、64MBのDDR2 RAMとMIPI CSI-2バスをQFN-88パッケージに詰め込んだ、シングルコア1.1 GHz ARM Cortex-A7 SoC(System on Chip)です。このチップを使って、私はコンピューティング機能とLinuxサポートを内蔵した、安価でシンプルなステレオビジョンボードを自作しました。

[画像: Design Files]

Design Files

私はこのボードをロボット工学プロジェクトに統合することをvisionしています。例えば、障害物回避やナビゲーションを行うArduinoのようなものです。電源を入れると、ボードはシリアルポート経由でデータを送信します。あるいは、Linuxボードとして期待されるすべての機能を備えた、単体で使用することもできます。

以下のビデオは、ハードウェア上での画像キャプチャと深度処理を示しています。

このブログ記事では、ハードウェア、ファームウェア、ソフトウェアの詳細を概説します!

システム概要

[画像]

PCB

安価な4層基板でこのプロジェクトはうまくいきました。

[画像: Top Layer: Controlled-impedance traces: USB, MIPI, and Ethernet. With some Signal/Power.]

Top Layer: 制御インピーダンス配線: USB、MIPI、Ethernet。一部信号/電源。

[画像: Inner L1: Solid ground.]

Inner L1: ソリッドグラウンド。

[画像: Inner L2: Signal/Power]

Inner L2: 信号/電源。

[画像: Bottom Layer: Signal/Power]

Bottom Layer: 信号/電源。

最初の試みで基板のほとんどは正しくできましたが、いくつかの問題がありました。

  • SoCを間違って注文しました。それは楽しい交換作業でした。
  • レンズマウントの穴が2.2 mmではなく1.8 mmでドリルされていました。
  • 1kΩの抵抗器は、LEDをきれいに光らせるには小さすぎました。
  • 0.9 Vの配線は細すぎましたが、問題なく動作しているようでした。

カーネル、ブートローダー、OS

ブート可能なOS、ドライバ、ブートローダー、カーネルが必要でした。これには、お気に入りのLinuxビルドシステムであるBuildrootを使用しました。Buildrootはこれらの要素をsdcard.imgに結合し、これをSDカードにフラッシュしてボードに挿入し、起動します。

残念ながら、このプロジェクトに必要なものがすべてアップストリームで利用できるわけではありません。RockchipのMIPIドライバ、ハードウェアアクセラレータ、その他のいくつかの主要コンポーネントは、すべてベンダーBSPから提供されました。Buildrootは、アウトオブツリーカーネルのサポートを備えています。

このチップには、いくつかの異なるブートステージがあります。ほとんどのARM MPUは、おおよそ次のような構造になっています。

  1. (ブートローダー) BootROM: TPLを取得して実行します。これはROM内にあり、SRAM(より小さい、メインではないRAM)を使用します。
  2. (ブートローダー) TPL (“Tertiary Program Loader”): DRAMコントローラを設定します。これはRockchip製のバイナリです。
  3. (ブートローダー) SPL (“Secondary Program Loader”): U-Bootをロードします。U-Bootプロジェクトに含まれています。
  4. (ブートローダー) U-Boot: これがメインのブートローダーです。カーネルをロードします。他にも便利な機能があります。
  5. (カーネル): Linux
  6. (OS) Init System: サービスを開始します。

Buildrootでの簡単な設定の後、シリアルポート経由でシェルにアクセスできるようになりました。最終的には、USB-CポートをEthernetアダプタとして使用してSSHに移行しました。

ソフトウェアスタック

[画像: The SW architecture]

ソフトウェアMVPは、カーネルと通信して画像データを取得し、カメラを制御し、ハードウェアアクセラレータを使用する必要がありました。幸いなことに、ダイアグラムの上部でマークされたカーネル空間のすべては、Buildrootによって私たち用に組み立てられました。私たちは青い部分だけを作成する必要がありましたが、残りは簡単に説明します。

カーネル空間

ダイアグラムの上部に行くほどドライバが抽象化され、下部に行くほどハードウェア固有になることに気づくかもしれません。これは、ユーザーアプリケーションがV4L2によって作成されたノードと通信でき、特定のカメラコマンドを気にする必要がないことを意味します。

SoCペリフェラル(I2C、CSIなど)には、SoC固有のドライバがあります。これは、カメラドライバ(この場合はOV9281)がどのSoCで実行されているかを知る必要がないようにするためです。

これはすべてかなり標準的なLinuxデバイスドライバの作業なので、これ以上の詳細は割愛します。

ユーザースペース

データは最終的にVideo4Linux2に流れ込み、これが/dev/videoXというノードでカメラを公開します。各カメラは11個のビデオノードを表示します。

  • video0: 通常のビデオキャプチャ
  • video1-3: その他のストリームID
  • video4-7: スケーラー
  • video8-10: 補助ツール

カメラ制御は/dev/v4l-subdevXを通じて公開されます。これらのノードを使用して、露出を設定したり、さまざまなカメラ機能を制御したりできます。

「Rockchip Video Engine」は/dev/rveを通じて公開されます。私たちはプロプライエタリなlibrve.aを使用してエンジンと通信し、さまざまなハードウェアビデオアクセラレーションタスクをスケジュールします。これについては後で詳しく説明します。

ユーザースペースアプリは...

  1. /dev/v4l-subdevXからカメラを設定します。
  2. /dev/videoXから画像データを取得します。
  3. /dev/rveノードにフィードします。

Rockchip Video EngineにはSADエンジン(Sum of Absolute Differences)が含まれています。これはRockchip SoC自体で動作するハードウェアアクセラレータブロックです。

SADは、ステレオビジョンを実行する際の中心的な要素です。グレースケール画像は行列として表すことができ、各要素は0から255までの数値です。2つの2x2ピクセルの画像があるとしましょう。SADを計算できます。

Image 1  Image 2  Absolute differences
[10  20] [10  20] [0  0]
[30  40] [30  40] [0  0]

SAD = 0 + 0 + 0 + 0 = 0

2つの画像は同じであると言えます。

これらの小さな画像を比較する代わりに、2つの大きな画像を用意し、それらをパッチと呼ばれる小さな画像の束に分割し、これをすべての場所で行います。

[画像: With apple] [画像: Without apple]

パッチごとの正規化SAD(0 = 同一)。

これで、画像のパッチがどれだけ似ているかを判断するアルゴリズムが得られました。この情報を使えば、この画像のこの部分が異なることを確かに言うことができます。

SADベースのステレオブロックマッチングは同じ原理を使用しますが、水平シフト後にパッチの垂直列を比較します。2つの画像は、ベースラインと呼ばれる距離で水平に分離された2つの別々のカメラから来ています。一方の画像を固定し、もう一方をシフトさせ、一致するブロックを見つけようとします。ブロックが一致した場合、それは深度値となります。非常に早いシフトで一致した場合、それは遠い値であり、遅いシフトは近い画像です。

[画像: Two stereo cameras]

[画像: Stereo images: Middlebury Cones.]

ステレオ画像: Middlebury Cones。

遠くにある画像ほど一致を得るために必要なシフトが少なく、一致が得られたら、必要なシフトが深度となります!ボックスはパッチサイズを示しており、緑色のボックスはSADマッチを示しています。これは、上記のGIFで3つの異なる深度で示されています。

今後の展望

これらのデバイスをいくつか販売し、フィードバックを得たいと考えています。

このデバイスに興味がある方は、こちらからメール通知にサインアップしてください。もし20件以上のサインアップがあれば、修正済みのボードをさらに10枚注文し、販売用にリストします。これは事前注文ではなく、プロジェクトを真剣にサポートする意思のある方のみサインアップしてください :)

十分な関心があれば、プロジェクトの次の段階は、ソフトウェアのクリーンアップ、画像最適化、SLAMとYOLOの実装です。

お読みいただきありがとうございます!


著者

[画像: Ryan Walker]

Ryan Walker

オープンソースの素材で、オープンソースのものを構築しています。