Arduinoとサーボで実現する精密物体追跡システム:OpenCV顔検出+パンチルト制御
部品と材料
| 部品 | 数量 | 備考 |
|---|---|---|
| Arduino UNO | 1 | サーボ制御用 |
| 汎用カメラ(Webカメラ等) | 1 | 映像入力用 |
| サーボモータ Tower Pro MG996R | 2 | パン(水平)チルト(垂直)用 |
| Arduino処理用PC | 1 | Processing実行環境 |
使用アプリ・オンラインサービス
- Arduino IDE
- Processing(OpenCV for Processingライブラリ必須)
プロジェクト概要
物体追跡はコンピュータビジョンの重要なタスクです。高性能PCの普及、高画質・低価格カメラの登場、自動映像解析ニーズの高まりにより、追跡アルゴリズムへの関心が急増しています。映像解析の3ステップは:
- 注目すべき移動物体の検出
- フレーム間での物体追跡
- 軌跡解析による振る舞い認識
応用分野:歩行認識・自動物体検出、自動監視(不審行動検知)、動画索引・検索、HCI(ジェスチャー認識・視線追跡)、交通監視、車両ナビゲーション(障害物回避・経路計画)など。
本システムの特徴
CCTVカメラ映像から対象を検出・追跡し、監視室からレーザー搭載ロボットアームで物理的に追尾するリアルタイムシステムです。パンチルト機構により、映像フレーム内の全座標をカバーします。
ソフトウェア構成
Processing側(PC実行)
2種類のスケッチを用意:
- マウスドラッグ手動制御版(
mouse_drag_fina_larduino_workinh_code.ino)
マウス座標をサーボ角度に変換し、シリアル送信。OpenCVで顔検出も並行表示。 - 自動顔追跡版(
facetracking_procesing_final_code.pde)
OpenCVのCASCADE_FRONTALFACE分類器で顔を検出し、検出矩形の中心座標をサーボ角度へ変換して自動追尾。
共通仕様:
- 映像解像度:320×240(640×480を半分に縮小)
- シリアル通信:9600bps、パン角度・チルト角度・終端コード(255)の3バイト送信
- 角度変換:
pan = constrain(180 - mouseX*180/width, 0, 180)等 - Arduinoからのエコーバック(3バイト受信で完了判定)を確認
Arduino側(サーボ駆動)
mouse_drag_fina_larduino_workinh_code.ino(Arduino用)
Servo.hライブラリ使用- パン用サーボ:D9、チルト用サーボ:D11
- 初期角度:90°/90°
- シリアル受信で3バイト読み取り、終端コード(255)確認後にサーボへ書き込み
#include
byte inBytes[3];
Servo panservo;
Servo tiltservo;
int panangle = 90;
int tiltangle = 90;
void setup(){
Serial.begin(9600);
panservo.attach(9);
tiltservo.attach(11);
}
void loop() {
if(Serial.available() > 0){
inBytes[0] = inBytes[1];
inBytes[1] = inBytes[2];
inBytes[2] = Serial.read();
if(inBytes[2] == 255) {
Serial.write(inBytes,3); // エコーバック
panangle = inBytes[0];
tiltangle = inBytes[1];
panservo.write(panangle);
tiltservo.write(tiltangle);
}
}
}
必要なライブラリ
OpenCV for Processing:https://github.com/atduskgreg/opencv-processing からインストール必須。
カスタムパーツ・エンクロージャ
CADファイルリンク:記事参照(ロボットアーム機構部の3Dデータ)
まとめ・展望
このプロジェクトは、PC側の高度な画像処理(OpenCV顔検出)と、Arduino側のリアルタイムサーボ制御をシリアル通信で連携させた、古典的だが実用的な「パンチルト追跡システム」の好例です。Processingを使うことで、OpenCVのJavaバインディングを手軽に利用でき、プロトタイピングが高速化されています。
課題・改善点:
- サーボの応答速度・精度(MG996Rはアナログサーボで50Hz制御、デジタルサーボなら300Hzでより滑らか)
- 複数顔検出時のターゲット選択ロジック(現状は最初に検出された顔)
- カメラキャリブレーションとサーボ角度の幾何学的マッピング(現在線形近似)
- レーザーポインタ搭載時の安全性確保(クラス2以下、アイセーフ設計)
発展形として、カラートラッキング、光流法、ディープラーニングベースの物体検出(YOLO等)への置換、複数カメラによる立体追跡、ロボットアームへの拡張などが考えられます。
製造プロセス
- Python、SQLite、LabVIEWによるRaspberry Pi高精度温度プロファイリング
- Raspberry Pi 3とPubNubでリモート気象監視
- TI SensorTagをNode-RED経由でBlynkと統合 – Raspberry Pi Zero編
- OpenCVでRaspberry Pi上級卓球球追跡
- Raspberry PiでPIRモーションセンサーとLEDを制御
- Raspberry PiとOpenCVによる自動ビジョンベース物体追跡
- Bridge Shield でスマートロボットを構築:Raspberry Pi と Arduino の統合
- Pythonで作るWi-Fi制御Raspberry Piロボット - ステップバイステップガイド
- モーションキャプチャシステムにおける動的物体追跡精度の測定手法
- C# usingステートメント完全ガイド:名前空間インポート、エイリアス、静的ディレクティブ
- C#の文字列操作:Stringクラスのプロパティ・メソッド・ベストプラクティス