大阪大学 中島優作
前提:カメラ/デプスカメラ(キャリブレーション)、物体検出
部品をドラッグして動かしてみよう。どちらも追従するが、見ながら動くだけがぴったり合う
① はよく知られた使い方。② こそビジョンフィードバックのいちばんおいしいところ
モデルの誤差は「動く速さ・まっすぐさ」に効くだけで、最後に合う場所は変わらない
| 見てから動く(Look-and-Move) → 全体の計画 | 見ながら動く(ビジュアルサーボ) → 局所的な合わせ込み | |
|---|---|---|
| 流れ | 1 回撮影 → 位置を計算 → 動く | 撮影と動作を毎周期繰り返す |
| 精度を決めるもの | キャリブレーション+ロボットの絶対精度 | 画像の計測(分解能・検出の安定さ) |
| 速さ | 速い(あとは位置制御で一気に) | 合うまで時間がかかる。フレームレートで決まる |
| 実装 | 簡単。MoveIt で目標姿勢へ | 速度指令でリアルタイムに動かす仕組みが必要 |
| 向く作業 | 大まかに取りに行く(ピッキング) | 穴への挿入・位置合わせ・動く物の追従 |
全体の計画で数 cm 手前まで速く行き、最後の数 cm を画像で合わせる
「誤差を画像のまま使うか、3D に直してから使うか」の違い
両方を使うことも多い(固定カメラで近づき、手先カメラで合わせる)
安定した検出がすべての前提 → 物体検出のスライドの前処理を参照
「この見え方になるまで動け」= Teach by Showing(見せて教える)
vc = −λ L̂+ (s − s*)
重なっていれば e = 0(動かない)
記号は Chaumette & Hutchinson 2006 に合わせた
ds/dt = L vc
カメラの速度 → 画像上の点の速度(関節速度 → 手先速度のヤコビ行列と同じ形)
画像上の 1 点 (x, y)(正規化座標)、奥行き Z のとき
それでも「相手に対する相対位置」で合わせるので、見てから動くよりは誤差に強い
vc = −λ t, ωc = −λ θu
IBVS と同じ「ずれに比例した速度」
並進のずれの取り方にはいくつか流儀がある(Chaumette & Hutchinson 2006)
| IBVS | PBVS | |
|---|---|---|
| 誤差を測る場所 | 画像の上 | 3D 空間 |
| キャリブ誤差 | 強い(最後は画像で合う) | 姿勢推定の誤差が残る |
| 3D の動き | 大きく回ると遠回り・後退することも | まっすぐ |
| 視野から外れる | 外れにくい(画像の中で動く) | 外れることがある |
| 準備 | 目標の見え方を 1 枚撮る | 相手の 3D モデル・マーカー |
精度が欲しい最後の位置合わせは IBVS、大きく動くときは PBVS や見てから動く
▶ MoveIt Servo ▶ ViSP
import numpy as np
from geometry_msgs.msg import TwistStamped
def interaction_matrix(x, y, Z):
return np.array([[-1/Z, 0, x/Z, x*y, -(1 + x*x), y],
[0, -1/Z, y/Z, 1 + y*y, -x*y, -x]])
def ibvs(s, s_star, Z_star, lam=0.5):
# s, s_star: 正規化座標 [(x, y), ...] の 4 点
L = np.vstack([interaction_matrix(x, y, Z_star) for x, y in s_star])
e = (np.asarray(s) - np.asarray(s_star)).ravel()
return -lam * np.linalg.pinv(L) @ e # [vx, vy, vz, wx, wy, wz]
v = ibvs(s, s_star, Z_star=0.25)
v = np.clip(v, -0.1, 0.1) # 速度の上限
msg = TwistStamped()
msg.header.frame_id = "camera_color_optical_frame" # カメラ座標系の速度
t = msg.twist
t.linear.x, t.linear.y, t.linear.z = v[:3]
t.angular.x, t.angular.y, t.angular.z = v[3:]
servo_pub.publish(msg) # → MoveIt Servo へ
L は目標の見え方 s* と Z* で固定(簡単で安定)。速度は必ず上限で切る
▶ チトセロボティクス ※ 精度は同社の発表値
| 作業 | 何を見るか | ポイント |
|---|---|---|
| 穴へのピン挿入 | ピン先と穴 | 最後の数 mm を IBVS で合わせる |
| コネクタ・ケーブル | コネクタの形・マーカー | 柔らかい物はモデル通りに動かない → 見ながら直す |
| 動く物の追従 | コンベア上の物 | フレームレートと遅れが勝負 |
| 実験器具の操作 | ピペット先端と容器 | 器具の置き場所が毎回ずれても合う |
どれも「置き場所や形が毎回少し違う」作業。その違いを画像で吸収する
空間の 1 点は、直交する座標系などを利用して、座標(X,Y,Z)で表現されます。デカルトの発想です。(中略)ロボットにも、この点を(X,Y,Z)と教えればロボットの指先をこの点に移動させることができます。
引用:川村貞夫「相対位置誤差でロボットを動かす」チトセロボティクス 技術コラム
アリストテレスの場の捉え方は(中略)空間を定義する前に、対象物の存在から始まります。(中略)ロボットのシステムを構築する際に、空間(座標系)から考えるか、対象物から考えるかとなります。
引用:川村貞夫「相対位置誤差でロボットを動かす」チトセロボティクス 技術コラム
現実の世界では、床が完全に水平ではなく、ロボットのリンクもわずかには撓み、固定されたはずのロボットも振動などでわずかにずれる、このような現実世界で、理想の空間を追い求めることがキャリブレーションとなります。
引用:川村貞夫「相対位置誤差でロボットを動かす」チトセロボティクス 技術コラム
我々が何かの作業をする場合に、まず初めに空間に注目するのではなく、対象物に注目します。(中略)その際、絶対座標系で表現する必要はなく、対象物と他の対象物の相対位置のみで表現して作業を達成できます。いわば、デカルト的ではなくアリストテレス的思考で十分となります。
引用:川村貞夫「相対位置誤差でロボットを動かす」チトセロボティクス 技術コラム