2021/12/15 よりサイトリニューアルしました

Raspberry Pi で作る「Open CVを使ったカラートラッキング追従カメラ」

カラートラッキング

 

先日、M5stackのunitv2で遠隔操作できるネットワークカメラを作成いたしました。↓

これを応用して、動体検知などでカメラが追従する仕組みを作ろうと思い立ったのですが、unitv2を使うとなればuartで他のデバイスにカメラ軸などの値を転送しなければならない為、個人的には敷居が高く、断念いたしました。

そこで、代わりにRaspberry piを使う事にしました。i2cが使えますので、直でサーボモータードライバを動かす事ができます。つまり動体検知のプログラムとサーボモーター駆動のプログラムを1つにまとめて書くことが出来ます。

動体検知のプログラムには、「Open CV」の」ライブラリを使用しました。カラートラッキング、顔認証、動体検知、などなどカメラ画像処理に長けた有名なライブラリですね。Pythonでも使えるので、Pythonで作成する事にしました。

Open CVは初めて触る事になるのですが、やってみた感想は、「便利な反面初学者には少々理解するのに時間がかかりそう」という感じです。ただ、ググれば先人方のフォーマットがたくさんヒットしますので、とりあえずそれを参考にすればなんとか動作させる事ができる事も分かりました。

という事で、今回は先人の知恵を借りながら、「Raspberry Pi で作るOpen CVを使ったカラートラッキング追従カメラ」についてまとめたいと思います。とりあず、カラートラッキングから。

 

初めに

Open CVのインストール

はじめに、ラズパイ(今回はRaspberry Pi4を使いました)にOpen CVをインストールします。

最新のものだとエラーが出たので、バージョンを指定しています。

続いてパッケージリストを最新にして、「libatlas3-base」 パッケージをインストールします。

以上でOpenCVのインストールは完了です。

ターミナルでpythonインタプリタを立ち上げ、import cv2 でエラーが出なければOKです。

 

システムの概要

おおまかな動作の流れとしては、下記のような感じのものを作ります。

raspberry pi4 ⇒ i2c ⇒ pca9685 ⇒ サーボモーター

pythonプログラムを作成し、カメラ画像に合わせたカメラ軸の位置をOpen CVとPCA96852ライブラリで決めてサーボモータドライバへ伝え、サーボモーターを駆動させます。

ちなみにカメラは、ラズパイ純正のカメラモジュールでも、USBカメラでも両方OKです。

 

Open CVについて

土台となるpythonの記述について

pythonの場合の基本的な記述を載せておきます。

上記のプログラムでカメラのストリーミングが開始しますので、これが基本的な土台となります。後は間にある部分に行わせたい画像処理のコードを挿入していく形になります。

それでは続いて、カラートラッキング+カメラ追従のプログラムを書きます。

 

プログラム

Python

以下のプログラムは、以下のサイトを参考にさせていただきました。

定年まで泣くんじゃない

pigpioの使い方になれていなかったので、Adafruit_PCA9685に変更しています。

 

プログラムの説明につきましては、上記サイト管理者様がコメントアウトにて丁寧に説明を入れてくれてますので、非常に分かりやすいです。

プログラム起動後、初めに画面中央に映った物体を色認証します。4つの小さい画面が起動するので、それを閉じれば、認証した色の物体を追従するようになります。

 

動作確認

こんな感じで動いてくれます。↓

https://twitter.com/ketunorobio/status/1470972642379571202

 

次回は顔認証、顔認証追従に挑戦したいと思います。

 

 

10 COMMENTS

Hironori Itakura

こんにちは。
ロボティクスの大学生です。
いつも拝見させていただいております。
早速ですが、「Raspberry Pi で作るOpen CVを使ったカラートラッキング追従カメラ」の内容について質問がござます。
この記事では、画像処理と同時にサーボモータも制御しているかと思いますが、同プログラムでは動かせるサーボモータは2個に限るのでしょうか?
現在、実験でロボットアームを使用していて、この記事を参考にして作動させたのですが、実際サーボモータ3つ以上では動きません。
どこかプログラムを書き換える必要があるのか、あるいはそのままでも動かすことができるのでしょうか?
書き換える場合は、内容を教えていただけると幸いです。
よろしくお願いいたします。

返信する
ketunorobio

