生産技術者サラリーマンの日々

社畜サラリーマンが生産技術やお金の悩みを徒然と書くブログです。私の備忘録が共有できるとうれしいです

【Python】治具座標系からロボット座標系への変換方法(特異値分解)

f:id:inusan0424:20210925214030p:plain

目次

1.やりたいこと

6軸ロボットのプログラムをつくっています。同じ動作の繰り返しであればそのまま教示を行ってしまえばいいのですが、複数の点を1点1点教示していくのは非常に面倒なので、基準点を1点教示してあとは、CADなどから出力した座標データをロボットに与えることにしました。

具体的には、平面上の加工物へのアプローチ(接触)を外部の制御機器からロボットへ数値情報を送り、動的にアプローチの位置を基準の位置からオフセットできるような仕組みにしたいのです。

ここで、CADデータが分かっているので、基準点からオフセットする数値座標を送ればいいじゃんとおもったのですが、治具自体に回転成分も含まれているため、そのままオフセットはつかえませんでした。

そのため、今回は、加工物のCADデータの座標点から、設備のロボット座標系に変換する方法として、DLT法の活用で対応することにしました。

2.DLT法

ここで、課題となるのが、CADデータの座標データを送付して、それをなにかしらの変換して、ロボット座標しなければならないことです。

これらを解決する方法に、DLT法があります。direct linear transformation method(DLT 法 ; Abdel-Aziz & Karara, 1971)の略称とのことで、計測空間内での位置が既知である計測点を撮影に使用する全てのカメラで撮影し,撮影映像上での座標(以下,2次元計測座標)と実空間での座標(以下,実空間座標)とを対応させるキャリブレーションを行い,変形した共線条件式によって求めた DLT パラメータを用いて,分析対象点の3次元座標を推算する.

引用文献等

ビデオカメラでの 3 次元動作計測における問題点と測定精度向上の取り組み
中井 聖1,2
1
京都光華女子大学健康科学部健康栄養学科(2018年3月まで)
2 大阪電気通信大学医療福祉工学部健康スポーツ科学科(2018年4月より)

つまり、カメラなどの2次元平面のある座標点から3次元上の座標点に
変換することができる変換パラメータを求めることができる方法とのことです。

3.実装

実装については、以下の参照しました。
DLT法は、2次元のカメラ画像の座標系から実空間の3次元座標へ変換しています。今回は、加工物の座標系からロボットの座標系への変換を求めたいと思います

実装には下記のホームページ及び参考書を参考にしました。

qiita.com

www.amazon.co.jp

数式

数式

Xaには加工物の座標系
Xbにはロボットの座標系を入れています。

作った行列は下記添付しておきます。

https://docs.google.com/spreadsheets/d/1jAqrYk1037cm9-blanvP_ZfPnlX8_j-h/edit?usp=sharing&ouid=117167196077603430840&rtpof=true&sd=true

このあと、作った行列をBとすると
①BT(置換行列)× Bを行い、BTBの行列を作る。
②BTBを特異値分解し、u,s,vに分解する。
固有値が最小となるときのv(固有ベクトル)が求めたい
 a1~a12となる。

4.検証

import numpy as np

