ラズパイマウスでROS2動かしてみた 技術情報・開発日誌

ラズパイマウスとカメラで物体を追跡する

オレンジボールを撮影 ラズパイマウスでROS2動かしてみた
オレンジボールを撮影

こんにちは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カメラ
  • ソフトボール(オレンジ)
  • 作業用PC
    • Ubuntu 18.04のPCを用意しました。ROS 2 Dashingインストール済みです。

オプションキットの組み付け

それではオプションキットをラズパイマウスに組み付けましょう。

カメラマウントの組み立て

カメラマウントの組み立て

カメラマウントを固定する

まずはラズパイマウスにカメラマウントを固定します。

カメラマウント組み付け前

カメラマウント組み付け前

ネジで締めるだけなので簡単な作業です。

カメラマウント組み付け後

カメラマウント組み付け後

カメラを取り付ける

カメラマウントにはカメラ固定用のネジ穴が設けられています。

しかし、今回使用するUSBカメラにはネジが付いていないので、両面テープで固定します。

できるだけ固定用ネジ付きのカメラを使用してください
USBカメラを両面テープで固定する

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アプリケーションが起動します。

GUIアプリケーションが起動

rqtの画面上部にあるPluginsからVisualizationにあるImage Viewを選択します。

Image Viewを選択

Image Viewを選択

このrqt_image_viewプラグインでカメラ画像を表示できます。

先程起動したノードからはカメラ画像のraw_imageトピックと、物体検出画像のresult_imageトピックがパブリッシュされています。
それぞれを表示してみましょう。

rqt_image_viewで画像を表示

rqt_image_viewで画像を表示

raw_imageにカメラ画像が表示されたらOKです。result_imageは真っ黒でもOKです。

この例では次のように、ラズパイマウスの前にオレンジ色のボールを置きました。
rqtの画面より、ボールが撮影されていることが分かります。

オレンジボールを撮影

オレンジボールを撮影

オレンジ色の物体を追跡する

サンプルはデフォルトでオレンジ色の物体を追跡するように設計されています。
それでは、モータの電源をONし、物体を追跡してみましょう。

rqtで画像を表示すると追跡動作が不安定になる場合があります。rqtをシャットダウンしてからノードを起動してください。

次の動画のようにラズパイマウスが物体を追跡します。

緑色、青色の物体を追跡する

オレンジ色以外の物体を追跡したい場合は、ソースコードの変更が必要です。
この記事では、画像処理の仕組みや、物体追跡の仕組みについて説明を省略します。
ソースコードを読み解いて書き換えてください。

・・・

と本来なら終わるところですが、このサンプルコードには緑色、青色の物体を検出する関数が用意されています。
これを使ってみましょう。

次のようにソースコードを編集します。

$ 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サンプル集の物体追跡サンプルを実行しました
  • ソースコードを書き換えて、緑色の物体と青色の物体を検出しました

次回はライントレースオプションキットを使ったライントレースサンプルを実行します。

タイトルとURLをコピーしました