Itakuraさま
はじめまして、管理人です。
ロボティクスの大学生からコメントを頂けるなんてとても光栄です!!(^▽^)
と同時にとても緊張しております(;^ω^)
恐らく、いや確実に私の方が教えを乞う立場で恐縮なのですが、一応ご質問の内容に関しまして分かる範囲で回答させて頂きます。

サーボモータを増やすには、以下のプログラム追加が必要かと思われます。
・関数moveに追加したチャンネルのサーボモータを記述 pwm.set_pwm(チャンネル番号, パルスのスタート, パルスの終了)

関数moveには引数にx,y軸の移動距離を渡しているので、あらたな方向の値、例えばZ軸を追加したいとすれば、
コメントアウト部のここから動かすところ、及び実際にカメラを動かすところ、の2か所にZ軸に関する記述を
追加する必要があるかと思います。

すでに対応済みなら申し訳ありませんが、、以上となります。
どうぞよろしくお願いいたします。

返信する
Hironori Itakura

こんにちは。
この度は、お忙しい中、質問に返信していただきありがとうございます。
管理人さんのアドバイス通り打ち込み、さらに試行錯誤した結果、3つ目以降のサーボモータも動きました!
私の場合、2つの方向に動かせればよかったので、move関数にチャンネルを一つ追加し、少しいじれば大丈夫だったようです。
わたしもロボティクスの大学生とはいえ、大した経験もしていないので、今回はとても助かりました。
ありがとうございました!

返信する
ketunorobio

とんでもございません、こちらこそありがとうございます!
少しでもお役に立てたなら幸いです!

返信する
Bluesman

初めまして
工学部の大学生です。現在ラズパイにおける暗闇での物体追尾について研究しています。

質問があります!Raspberry Pi で作るOpen CVを使ったカラートラッキング追従カメラを記事通りの手順で進めたのですが、垂直方向はうまく動作し追従してくれたのに対して水平方向のサーボモータがうまく動作しませんでした。(永遠に回り続けたり、動かなかったり…)
一応サンプルファイルなどで動作確認をしたのでサーボモータ自体に問題はないとは思うのですが…

何か考えられる原因が分かれば教えていただきたいです。

使用したのは、
RaspberryPi 4Model BでOSはBusterです。電源は別で5Vのものを繋いでます。

返信する
ketunorobio

Bluesman様

お返事おくれてしまい申し訳ありません、管理人です。
早速当記事のプログラムを検証した結果、こちらでも同じ症状が発生いたしました。申し訳ありません。
雑で申し訳ありませんが、応急措置として下記の修正プログラム追加をお願いします。

1.move関数を下記に変更
def movex(x_move):
pwm.set_pwm(1, 0, x_move)
def movey(y_move):
pwm.set_pwm(2, 0, y_move)

2,カメラ位置の初期化も変更
movex(X_HOME)
movey(Y_HOME)

3.関数呼び出しの記述move(move_degree_xmove_degree_y)を下記に変更
if move_degree_x > X_MIN and move_degree_x < X_MAX: movex(move_degree_x) if move_degree_y > Y_MIN and move_degree_y < Y_MAX: movey(move_degree_y) これで一応X軸は動くと思われます。(手元にY軸の環境が構築出来ていなくて、Y軸は試せていません、すいません(-_-;))

返信する
Bluesman

こんにちは
修正していただいたプログラムを動かしてみたつもりなのですが、エラーが出てしまいました。

Traceback (most recent call last):
File “/usr/lib/python3.7/ast.py”, line 35, in parse
return compile(source, filename, mode, PyCF_ONLY_AST)
File “/home/pi/Adafruit_Python_PCA9685/examples/colortrucking.py”, line 11
pwm.set_pwm(1, 0, x_move)
^
IndentationError: expected an indented block

お忙しい中何度もすみません。何卒宜しくお願い致します。

返信する
ketunorobio

こんばんは、管理人です。

インデントは合ってますでしょうか?
お手数ですがご確認をお願いいたします。

返信する
訓練生

質問させてください。 pigpioやwiringPiでのPWM操作はやったことがあるのですが、PCA9685 は使用したことがありません。 サーボモーターとのラズベリーパイとの接続方法をお教えいただけますでしょうか?

返信する
訓練生

失礼しました。 前回の記事に載っていました。ありがとうございます。

返信する

Hironori Itakura へ返信する コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です