本記事でできること
想定シーン
ロボットをビジュアルフィードバック制御する
カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。
画像内の2点間の角度を測る
カメラ画像から、画像内での2点間について、画像の横軸に対しての角度を知りたい場合があります。本記事では、画像内の2点間の角度を測るプログラムを掲載します。
実行環境
- OS:Ubuntu 22.04 LTS
- 言語:C++
- クルーボ:v5.1.0
クルーボについて
ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。
- クルーボの製品サイト:https://chitose-robotics.com/
プログラム抜粋
注意点:角度の計測基点は画像左側からになります。これは、OpenCVの画像の原点が左上にあることが理由です。
float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }
float get_angle(const cv::Point start, const cv::Point finish) {
const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
return RAD2DEG(radian);
}
全体プログラム
#include <iostream>
#include <opencv2/opencv.hpp>
float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }
float get_angle(const cv::Point start, const cv::Point finish) {
const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
return RAD2DEG(radian);
}
int main(void) {
cv::Point point_1(100, 100);
cv::Point point_2(850, 770);
const float result_angle = get_angle(point_1, point_2);
std::cout << "angle : " << result_angle << std::endl;
}
実行結果
angle : 138.225
おわりに
人手作業をロボットアームで自動化するために、カメラを使ったロボット制御=ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。