;CSVデータの読み込み
B = np.loadtxt("matB.csv”,delimiter=",")

;転置行列
BT = B.T

;内積
BTB = np.dot(BT,B)

;特異値分解
u, s, v = np.linalg.svd(BTB)

;行 列の取得
row, col = v.shape

;最小固有値における固有ベクトルの抽出
vec = v[row-1, :]

;ベクトルを3×3行列に変換する
A = vec.reshape(3,3)

この行列Aが加工物の座標系→ロボット座標系に変換するための
行列になります。
例えば、加工物の座標が
x=-1.14
y = 5.1
となるとき、加工物のベクトルは以下のように設定します

;加工物のベクトルを設定
kakoubutu = [-1.14, 5.1, 1]

;加工物からロボット座標系へ変換
rob = np.dot(A, kakoubutu)

;ロボット座標系を正規化
rob_x = rob[0]/rob[2]
rob_y = rob[2]/rob[2]

正規化したrob_x, rob_yが対応するロボット座標系となります

【ラズベリーパイ4】OSなどの初期設定おこなった

目次

1.ラズベリーパイを購入した理由

数年前から気になっていたアイテムです。よくあるワンボードマイコンとは異なり、OSが入っており、PCのように運用できること、WIFI、USB、など様々な機能が入っているのにこの小ささ。
もちろん、価格はワンボードマイコンに比べたらお高いですが、IoTの何かを作るには画期的なボードだなーと思っていました。

そんな中、最近よくニュースで「さい銭泥棒」の映像を目にする機会があり、犯人逮捕!ってな感じです。そういえば、自分、今年、お寺の氏子を担当しているのですが、毎年、さい銭泥棒の被害にあっているようで、ことしは、鍵を破壊されたため、警察を呼んだそうです。

近所とはいえ、正月の期間にさい銭泥棒のために、昼夜監視するのは避けたいなって思ったときに、「ラズパイ!」て安直な考えで監視カメラをつくろうとおもったのが経緯です。

ネットには、監視カメラ関係のネタが多数あるため、活用させて頂きながら製作できたらと思い、まずは、購入しました。

2.準備

ラズパイ単体だと、送料込みで6500円くらいでしょうか。
その他に、ケース、3A近くだせるUSB-電源、マイクロHDMI、マイクロSDカードなど必要で、1万5千円近くなるようです。

たかい・・・・

てなことで、中古でないかなーってことで、1万円以下でラズパイ4 メモリ4Gがあったので、ここで手を打ちました。

3日後 ピンポーン きた!
ガサガサ、開封。。。。。

おいおい
汚ねー
髪の毛ついてるし、中身ぐちゃぐちゃだし、
マイクロSDカードないし!(しぶしぶ、家電屋で購入)

でも、とりあえず、本物で間違いなさそう
ラズパイ

とりあえず、電源入れてみる。電源供給のため、USB-Cに接続。キーボードとマウスをUSBに接続。最後に映像出力のため、マイクロHDMIを接続した。

電源ON!
とりあえずFANは回ってるし、映像が出た。

SD

なんかこの画面から変わらんし・・・・
よくわからんこと書いている・・・・・
SDカードがない?

ちゃんと調べずにいきなりやったので当然ですが、
OSなどはSDカードに入ってないと動かないらしい。
ネットからダウンロードしないといけないらしい。

3.初期設定

OSの設定には、いろいろとあるようですが、現時点でもっとも新しく、簡単な方法は、「Raspberry Pi imager」というソフトを使ってSDカードに書き込む方法がよいそうです。

とりあえずやってみる

公式サイトからWindows用をダウンロード

www.raspberrypi.org

ダウンロード

このソフトは、OSやそれ以外のソフトフェアをこのSDカードに書き込むときに利用するときに使用するようです。
今回は、OSを選択
OS
選択

次に書き込みしたいSDを選択
既に自動で検出されているのがすごい!
※SDカードの容量は、32Gが推奨されているらしい
SD

SDカードの書き込みが完了後、ラズベリーパイにSDカードをセットして電源ONすると、OSが自動で立ち上がりました。
立ち上げ

【三菱16ccl-m】CC-LINK 設定方法について


目次

1 システム構成

システム
FX3U-16ccl-mをマスタ局として、リモートI/Oとインテリジェントデバイス局の2つと接続しましたが、GX Works2の設定を行いました。

inusan0424.hatenablog.com

2 設定方法

2.1 ハード設定

マスタ局は、×10を「0」 ×1を「0」
速度を選択(自分は10Mで運用するので、「E」を選択)
ハード設定

dl.mitsubishielectric.co.jp

2.2 パラメータ設定方法

①プロジェクトからCC-LINKを選択
CCリンク

②接続ブロック「あり」を選択してアクテイブにする。
③総接続台数を入力(今回は、2台)
④局情報を選択
CCリンク設定2
⑤接続する機器の情報を入力
今回は、リモートI/Oは、1局(入力16点、出力16点)と
IAI リモートインテリジェント局が4局(入力64点、出力64点)となります。
CCリンク3

設定自体は以上です。
接続したい機器が何局及び局の識別が分かれば簡単に接続できます。

3.ラダーの記述方法

本当は、通信状態などの情報を取得して、通信が確立したことを条件に入れるべきでしょうが、サクッと運用したい場合は、下記のラダーを一文書くだけでデータの送受信ができ、自動でデータがはいってきます。

ラダー1

■接点データの受信(外部機器→マスタ)
16ccl-mの接点データの先頭アドレス「H0E0」からM1000を先頭にK6(16 点×6つ)分のデータを受信する。

■接点データの送信(外部機器←マスタ)
16ccl-mの接点データの先頭アドレス「H160」からM1200を先頭にK6(16 点×6つ)分のデータを送信する。

■デバイスデータの受信(外部機器→マスタ)
16ccl-mのデバイスデータの先頭アドレス「H2E0」からD1000を先頭にK20(D1000~D1020)分のデータを受信する。

■デバイスデータの送信(外部機器←マスタ)
16ccl-mのデバイスデータの先頭アドレス「H1E0」からD1200を先頭にK20(D1200~D1220)分のデータを送信する。

【三菱FX3G+16ccl-m】CC-LINKでIAI RCONを制御する

プログラム

簡単な装置であれば、IOやプログラムステップ数も少ないため、今回余っている三菱FXシーケンサを使って、IAI RCONをCC-LINKで制御するシステムを構築しました。

目次

1. 三菱シーケンサ (PLC)

三菱シーケンサ(PLC)には、大きく2つの種類があると思っています。ひとつは、Qシリーズのように電源、CPU、入出力、インテリジェントユニットなど必要な機能によって、入れ替えが可能で、メモリ容量も多く、比較的大きな設備を作る場合は、Qシリーズを選定します。
 今回は、I/Oも合計30点程度と規模の小さい設備にQシリーズはもったいないってことで、そういうときには、FXシリーズを選定するようにしています。

2. FXシリーズ

FXシリーズは、電源、CPU、I/Oが一体となったシーケンサでこれ1つで簡単に装置の制御ができます。FXシリーズにも細かく仕様がことなりますが、高速カウンタやEEPROMメモリを内蔵、バッテリレスでメンテナンスフリーといった十分な仕様です。自分的には、コスパと用途からFX3Gシリーズが好みです。

EEPROMメモリ:シーケンサ電源を切っても、デバイスデータを保持することのできるメモリです。FX3Gだと、M384~M1535の152点、D128~D1099の972点が固定値で設定されています。

www.mitsubishielectric.co.jp

3. IAI RCON

装置アクチュエータにはエアシリンダー以外に、電動シリンダーにて位置決めで治具の位置を動的に変更する仕様を考えています。今までは、PCONやSCONを使っていたのですが、選定したアクチュエータはRCONを使うようで、このような商品があることを知りませんでした。

RCONの特徴として、1台のコントローラで最大2台制御できるという点で、2台以上制御する場合におすすめのようです。また、幅ば22mmとかなり小さく今までのユーザーからすると驚きました。
また、簡単に増設できるところが新しいです。今までは追加で1台1台買って配線していたので、素晴らしい仕様です。

www.iai-robot.co.jp

ただ、入力電圧はDC24V仕様です。今回4台接続させるため電流は15A近く必要となります。(100~200V仕様だとうれしいのですが)
てなことで、仕方なく、IAIのパワーサプライPSA-24Lを2台購入して並列で結線しています。

https://www.iai-robot.co.jp/download/catalog/pdf/CHIRASHI/CHIRASHI_PSA-24(20200508-01).pdf

4. システム構成

手元にあったFX3GでRCONとCCLINKにて通信し、電動シリンダを制御するものです。FX3GのI/Oが足りなかったので、リモートI/Oを追加して入出力接点を追加しました。
システム

【三菱PLC+エンコーダー】送り量を計測する

モータ

目次

1.やりたいこと

サーボモータを使ったワイヤを送る機構を使った装置を検討中。但し、モータの指令値(どのくらいモーターを回転させる=どのくらいの長さを送る)を出しても、実際に送られるワイヤが指令通りワイヤが送られているかわからない。ワイヤと送り機構の間で滑ったりしてしまい、指令値に対して正しく出力(今回だとワイヤの出量)が出ているかを確認するために、エンコーダーを送り機構に取り付け、ワイヤの送り量を計測したい。

2.システム構成

2.1 PLC(シーケンサ

シーケンサ

www.mitsubishielectric.co.jp

今回は、使いなれた三菱シーケンサQシリーズで構成しました。
アドレスは以下のようになっています。

スロット1:00~1F(QH42P 入出力ユニット)
スロット2:20~3F(QJ61BT11N CCリンクユニット)
スロット3:40~4F(Q68ADV アナログ変換ユニット)
スロット4:50~5F(QD62 高速カウンタ)

2.2 高速カウンタとの接続するために

エンコーダーの入力を受けるためにQD62高速カウンタに接続します。
当然、ユニットには直接接続できないため、下記の端子台(A6TBXY36)及び接続ケーブル(AC20TB)を利用しました。

PLCと端子台
補足1:AC20TBの数値は、ケーブル長さにより変わります。
補足2:使用する電源はDC24V

引用:三菱電機 
   高速カウンタユニットユーザーズマニュアル(詳細編)

配線図はこのようになります
配線図

引用:三菱電機 
   MELSEC iQ-R 入出力ユニットユーザーズマニュアル

2.3 エンコーダーの選定

今回選定したエンコーダーは、オムロン社製E6C2-CWZ6C 300P/R 2Mを
選定しています。1回転するのに300パルス出力するもので、インクリメント型です。

www.fa.omron.co.jp

2.4 端子台とエンコーダーの接続

上記マニュアルを参考に、このように配線しました。
Z相は回転方向(時計まわり、反時計回り)に使用するようですが、今回不要だったため、処置しませんでした。(どうやって使うのか調べてなかったです・・・・)
結線図

3.プログラム(ラダー)

パラメータ設定などは専用のソフトGX Works 2で設定しています。
インテリジェント機能ユニット内に記載されているQD62の「スイッチ設定」「パラメータ」「自動リフレッシュ」は以下のように設定しています。
設定

ラダーのプログラムは、以下のマニュアルのサンプルプログラムを使用すれば使えますが、パラメータ設定をで難しいことはなく、指定したデバイスにカウンタ値が入ってきます。

引用:三菱電機 
   高速カウンタユニットユーザーズマニュアル(詳細編)

4.送り量の計算

送り量の計算は以下の通りなるようにラダーでプログラムします
送り量=エンコーダーのカウント(パルス)数/1回転したときのパルス数×回転している機構(ローラー等)の直径を代入して計算することで算出します。
小数点なので、EMOVを使ってデータを格納します。コマンドとしては、[EMOV E25.5 D6500]なんてかけばよいでしょう。
今回エンコーダーの入力をうける設定を2相4逓倍としているため、エンコーダー1週当たりパルス数は、300PR×4逓倍で1200パルスとなります。

【PYTHON+OPENCV】回転不変位相限定相関法(RIPOC)を実装する

目次

1.やりたいこと

2つの画像間で特徴点を抽出して、その差分から誤差が最小になるように画像を幾何学的(回転、平行)変換から2つの画像間の式を求めたい。この式が精度良く求めることができると、カメラのキャリブレーション、時空間フレームの処理、ステレオカメラなどの視差画像など画像間の「照合」や「位置合わせ」に応用できる。

これら、「照合」や「位置合わせ」(画像1の画像座標Xが画像2の画像座標X"と対応していることを求めること)の方法として、いろいろなアルゴリズムがあるが、今回は回転不変位相限定相関法について実装してみた。

2.RIPOCとは

回転不変位相限定相関 (RIPOC)は位相限定相関 (POC)の応用の一つであり、登録画像に対して回転している入力画像に対しても相関をとることができ、相関結果から回転角度を推定することができるという特徴を持っているとのことです。

https://www.jstage.jst.go.jp/article/itetr/22.45/0/22.45_55/_article/-char/ja/www.jstage.jst.go.jp

qiita.com

理論は、下記が参考になるかと思います。私には数式の難易度が高くて
ついていけないなかったです。

東北大学 青木研究室様が位相限定相関法で有名のようです。

https://www.jstage.jst.go.jp/article/itej/63/7/63_7_935/_pdf/-char/ja

3.実装

実装にあたっては以下のサイト様を参考にしました。

csharpmagazine.hatenablog.com

import cv2
import numpy as np

#回転角度を算出する関数
def CalcDeg(dy, len):
	deg = dy / len * 360
	return deg

#回転不変位相限定相関法
def Ripoc():
        #画像の読み込み
	im1 = cv2.imread("Lenna.jpg",0)
	im2 = cv2.imread("Lenna90.jpg",0)
  #画像サイズの取得
	cy,cx = im1.shape
  #窓関数の生成
        win = cv2.createHanningWindow((cx,cy), cv2.CV_64F)
  #入力画像1,2に窓関数をかける
  wim1 = im1 * win	
	wim2 = im2 * win
  #極座標変換
	im1p = cv2.linearPolar(wim1, ((cx/2.0,cy/2.0)), r, cv2.WARP_FILL_OUTLIERS)
	im2p = cv2.linearPolar(wim2, ((cx/2.0,cy/2.0)), r, cv2.WARP_FILL_OUTLIERS)
  #32Bit画像に変換
	im11 = np.float32(im1p)
	im12 = np.float32(im2p)
  #位相限定相関法によるマッチング
	xy, match = cv2.phaseCorrelate(im11,im12)
	#得られた結果から、画像1と画像2間の角度を取得
	scalar, r = xy
	deg = CalcDeg(r, cy)
	return deg

4.処理結果

実行結果は、以下の通りです。
入力画像1のオリジナルの画像に対して、90度回転させた画像を入力画像2とした2つを用意し、下記のプログラムを実行し回転角度を計測した結果、ほとんど誤差がない結果が出ました。

但し、これはオリジナルの画像とオリジナルの画像を90度回転させたものである。入力画像2を別の画像でとった場合、その他の回転方向の誤差により、誤差が多くなるかもしれません。

>>> import ripoc as r
>>> deg = r.Ripoc()
>>> deg
-89.78454078999397

【入力画像 0度】
入力画像
【入力画像 90度】
入力画像90度
極座標変換 0度】
極座標変換画像 0度
極座標変換 90度】
極座標変換画像 90度


inusan0424.hatenablog.com
inusan0424.hatenablog.com

【業務日誌】明日は憂鬱なイベントが・・・

本日の生産技術サラリーマンの一日です。

憂鬱

  • 6時半:ワクチン起床。やはり副反応がのこる。37.1度だった。とはいえ、解熱剤を飲んでいく。
  • 8時:朝の朝礼。担当から今日の業務内容を聞く。派遣さんひとりの仕事の進捗が思わしくない。聞き取りを行い、たまっている業務を確認。バックアップのため、2件引き取る。
  • 8時半:引き取った2件の着手。治工具の改修依頼書と作業指示書の改定。内容は軽微な訂正のため、サクッと終了
  • 9時:課長が来る。不具合の件を聞かれる。自部門に責任があるわけでないが、状況や進捗を聞かれる。不具合の状況を正確に把握していないので、別途調査して報告しますとお伝えする。
  • 10時半:不具合の事象、原因を調査開始。担当者からの情報や図面をみて不具合の原因に至った過程をまとめ、課長に報告
  • 13時:現場へ移動。修理日程の確認し、お客さんへの説明の日時を決めてほしいと現場品証さんへ依頼
  • 13時半:自動化試作装置の組立作業。9月から動作検証開始したが、まだ、いろいろと終わっていない。治具テーブルの再配置を行いロボットの可動範囲内に移動。(基本の基本ができてなかった)。
  • 15時:昨日動作しなかった自動化設備に移動。再度電源を投入したところ動いた。昨日はなぜ動かかなった。。。動作確認を行い、予想通りの結果だったため、事務所に戻り、設備メーカーに連絡
  • 16時:社内の新しいシステムについて、質問される。即答できないため、わかる人に聞いて、回答する
  • 17時:担当から治工具の確認/点検依頼をされる。見切れないため、明日に回す。
  • 19時:帰ろうとするが、メールを見ると不吉なタイトル。恐る恐るメールを見ると、会議に参加しろとの指示。最近担当された新しい業務だが知らないことが多すぎで、気が乗らない。しかも、よく見たら明日の9時。場所すら書いてない。考えるのやめます。帰ります。

本日の勤務終了です。

https://blog.hatena.ne.jp/inusan0424/inusan0424.hatenablog.com/config/design/detail