PiLiDAR - Raspberry Pi LiDARスキャナー
(github.com/PiLiDAR)- PiLiDARは、Raspberry Pi 4、LDRobot LiDAR、Raspberry Pi HQ Camera、ステッピングモーターを組み合わせて、DIY 360° 3Dパノラマスキャナーを作る進行中のプロジェクト
- 中核機能は、LD06・LD19・STL27L向けのカスタムシリアルドライバー、6K 360°球面パノラマ生成、2D平面を角度とオフセットで組み立てる3Dシーン生成で構成
- パノラマは魚眼写真をHuginでステッチし、EXIFベースの露出維持と色ゲインの反復最適化でホワイトバランスを合わせ、3Dシーンはパノラマからvertex colorをサンプリング
- 結果はOpen3Dで可視化し、PCD・PLY・e57にエクスポートでき、複数シーンの位置合わせにはglobal registrationとICP微調整、サーフェス生成にはPoisson Surface Meshingを使用
- 部品コストは電源を除いて2025年4月時点で約200〜280ドルで、Poisson Surface MeshingはPi4では非常に遅いためPCでの実行を推奨
PiLiDARが作るもの
- PiLiDARは、Raspberry Piベースで360° 3Dパノラマスキャナーを自作するプロジェクトで、現在は作業中の状態とされている
- 構成は大きく3つの部分に分かれる
- LiDAR: LDRobot LD06、LD19、STL27L向けカスタムシリアルドライバー
- Panorama: 6K 360°球面マップ生成
- 3D Scene: 2D平面を角度とオフセットに応じて組み立て、3Dシーンを構成
LiDAR処理機能
- LiDARドライバーはCRCパケット整合性チェックを含む
- Raspberry PiのハードウェアPWMはrpi_hardware_pwmを使用し、曲線フィッティングで補正する
- 2Dライブ可視化とエクスポートをサポート
- エクスポート形式はnumpyまたはCSV
パノラマと3Dシーン生成
- 6K 360°球面パノラマは、魚眼写真をHugin Panorama photo stitcherでステッチして作成
- カメラ露出は自動撮影画像のEXIFデータを読み取って一定に保つ
- ホワイトバランスは色ゲインを反復最適化して一定に合わせる
- 3Dシーンは角度とオフセットを基準に2D平面を組み立てて構成する
- パノラマからvertex colorをサンプリングする
- Open3D可視化とPCD、PLY、e57エクスポートをサポート
- 複数シーンの位置合わせにはglobal registrationとICP微調整を使用
- Poisson Surface MeshingはPi4では非常に遅いためPCでの実行を推奨
予備結果とスキャン時間
- 予備結果は単一スキャン基準で、registrationと後処理をしていない状態
- 屋外スキャンはcolormapped intensity、屋内スキャンはvertex colorの例として提供される
- スキャン時間の例は次のとおり
- 初期化: 12秒
- 写真4枚撮影: 17秒
- 0.167° × 0.18°スキャン: 1分24秒
- ステッチと整理: 37秒
ハードウェア構成とコスト
- LiDARは3種類のうち1つを使用
- LDRobot LD06: 80ドル
- LDRobot LD19: 70ドル
- LDRobot STL27L: 160ドル
- カメラとレンズはRaspberry Pi HQ CameraとArduCam M12 Lensの組み合わせで60ドルとされる
- Raspberry Pi 4は50ドル、NEMA17 42-23ステッパーとA4988ドライバーは10ドルとされる
- 電源は2つの方式がある
- v1: 18650バッテリー2本とstep-down converter
- v2: 10,000mAh USBモバイルバッテリーとstep-up converter
- 総コストは電源を除いて2025年4月時点で約200〜280ドル
- 購入リンクは例示にすぎず、必ずしも推奨購入先ではない
モーター、ギアボックス、3Dプリント
- 駆動部はA4988バイポーラステッパードライバーとNEMA17 42×42×23バイポーラステッパーを使用
- ステッパーは17HE08-1004Sで、トルクは17 Ncmとされる
- 3Dプリント部品は別のPiLiDAR-Hardware Repoにハウジングと追加部品ファイルがある
- レンズアダプターとギアボックスは外部モデルを使用
LiDAR仕様とシリアルプロトコル
- LD06仕様
- サンプリング周波数: 4500Hz
- baudrate: 230400
- スキャン周波数: 5〜13Hz
- 距離: 2cm〜12m
- 周囲光: 30kLux
- STL27L仕様
- サンプリング周波数: 21600Hz
- baudrate: 921600
- LD06パケットは合計48バイト、big endian構造
- 開始文字: 1バイト、固定値
0x54 - データ長: 1バイト、現在は測定点12個で固定
- 速度: 2バイト、毎秒角度
- 開始角度と終了角度: それぞれ2バイト、単位は0.01度
- データ: 36バイト、12個のデータポイント × 3バイト
- 各データポイントは距離2バイトとluminance 1バイトで構成
- タイムスタンプ: 2バイト、ms単位で30000に達すると再び0から数える
- CRC check: 1バイト
- 開始文字: 1バイト、固定値
- 各データポイントの角度は、開始角度と終了角度を線形補間して計算する
Raspberry Pi接続と設定
- LD06またはSTL27Lの接続はUART Tx、PWM、GND、VCC 5Vで構成
- Raspberry Pi GPIO接続は次を使用
- LD06 UART0 Rx: GP15
- LD06 PWM0: GP18
- Power Button: GP03
- Scan Button: GP17
- A4988 direction: GP26
- A4988 step: GP19
- A4988 microstepping mode: GP5, GP6, GP13
- 電源ボタンはPin 3にハードワイヤリングし、
gpio-shutdownを有効にする - GY-521 MPU 6060加速度計は、GPIO3が電源ボタンに使われるため、i2c-GPIOでカスタムI2Cピンを割り当てる
- SDA: GPIO22
- SCL: GPIO27
- スキャンボタンはGPIO interruptスクリプトをsystemdサービスとして登録し、自動起動する
- UART権限は一時的に
/dev/ttyS0へ権限を与えるか、新しい方法としてudevルールを使いdialoutグループとMODE="0660"を設定する
ソフトウェアとリモート作業
- Raspberry PiハードウェアPWMは
pwm-2chanオーバーレイを有効にし、RPi Hardware PWM libraryをインストールして使用 - パノラマステッチにはHuginとenblendプラグインをインストールする
- USBポート電源制御にはuhubctl CLIツールを使用
- Jupyterはリモートネットワーク接続のため
--ipと--no-browserオプションで実行する - リモートOpen3D可視化はOpen3D Web Visualizerの代わりにPlotlyの利用がよいとされる
- Plotlyはクライアント側レンダリングに見える
- Open3D Web Visualizerはホスト側でレンダリングし、JPGシーケンスをストリーミングするため、PiのCPUとWi‑Fiに負荷をかけるとされる
スキャンデータ保存とトラブルシューティング
- スキャンをUSBストレージへダンプするため、usb_dumpをクローンしてインストールする手順が含まれる
- 設定ファイルは
/home/pi/PiLiDAR/scansをソースディレクトリに指定する - トラブルシューティング項目には次が含まれる
- Windows向けCP210x Universal Windows Driver
- Raspberry Pi OS Bookwormでsysfs GPIOインターフェース削除により発生する
RPi.GPIO RuntimeError: Failed to add edge detection - 代替としてrpi-lgpioを使用
- Raspberry PiでVS Codeの性能が悪い場合はハードウェアアクセラレーションを無効化
- Raspberry Pi arm64ではpye57 wheelがないため、
libxerces-c-devをインストールしてビルド - SSHでWi‑Fi設定を追加する
wpa_supplicant.conf手順
参考実装と着想
- LD06関連の着想はLIDAR_LD06_python_loderとLidar_LD06_for_Arduinoから得ている
- 360カメラのステッチはShaunPriceのStereoPi対応forkとBrianBockの360-cameraスクリプトを参考にしている
- 他のPython LiDAR実装としてpyLIDARに言及
- ICP関連実装としてDoppler-ICP、KISS-ICP、Lidar-Visualizerを参考項目として挙げている
4件のコメント
Hacker Newsのコメント
本当にすばらしい。ハードウェア製品なら、部品表(BOM)を作るときにリンクと概算費用も一緒に書いておくことをおすすめする。
価格は変わるだろうが、おおよその費用レンジがあれば、HNのような場所で見た人が自分で試すかどうかを判断するうえで大きな助けになる。重要なのは正確な数字ではなく、だいたいの規模感。
すでに調べた内容は書き留めておくとよい。他人のためでなくても、将来の自分に役立つ。名前が紛らわしい部品も多いので、リンクがあれば同じ物かどうか確認しやすくなるし、プロジェクト中はすでに部品を買っているのだから、リンクと価格は手元にあり、追加の手間はほとんどかからない。
数日、あるいは数週間も経てば誰も覚えていないので、文書化すべきだ。10秒書き留めておけば、あとで30分かけて探し直すのを避けられる。エンジニアとして始めたころに学んだ最大の教訓の一つがこれで、頭の中で「時間の節約にならない」とささやく愚かな部分と戦わなければならない。コードの文書化も同じ。[0]
ざっと15分ほど探した値は以下の通りで、正確ではないかもしれない。LidarはLD06 $80 https://www.aliexpress.us/item/3256803352905216.html、LD19 $70 https://amazon.com/DTOF-D300-Distance-Obstacle-Education/dp/… $160 https://www.dfrobot.com/product-2726.html のいずれか、カメラとレンズ $60 https://amazon.com/Arducam-Raspberry-Camera-Distortion-Compatible/dp/… Pi 4 $50、NEMA17 42-23ステッパー $10 https://www.amazon.com/SIMAX3D-Nema17-Stepper-Motor/dp/B0CQLFNSMJ
電源とバックコンバータを除いても、$200〜$280程度になる。
[0] 初めてコードを書いたときは、自分と神だけが何が起きているかを知っていたが、時が経った今では神だけが知っている。
部品表の価格に、仕入れ元と配送件数によっては2倍や3倍を掛ける必要があるかもしれない。
子どもや大人に電子工学を紹介するための安くて良い教材にアクセスできていた状態から、米国の競争力向上といった名目で税金がかかって失われていくのは本当に憂うつだ。完全なオウンゴールだ。
辞書を見ても、「何かの量を減らす」に近い意味は見当たらない。[0]
Wikipediaも語源を詳しく扱っていない。[1]
[0] https://www.merriam-webster.com/dictionary/buck
[1] https://en.wikipedia.org/wiki/Buck_converter
なら自分でやればいい。
家族がいて時間があまりにも足りない立場からすると、プロジェクトを完成させるだけでも手いっぱいで、文書化まではほとんどできない可能性が高い。後でまたやらなければならないなら、そもそもやらないかもしれない。誰もが母親の地下室に住んで、余った時間を満喫しているわけではない。
実際のスキャナーはこちらにある:[1]
最大距離12mで、このあたりから高くなり始めるようだ。光源、フィルター、センサーのすべてをもっと良くする必要がある。
たいていの小型ロボットには十分だし、自動運転車の補助センサーのように、車両周辺の子どもや犬を安定して検知する用途にもよいかもしれない。だが、上部に取り付ける長距離LIDARは依然として難しい。
[1] https://www.ldrobot.com/
最初の推測としては、この距離からレーザー安全性が能動的な制御プロセスになるからではないかと思う。レーザースキャナーのミラーは、人間の網膜に有害なエネルギーが蓄積しないよう常に動いていなければならないので、ミラーの速度と位置を継続的に監視し、遅くなりすぎたらレーザーを切る安全上必須の制御システムが必要になる。自分はどれくらい間違っているだろうか?
「古き良き時代」のほうがよかったことも多いが、才能ある個人がこうした技術を自分で作れる時代に生きているというのは本当に驚きだ。
少し関連して、300mmほどの距離で約10ミクロンの精度で距離を安価に測定する方法を探している。何かアイデアはある?
my mechanics が数日前に交換動画を上げていたけれど、既存の装置は5ミクロン精度だった
価格はよく分からない
良いキャリパー1組でもできそう。精度要件によっては同じアプローチを使えるかもしれない。測定セルの上を滑る静電容量セルの格子を置き、マイクロコントローラが移動しながら値を読み取り、最終結果に Atan2() を使う方式。このうちメーター部分だけを指して DRO(Digital ReadOut)と呼ぶ
予算の制約がないなら、完成済みのクローズドループステージソリューションもある:
https://www.pi-usa.us/en/
https://xeryon.com
幸運を祈る。価格表の衝撃には備えておいたほうがいい
あなたにとって「安い」がどの程度かも重要
こういう方向を自動化することを考えている:
https://youtu.be/hnHjrz_inQU?si=dNzXVBVFsr7e8m_6
既製のレーザーとカメラセンサーも、DIYでいじればかなり予想外の精度を出せる
Sketchfabの例が素晴らしい。SFシミュレーションのように3D空間内を歩き回れる
ただ、マウス操作はかなり分かりにくい。「つかむ」アイコンが出るのに実際にはつかんでいる感じがなく、移動方向が逆なので完全に不自然に感じる
eBayやGoodwillのロボット掃除機からこういう部品を取り外せるかもしれない
本当にすごい。プロジェクトをざっと見ただけなので、すでに含まれているかもしれないが、精度データがあるのか気になる
例えば10mの距離での精度、このLIDARがその距離で動作しないなら、もっと短い距離でも知りたい
FAROスキャナーには慣れているが、別方式のメカニズムを使っていて、建築物の測定には十分な精度がある
スキャナー市場にもいくつもの分野があることが分かっていて、その中には精度を必要とする人たちと、ゲームのようなメディア向けコンテンツを作る人たちがいる。このプロジェクトは本当に信じがたいほどだ
最近、屋内の部屋や空間をスキャンするために写真測量を少し触っている。今のところMetashapeが一番合っているようだが、精度はまだいまいちで、撮影手法も改善中
主な目標は、実在する建物の内部を保存と分析のためのデジタルモデルに変換すること。LIDARも少し検討したが、難しすぎて高すぎるとして脇に置いていた。でもこのプロジェクトはその前提を揺さぶるように見える
後処理ソフトウェアがどんなものなのか気になる。点群を取得して、DSLR写真のような他のデータと統合し、テクスチャリングできるだろうか?
2枚目の画像[1]を見ると、吊り下げランプに遮られて壁の一部がスキャンされておらず、おそらくLIDARはソファの上も見えていないようだ。物体や角の裏側を見るために、2つ以上の点群を結合できるだろうか? ソフトウェアは共通する壁や点を基準に、同じ実在の部屋だと自動で位置合わせできるのか、それとも手作業でかなり調整が必要なのか? LIDARにも coded target や ARTag[0] に相当するものはあるのだろうか? 複数の部屋へ拡張できるのだろうか?
よくできた写真測量と比べて検討する価値があるのか、それとも手間が増えるだけなのか気になる
何が分かっていないのかも分かっていないレベルの質問で申し訳ない
0: https://en.wikipedia.org/wiki/ARTag
1: https://github.com/PiLiDAR/PiLiDAR/raw/main/images/interior....
この素晴らしい取り組みを共有してくれてありがとう。PiLiDARを大規模な屋外データセットに適用したときのスケーラビリティと性能が気になる
SemanticKITTIやnuScenesのようなデータセットでベンチマークしているなら、実行時間、メモリ使用量、論文で使った屋内シーンを超えてどれくらいうまく汎化するのかを教えてほしい
そういうデータセットはたいていRGBAカメラで作られ、点群は後から後処理段階で生成される
つまり処理モデルではなく、実際の深度データを得るためのハードウェアハックだ。望むものは何でもアップロードできる
数週間前に探していたのがまさにこれだった。だいたい似たものをプロトタイピングしようとして部品をAmazonのカートに数週間入れっぱなしにしていたが、実際のLIDARスキャナーの選択に確信が持てなかった
Easter休暇から戻ったら、これを出発点として見てみるつもり
懐中電灯コミュニティって何ですか?
https://www.reddit.com/r/flashlight/
日本で言えば、ディシインサイドの懐中電灯マイナーギャラリーのようなReddit内の小規模コミュニティです
ありがとうございます