ゼロからのセンサ入門 ~カメラ/デプスカメラ~

大阪大学 中島優作


← シリーズ一覧に戻る

カメラの用途

  • 物体検出と位置推定
  • 環境認識・マッピング
  • 品質検査・外観検査
  • 人物・顔認識
  • 動作解析・トラッキング
  • 自動運転・ナビゲーション

物体検出と位置推定

  • 2Dカメラ:物体の識別・分類
  • デプスカメラ:3D位置情報の取得
  • ステレオカメラ:視差による距離計測
  • RGB-Dカメラ:色情報+深度情報
  • 用途:ピック&プレース、検査作業

カメラの使い方(Webカメラ)

  • 最も一般的なカメラインターフェース
  • USBで接続、プラグ&プレイ対応
  • UVC(USB Video Class)規格
  • ROSでの豊富なサポート
  • 開発・テスト用途に最適

UVCとは

  • USB Video Class の略
  • USBカメラの標準規格
  • ドライバ不要で動作
  • Linux標準サポート
  • 多くのWebカメラが対応
  • 解像度・フレームレート調整可能

ROSで使えるパッケージ

以下をネットなどでよく見ますが、libuvc-cameraがおススメです

libuvc-camera(オススメ)

  • 開発継続中
  • nodeletも使えるのでマルチスレッドにデータを受け取れる
  • ROS1/ROS2両方対応
  • カメラパラメータ調整機能
  • 高いパフォーマンス

usb-cam

  • 開発修了
  • 古いROSディストリビューションで使用
  • シンプルな実装
  • メンテナンス停止

uvc-camera

  • 現状サポート無し
  • 過去のプロジェクトで使用
  • 新規開発には非推奨

デプスカメラの使い方(RealSense)

  • Intel製の高性能深度カメラ
  • RGB + Depth情報を同時取得
  • ロボットビジョンの定番
  • Python・C++両方対応
  • ROS統合パッケージ有り

PyRealSense

  • Pythonでの直接制御
  • シンプルなAPI
  • プロトタイピングに最適
  • リアルタイム処理
  • カメラ設定の詳細制御

RealSense ROS

  • ROSノードとしてカメラ制御
  • 標準的なROSメッセージ形式
  • 他のROSノードとの連携
  • Launch ファイルで簡単起動
  • RVizでのリアルタイム可視化

カメラの内部パラメータ調整

  • カメラキャリブレーション
  • 焦点距離・主点の補正
  • レンズ歪み補正
  • チェッカーボードパターン使用
  • OpenCVキャリブレーション機能
  • ROSでは camera_calibration パッケージ

カメラの外部パラメータ調整

  • カメラとロボット間の位置関係
  • 座標系変換パラメータ
  • Hand-Eye Calibration
  • Eye-to-Hand / Eye-in-Hand
  • TFによる座標系管理

Hand-Eye Calibration

  • ロボットハンドとカメラの位置関係決定
  • 複数ポーズでの測定
  • AX=XB問題の解法
  • MoveItでのキャリブレーション
  • easy_handeye パッケージ利用

画像処理

  • OpenCVをよく使います
  • フィルタリング・エッジ検出
  • 物体検出・特徴抽出
  • 機械学習による分類
  • cv_bridge でROSメッセージ変換
  • image_transport で効率的な画像転送

ポイントクラウド

  • 3次元点群データ
  • デプスカメラ・LiDARから生成
  • さすがに処理が重たいので、リアルタイムな処理は基本はC++で扱います
  • フィルタリング・セグメンテーション
  • 物体認識・マッピング

PCL(Point Cloud Library)

  • ROSの発展と共に開発されてきたのがPCL(PointCloudLibrary)です
  • C++用です
  • 豊富なアルゴリズム
  • ROS標準のpoint_cloud2メッセージ対応
  • リアルタイム処理に最適

Open3D for Python

  • 可視化くらいならpythonでもok
  • Open3Dというライブラリで扱えます
  • プロトタイピング・可視化に便利
  • Jupyter Notebookでの解析
  • 機械学習との連携

まとめ

  • 用途に応じたカメラ選択
  • ROSパッケージの適切な利用
  • キャリブレーションの重要性
  • 処理性能とプログラミング言語の選択
  • 豊富なツール・ライブラリの活用

← シリーズ一覧に戻る