こんにちはshotaです。このシリーズではRaspberry Pi Mouse(ラズパイマウス)でROS 2を動かしていきます。
今回はラズパイマウスのROS 2サンプル集にある、カメラを用いた物体追跡サンプルを実行します。
前回のおさらい
前回はラズパイマウスROS 2サンプル集をインストールしました。
今回も使用するので必ずインストールしてください。
また、ROS 2サンプル集ではブザーを鳴らしたりモータを回したりします。
デバイスドライバも忘れずにインストールしてください。
作業に必要なもの
- Raspberry Pi Mouse V3
- 商品ページはこちら
- これまでの記事で、ROS 2 DashingをインストールしたUbuntu 18.04、をインストールしたRaspberry Pi Model 4 B、を搭載したラズパイマウスをセットアップしています
- Raspberry Pi Mouse オプションキット No.4 [Webカメラマウント]
- USBカメラ
- Logicool HD WEBCAM C310N
- 別のUSBカメラを使用しても大丈夫です
- ソフトボール(オレンジ)
- 商品ページはこちら
- 必須ではないですが、あると便利です
- 作業用PC
- Ubuntu 18.04のPCを用意しました。ROS 2 Dashingインストール済みです。
オプションキットの組み付け
それではオプションキットをラズパイマウスに組み付けましょう。
カメラマウントを固定する
まずはラズパイマウスにカメラマウントを固定します。
ネジで締めるだけなので簡単な作業です。
カメラを取り付ける
カメラマウントにはカメラ固定用のネジ穴が設けられています。
しかし、今回使用するUSBカメラにはネジが付いていないので、両面テープで固定します。
カメラのケーブルを束ねて、ラズパイに接続したら作業完了です。
カメラサンプルを実行する
それではカメラサンプルを実行しましょう。
実行手順はパッケージのREADMEにも書かれています。
カメラ調整用のスクリプトを実行
USBカメラにはオートフォーカスや、オートホワイトバランス等の自動調節機能が搭載されていることがあります。
これらの機能は画像処理に不要な場合があるため、手動調節に切り替えます。
次のコマンドを実行します。
$ cd ~/ros2_ws/src/raspimouse_ros2_examples/config $ ./configure_camera.bash
使用するUSBカメラや環境に合わせて、configure_camera.bashを編集し、手動調節のパラメータを変更してください。
カメラ画像を表示する
次に物体追跡サンプルのノードを起動します。
まずはカメラ画像が撮影できているのかを確認するので、モータ電源スイッチをオフします。
念の為、車輪も浮かします。
次のコマンドを実行して、launchファイルobject_tracking.launch.pyを起動します。
$ ros2 launch raspimouse_ros2_examples object_tracking.launch.py
起動してエラーが出なければ、カメラを認識できています。
しかし、このままだとカメラ画像が見えないので、作業用PCで画像を表示してみましょう。
ラズパイマウスと作業PCで通信する方法は、前回の記事を参照してください。
環境変数ROS_DOMAIN_IDを設定しています。
さて、作業PCで次のコマンドを実行し、rqtを起動しましょう。
$ rqt
コマンドを実行すると、次のようなGUIアプリケーションが起動します。
rqtの画面上部にあるPluginsからVisualizationにあるImage Viewを選択します。
このrqt_image_viewプラグインでカメラ画像を表示できます。
先程起動したノードからはカメラ画像のraw_imageトピックと、物体検出画像のresult_imageトピックがパブリッシュされています。
それぞれを表示してみましょう。
raw_imageにカメラ画像が表示されたらOKです。result_imageは真っ黒でもOKです。
この例では次のように、ラズパイマウスの前にオレンジ色のボールを置きました。
rqtの画面より、ボールが撮影されていることが分かります。
オレンジ色の物体を追跡する
サンプルはデフォルトでオレンジ色の物体を追跡するように設計されています。
それでは、モータの電源をONし、物体を追跡してみましょう。
次の動画のようにラズパイマウスが物体を追跡します。
緑色、青色の物体を追跡する
オレンジ色以外の物体を追跡したい場合は、ソースコードの変更が必要です。
この記事では、画像処理の仕組みや、物体追跡の仕組みについて説明を省略します。
ソースコードを読み解いて書き換えてください。
・・・
と本来なら終わるところですが、このサンプルコードには緑色、青色の物体を検出する関数が用意されています。
これを使ってみましょう。
次のようにソースコードを編集します。
$ cd ~/ros2_ws/src/raspimouse_ros2_examples/src $ vim object_tracking_component.cpp
void Tracker::tracking(const cv::Mat & input_frame, cv::Mat & result_frame) { // Specific colors are extracted from the input image and converted to binary values. cv::Mat hsv; cv::cvtColor(input_frame, hsv, cv::COLOR_BGR2HSV); cv::Mat extracted_bin; // cv::inRange(hsv, cv::Scalar(9, 100, 100), cv::Scalar(29, 255, 255), extracted_bin); // Orange cv::inRange(hsv, cv::Scalar(60, 100, 100), cv::Scalar(80, 255, 255), extracted_bin); // Green // cv::inRange(hsv, cv::Scalar(100, 100, 100), cv::Scalar(120, 255, 255), extracted_bin); // Blue input_frame.copyTo(result_frame, extracted_bin);
編集したらコンパイルし、再度launchファイルを実行します。
$ cd ~/ros2_ws $ colcon build --symlink-install $ ros2 launch raspimouse_ros2_examples object_tracking.launch.py
緑色の物体をカメラの前に置いてみましょう。
この例では、緑色の本をカメラの前に置きました。
うまく検出できない場合はソースコードのパラメータを調節してみてください。
続いて、青色の物体を検出します。
ソースコードを編集し、コンパイルしましょう。
void Tracker::tracking(const cv::Mat & input_frame, cv::Mat & result_frame) { // Specific colors are extracted from the input image and converted to binary values. cv::Mat hsv; cv::cvtColor(input_frame, hsv, cv::COLOR_BGR2HSV); cv::Mat extracted_bin; // cv::inRange(hsv, cv::Scalar(9, 100, 100), cv::Scalar(29, 255, 255), extracted_bin); // Orange // cv::inRange(hsv, cv::Scalar(60, 100, 100), cv::Scalar(80, 255, 255), extracted_bin); // Green cv::inRange(hsv, cv::Scalar(100, 100, 100), cv::Scalar(120, 255, 255), extracted_bin); // Blue input_frame.copyTo(result_frame, extracted_bin);
実行すると次のように青色の物体を検出できます。
もちろん検出だけでなく追跡もできるので、モータ電源をONして動かしてみてください。
まとめ
今回は、
- ラズパイマウスにカメラマウントとUSBカメラを取り付けました
- ラズパイマウスROS 2サンプル集の物体追跡サンプルを実行しました
- ソースコードを書き換えて、緑色の物体と青色の物体を検出しました
次回はライントレースオプションキットを使ったライントレースサンプルを実行します。