camera_calibrationを使用して魚眼カメラを較正する
ここでは、ros.orgポータルの公式マニュアルに基づいたキャリブレーション手順について説明します。
キャリブレーションを実行するには、カメラキャリブレーションパッケージが必要です。 aptでインストールできます:
sudo apt-get install ros-kinetic-camera-calibration
チェッカーボードテンプレートが必要になります。 ros.orgの公式マニュアルからテンプレートをダウンロードして印刷します。 便宜上、合板に貼り付けました。

キャリブレーションプログラムを実行しましょう。
rosrun camera_calibration cameracalibrator.py --size 8x6 --square 0.108 image:=/usb_cam/image_raw camera:=/usb_cam
写真を取得します。

テンプレートを少し動かして、フレーム内でテンプレートが選択されるまで待ちます(ドットの付いた色付きの線はテンプレートに表示されません)。


テンプレートをもう少し横に動かします。 キャリブレーションを正常に実行するには、カメラの視野内のすべての角度位置(左、右、上、下)にテンプレートが収まるように、カメラの前でテンプレートの一連の動きを左右に実行する必要があります。 プログラムウィンドウのカメラ画像ウィンドウの右側には、3つの進行状況バーのある登録パネルがあります。
- Xは、カメラの視野内で左/右方向(水平)のパターンの動きをキャプチャします。
- Yは、カメラの視野内の上下方向(水平)のパターンの動きをキャプチャします
- サイズは、カメラからのテンプレートのアプローチ/削除およびカメラに対する傾きをキャプチャします。
- スキューは、テンプレートの傾きを左右、上下に調整します(ベベル)。
したがって、キャリブレーションを成功させるには、テンプレートがフレームのさまざまなコーナーに表示され、フレーム全体を占有し、左、右、上下に傾斜していることが重要です。
Raspberry Piでの魚眼カメラのキャリブレーションにはかなり時間がかかることがありますので、しばらくお待ちください。 私の校正手順には20分かかりました。
調整が完了したら、[調整]ボタンをアクティブにする必要があります(色で強調表示されます)。

また、ターミナルでキャリブレーション結果を確認できます。

結果に満足したら、COMMITボタンを押します。 プログラムウィンドウが閉じ、ターミナルに「校正データを書き込み中...」というメッセージが表示されます。
指定されたファイルが作成されたことを確認します。
ll ~/.ros/camera_info/head_camera.yaml -rw-rw-r-- 1 vladimir vladimir 592 Apr 14 14:02 /home/vladimir/.ros/camera_info/head_camera.yaml
キャリブレーションが完了しました。 これで、取得したキャリブレーションデータを、ROSの視覚的ローカリゼーションおよびSLAMアルゴリズムで使用できます。
find_object_2dを使用したオブジェクトの検出
パッケージのインストールは非常に簡単です。 ROS KineticのUbuntu 16.04のaptリポジトリからインストールします。
sudo apt-get install ros-kinetic-find-object-2d source /opt/ros/kinetic/setup.bash
ROSマスターとrqt_image_viewを実行します。
roscore roslaunch usb_cam usb_cam-test.launch
次のコマンドを使用して、検出ノードを起動します。
rosrun find_object_2d find_object_2d image:=/usb_cam/image_raw
検出プログラムウィンドウが開きます。

ここでは、カメラからのストリームと、オブジェクトの特徴的な特徴の検出結果が表示されます。
まず、施設で検出器トレーニングを実施します。 カメラの前に最初のオブジェクトを配置します。

ウィンドウ内のオブジェクトの左パネルを右クリックすると、シーンからオブジェクトを追加オプションが開きます。 このオプションを選択すると、オブジェクトを追加するためのウィンドウが開きます。

オブジェクトに最適な位置を選択したら、[写真を撮る]ボタンをクリックしてオブジェクトの写真を撮影します。

画像内のオブジェクトを選択する必要があります。 マウスカーソルを使用してオブジェクトを選択します。

[次へ]ボタンをクリックして、画像内のオブジェクトを切り取り、次のステップに進みます。 画像をトリミングした後、オブジェクトで検出された特徴的な特徴の総数を取得します。 終了ボタンを押して、トレーニング済みの検出器オブジェクトのデータベースにオブジェクトを追加するだけです。 オブジェクトを追加する手順の最後のステップを次に示します。

その結果、1つのオブジェクトで検出器をトレーニングしました。 これで、シーン内のオブジェクトの検出を試すことができます。

検出されたオブジェクトの位置を端末に描画しましょう:
rosrun find_object_2d print_objects_detected
出力は次のようになります。
Object 1 detected, Qt corners at (259.387238,103.530960) (448.684052,79.495495) (282.419050,240.049667) (458.438938,199.656717) --- Object 1 detected, Qt corners at (255.340408,104.615120) (451.348079,75.302353) (284.672425,230.382223) (452.696585,197.625600) --- Object 1 detected, Qt corners at (253.440521,102.973320) (447.226440,76.793541) (278.530854,238.918013) (454.377219,197.526599) ---
トピックをリストしましょう:
rostopic list
2つの新しいトピックがリストに表示されました:/ objectsおよび/ objectsStamped。
検出されたオブジェクトに関する情報を表示します。
rostopic echo /objects
layout: dim: [] data_offset: 0 data: [1.0, 266.0, 177.0, 0.7527905702590942, 0.060980819165706635, 0.00022385441116057336, 0.3012462854385376, 0.8929792046546936, 0.0008534671505913138, 334.9065856933594, 182.55294799804688, 1.0] ---
ここで、2番目と3番目の値(266.0、177.0)は、オブジェクトの幅と高さを表します。 データフィールドの他のすべての値は、3x3ホモグラフィマトリックスを表します(オブジェクトの位置と方向、およびスケールとシフトの値を計算するために使用されます)。
観察結果が示すように、find_object_2dは、テクスチャが弱い、またはテクスチャがない(テクスチャのない)オブジェクトを検出するのに不十分です。 さらに、検出器は、オブジェクトに対して大きな角度でオブジェクトを検出する場合(側面からオブジェクトを観察する場合)、またはオブジェクトから大きな距離でオブジェクトを検出する場合は無効です。

検出器での作業が完了すると、find_object_2dは追加されたオブジェクトをディスクに保存するよう提案します。
今のところすべてです。 皆さん、幸運を祈ります!