本記事でできること
ロボットの手先にカメラを搭載したハンドアイ構成でカメラ画像を取得して表示することもできます。
想定シーン
ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。
画像を表示する
OpenCVの画像表示では、cv::waitKey
のたびに描画が更新されるという仕様があります。ここでは備忘録的な感じで、画像をただ表示するだけのプログラムを掲載します。読み込んだ静止画の場合に加え、カメラ画像を取得して更新表示する場合のプログラムを掲載します。
実行環境
- OS:Ubuntu 22.04 LTS
- 言語:C++
- クルーボ:v5.1.0
クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。
- クルーボの製品サイト:https://chitose-robotics.com/
静止画を表示する場合のプログラム
#include <iostream>
#include <opencv2/opencv.hpp>
cv::Mat load_image(const std::string file_path) {
cv::Mat loaded_image = cv::imread(file_path, 1);
if (loaded_image.empty()) {
throw std::runtime_error("画像を正常に読み込めませんでした。");
}
return loaded_image;
}
int main(void) {
std::string file_path = "../data/fuji.jpg";
const cv::Mat loaded_image = load_image(file_path);
cv::imshow("window", loaded_image);
cv::waitKey(0);
}
カメラで撮像した動画を表示する場合のプログラム
このプログラムは、クルーボ スタートアップガイド4章のサンプルプログラムです。
#include <iostream>
#include <opencv2/opencv.hpp>
#include "crewbo/crewbo.h"
int main() {
// デバイス ID, 横解像度 , 縦解像度を設定する。
crewbo::camera::UsbCamera camera(0, 1280, 720);
std::cout << "q キー押下で終了します。 " << std::endl;
while (cv::waitKey(1) != 'q') {
// カメラ画像を取得する。
const cv::Mat camera_image = camera.fetchSingleFrame_();
// 取得画像を表⽰する。
cv::imshow("camera_image", camera_image);
}
}
おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御=ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。