Raspberry Piで広角カメラを使ってみたので、使い方をまとめました。
また、広角カメラで撮影した画像は歪んでいるので、ROSを使って補正(キャリブレーション)し、補正した画像を配信する方法も説明します。
デバイス、環境
- Raspberry Pi4 Model B
- Ubuntu Server 18.04
- ROS melodic
- RPi Camera (G), Fisheye Lens (広角カメラ)
- Desktop PC
- Ubuntu 16.04
- ROS Kinetic
Desktop PCは、後述しますが補正のために使用しました。カメラを使用するだけであればRaspiだけでよいです。
カメラ詳細
今回使用したカメラはwaveshare
というメーカーの広角カメラ「RPi Camera (G), Fisheye Lens」です。
スイッチサイエンスで購入可能です。
マニュアル
ユーザマニュアルは、メーカーページからダウンロードできます。
スペック
- 静止画像の解像度: 2592 x 1944
- 最大フレームレート: 30 fps
- 対角画角: 160°
- 水平画角: 120°
通常のカメラの画角は62.2×48.8
なので、倍以上の画角があります。
使い方
使い方はとても簡単で、通常のRaspi専用カメラと同じです。
フラットケーブルで接続した後、raspistill
コマンドやraspivid
で画像、動画の撮影が可能です。
ROSでカメラ画像を取得、表示する
uvc_camera
でカメラ画像を取得し、image_view
で表示します。自分の環境ではimage_view
をDesktop PC側で実行しました。
Raspi側のlaunchファイル
<launch>
<node name="uvc_camera" pkg="uvc_camera" type="uvc_camera_node">
<param name="width" type="int" value="2592"/>
<param name="height" type="int" value="1944"/>
</node>
</launch>
Desktop側のlaunchファイル
<launch>
<node name="image_view" pkg="image_view" type="image_view" output="screen">
<remap from="image" to="image_raw"/>
</node>
</launch>
結果
画像が上下反転していますが、カメラを上下逆さに取り付けたからです。上下正しく設置すれば、画像は逆さになりません。
周辺部に行くほど、画像が歪んでいるのがわかると思います。この歪みをこれから補正します。
ROSでキャリブレーションする
上の画像のように広角カメラの画像は歪んでいます。そこでキャリブレーションを行い、歪み補正をします。
歪み補正は「ROS講座66 カメラのキャリブレーションを行う」を参考にして行いました。
キャリブレーションはけっこう重く計算に時間がかかるため、スペックがより高いDesktop側で行いました。
インストール
キャリブレーションで使用するROSパッケージをインストールします
$ sudo apt-get install -y ros-kinetic-camera-calibration
$ sudo apt-get install -y ros-kinetic-image-proc
チェッカーボードの印刷
キャリブレーションに使用するチェッカーボードを準備します。
ROS wikiからチェッカーボードの画像をダウンロードし、印刷します。自分はA3に印刷しました。これを板か何かに貼り付けます。
また、キャリブレーションの際、チェッカーボードの四角の数と大きさが必要になります。四角の数は、上記の画像であれば 8x6 です。四角の大きさはA3に印刷した場合、0.03mでした。
キャリブレーション
キャリブレーションを実施します。
Raspi側はカメラ画像を表示した時と同じ方法でuvc_camera
を立ち上げます。
Desktop PC側はcamera_calibration
を立ち上げます。起動時、四角の数、大きさを指定します。
- 1つ目のターミナル
$ roscore
- 2つ目のターミナル
$ rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.03 image:=/image_raw
実行すると以下のような画面が表示されます。そうしたらチェッカーボードを画像内に収めながら、色々な距離や角度、位置で撮影します。
「CALIBRATE」ボタンが押せるようになったら、このボタンをクリックします。すると、歪み補正用のパラメータの計算が始まります。
計算には数10分ほどかかります。自分の環境ではだいたい15分位かかりました。
結果の保存
/tmp/calibrationdata.tar.gz
に結果が出力されているので、任意のディレクトリに移動して解凍します。
大量のファイルが出力されますが、ost.yaml
というのが歪み補正用のパラメータファイルです。
$ tar -xvzf /tmp/calibrationdata.tar.gz
image_width: 2592
image_height: 1944
camera_name: narrow_stereo
camera_matrix:
rows: 3
cols: 3
data: [1374.805968, 0.000000, 1251.269799, 0.000000, 1385.361132, 912.160642, 0.000000, 0.000000, 1.000000]
distortion_model: plumb_bob
distortion_coefficients:
rows: 1
cols: 5
data: [-0.292026, 0.057026, 0.000142, 0.002053, 0.000000]
rectification_matrix:
rows: 3
cols: 3
data: [1.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 1.000000]
projection_matrix:
rows: 3
cols: 4
data: [928.518127, 0.000000, 1277.457798, 0.000000, 0.000000, 1123.514282, 877.728323, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000]
カメラ画像の補正
キャリブレーションで求めた歪み補正用のパラメータを使って、画像の歪みを補正します。
Raspberry Pi側で歪み補正を行い、Desktop側で補正した画像を表示する構成にしました。
パラメータファイルをコピー
まず、キャリブレーションで出力されたost.yaml
をRaspberry Piにコピーします。
インストール
歪み補正で使用するROSパッケージをインストールします
$ sudo apt-get install -y ros-kinetic-image-proc
実行
launchファイルを実行します。
- Raspberry Pi側
camera_info_url
のvalueには、ost.yaml
ファイルのパスを記述します。
<launch>
<node name="uvc_camera" pkg="uvc_camera" type="uvc_camera_node">
<param name="width" type="int" value="2592"/>
<param name="height" type="int" value="1944"/>
<param name="camera_info_url" value="file:///home/ubuntu/ros/catkin_ws/file/ost.yaml"/>
</node>
<node name="image_proc" pkg="image_proc" type="image_proc" output="screen"/>
</launch>
- Desktop PC側
補正前の画像と補正後の画像の両方を表示します。
<launch>
<node name="image_view" pkg="image_view" type="image_view" output="screen">
<remap from="image" to="image_raw"/>
</node>
<node name="image_rect_view" pkg="image_view" type="image_view" output="screen">
<remap from="image" to="image_rect_color"/>
</node>
</launch>
結果
若干まだ歪んでいますが、先程は歪んでいた画像がかなり補正されています。