Pixels to Motors
DAY 192
mechArm 270 Pi
動的追従の限界を探る
Log#10
視点を増やす日 ── 設計判断とiPhone 2台体制の物理構築
FROM / Log #9
視差問題の浮上
TOP
BLIND: Y / 水平
→
TO / Log #10
視点を増やす
TOP
SIDE
FULL: X / Y / Z
💡 Key Takeaway ── 本日の達成
01 / 設計
設置位置の選定
マット手前 / 水平視線 / レンズ高さ ≈ マット面の B案を採用
02 / 運動学
γ-lookup逆引き
既存FK scanに姿勢列を事後計算で追加、平行スライドを解く
03 / 物理
2台カメラ並列
Iriun + Continuity Camera で2台を独立デバイス化
01
起点
Log#9で何が見えていたか
設計思想の転換
段階分け追従 → コマ撮り連続追従
旧設計思想
破棄
構造
APPROACH → DESCEND → refine
駆動
停止 → 観察 → 計算 → 動作
姿勢
3関節同方向リーチ伸縮
新設計思想
採用 ★
構造
段階分けせず連続制御
駆動
動作中も観察・動作を並行
姿勢
グリッパー水平・高さ一定
同時浮上した3つの要件
Log#10のスコープを規定する要件群
要件 01 / 視差
上カメラは斜め視点
高さが変わるとTIP画面位置に視差。Log#8「TIP_X 61.4mm シフト」の正体
要件 02 / 制御
コマ撮り連続追従
Log#4で部分実装。姿勢遷移の最中も追従し続ける徹底が必要
要件 03 / 運動学
平行スライド
j4も含めた姿勢拘束付きの運動学が必要
Log#9 実測値
4.786
mm / deg
DISCARDED
この値の正体
リーチ伸縮の感度
NOT 平行スライド
必要な新値
平行スライドの感度
TODO
"
上カメラだけで
高さ・水平の検証はできない
Log #9
引き継ぎ書
02
設置設計
横カメラの設置位置 ── 3案を1案に絞る
横カメラの主目的
何を見るために置くのか
目的 01
Y が一定であるか
平行スライド時の高さ検証
目的 02
水平姿勢
グリッパーが傾いていないか
目的 03
TIP軌跡が直線か
x / z 平面での経路検証
設置位置の比較
A / B / C ── どこに置けば何が見えるか
TOP-DOWN VIEW
MAT 620 × 450 mm
ARM BASE
BLOCK
A
A
B
C
A
左右脇
B
手前側
C
奥側
↑
案を選択
A ── マット左右脇
不採用
見える方向
X + Y
グリッパー
△ 肩・肘で隠れる
上カメラ映り込み
△ 視野内
B ── マット手前側
採用 ★
見える方向
Z + Y
グリッパー
◎ 常に最前列
上カメラ映り込み
◎ 俯瞰の死角
C ── マット奥側
不採用
見える方向
Z + Y
グリッパー
✕ ベースに隠れる
上カメラ映り込み
◎ 死角
B案 仕様確定
マット手前 / 水平視線
⟷
位置
30〜50 cm
↕
レンズ高さ
マット ±50 mm
→
視線
水平
⊥
固定
卓上三脚
03
運動学
平行スライド運動学 ── 制約条件と解法
グリッパーの掴み方
上から掴む vs 横から掴む
上から掴む
不採用
24 mm
GRIPPER
pitch ≈ 90°
姿勢
フィンガー軸 = 重力方向
先端
真下 (pitch ≈ 90°)
適合性
立方体ブロックの上面が小さく不向き
横から掴む
採用 ★
24
GRIP
pitch ≈ 0°
Y=12
姿勢
フィンガー軸 = 水平
先端
前方 (pitch ≈ 0°)
適合性
側面から確実に掴める
赤ブロック高さ
24
mm
INPUT
TIP目標 Y
12
mm (中心高さ)
TARGET
Log#9 DESCEND姿勢
J1=87.74
J2=−10.0
CONFIRMED
運動学の制約条件
3つの制約を同時に満たす
制約 01
TIPの y = 12mm 一定
制約 02
フィンガー軸 = 水平
制約 03
TIPの x, z のみ変化
6軸を3グループに分解
関節の役割分担 ── ②が平行スライドの本体
GROUP ①
yaw合わせ
j0
ベース回転
GROUP ② ★ 本体
リーチ + 高さ保持
j1 + j2 + j3
3関節協調
手首傾き相殺
(距離, y) 制御
GROUP ③
フィンガー姿勢
j4 + j5
水平挟み
垂直挟み
!
設計上の懸念
マット面干渉
TIP目標Y
12 mm
マット面まで
VERY CLOSE
干渉リスク
グリッパー底
→ 横カメラ設置直後の最初のジョブ
MAT SURFACE
GRIPPER BASE
24mm
TIP Y = 12mm
⚠ GRIPPER 底面が
マット面に干渉?
04
解法選択
解法の選択 ── γ-lookup逆引きが最適
3つの解法
α / β / γ ── どれを採用するか
α
解析的IK
β
数値解
γ
lookup逆引き
↑
解法を選択
α ── 解析的IK
不採用
実装難度
高
既存資産
FK scan 使わず
リスク
DH公式値不信
β ── 数値解 (ヤコビアン疑似逆)
不採用
実装難度
中
既存資産
FK scan 使わず
リスク
反復計算が重い
γ ── lookup逆引き (FK scan 512,087点)
採用 ★
実装難度
低
既存資産
既存lookupの拡張
理論的根拠
P008 と整合
実機キャリブ済
机上DHより誤差小
P2M コアと整合
γ-lookup逆引きの3段階フィルタ
512,087点 → 平行スライドの1点へ
F1
第1フィルタ ── ee_y ≈ 12mm (±2mm)
+
→ 数千〜数万点
最大削減
高さ拘束
F2
第2フィルタ ── |gripper_pitch_world| ≤ ε (±5°)
+
水平姿勢
pitch ≈ j1+j2+j3
事後計算で追加
fk_scan_with_pose.csv
F3
第3フィルタ ── 目標 (ee_x, ee_z) に最近傍
+
→ 1点確定
j0..j5 取得
send_angles() へ
γ-lookup 絞り込みプロセス
512,087 → 1 への漸減
512,087 points
F1: ee_y ≈ 12mm (±2mm)
数千〜数万 points
F2: |pitch_world| ≤ ε
数十 points
F3: 最近傍 (ee_x, ee_z)
1
→ j0..j5 を send_angles()
残課題 01
符号の確定
j1+j2+j3 ?
残課題 02
水平の実機キャリブ
オフセット補正
FK scan総点数
512,087
points
READY
05
キャリブ
横カメラのキャリブ計画 ── アームをキャリブ装置として使う
キャリブの3層構造
層1 / 層2 / 層3 ── どこに労力を割くか
L1
内部
L2
外部
L3
統合
↑
層を選択
L1 ── 内部パラメータ (歪み補正)
後回し
通常
チェスボードキャリブ
今回
取らない
運動の整合性 > 絶対精度
不足時に取得
L2 ── 外部パラメータ (位置・向き)
本丸
手順 01
既知姿勢に移動
手順 02
青マーカー検出
手順 03
多項式回帰
R2R2R と整合
Unity真値 → リアル校正
追加用具なし
L3 ── 両カメラの統合
仕組み化
X 左右
x_top
Y 高さ
y_side
Z 手前奥
(z_top + z_side) / 2
Z 二重取り
整合性チェック
P008 の応用
"
アームそのものを
キャリブ装置として使う
層 2
解き方
06
物理設置
物理設置のトラブル ── 仕様の落とし穴
トラブルシュートの流れ
Iriun単体不可 → 3代替案 → Continuity Camera採用
01
当初想定 ── Iriun単体で2台
+
PLAN
iPhone × 2 + Iriun
既存環境継続
02
失敗 ── プルダウン切替式
+
FAIL
single source only
公式表記が紛らわしい
多アプリ != 多デバイス
03
代替案検討 ── 3案を比較
+
EVAL
① Continuity Camera
② EpocCam
③ OBS Virtual
04
採用 ── Continuity Camera
+
DECIDE
macOS Ventura+
iOS 16+
iPhone XR+
追加コスト 0
05
有効化 ── OpenCV から並列認識
+
RESULT
Cam 0: 内蔵
Cam 1: 1920×1080
Cam 2: 1920×1080
!
落とし穴
カメラインデックスが起動順で入れ替わる
類似事故
DAY153
対策方針
起動時判定
実装
DAY193 タスク
07
役割転換
役割の入れ替え ── 当初想定からの転換
カメラ役割の入れ替え
当初想定 vs 最終構成
当初想定 (Log#9引き継ぎ)
改訂
上カメラ
既存iPhone (Iriun)
横カメラ
iPhone 11 (Continuity)
最終構成 (現場で確定)
採用 ★
上カメラ
iPhone 14 Pro Max (Continuity)
横カメラ
iPhone 11 (Iriun)
Continuity 相性
新機種ほど◎
→ iPhone 14 Pro
Iriun 安定性
古い機種でも安定
→ iPhone 11
割り当て原則
純正は新機種に
RULE
"
iriunカメラをiPhone11の方にして、
通常のカメラをiPhone14proに変更したよ。
こっちのほうがいいみたいだね。
現場メモ
08
役割分担
2台のカメラの役割分担 ── どの軸を、どちらが見るか
軸ごとの担当カメラ
X / Y / Z ── どの軸をどちらのカメラが見るか
MAT 620 × 450 mm
ARM
BLOCK
TOP
SIDE
TOP
SIDE
X
左右
Y
高さ
Z
手前奥
↑
軸を選択
X 軸 ── 左右
主担当: TOP
TOP CAM
主担当 ◎
SIDE CAM
担当外 ✕
Homography → mm
上カメラ単独完結
Y 軸 ── 高さ
主担当: SIDE
TOP CAM
担当外 △
SIDE CAM
主担当 ◎
高さ一定の検証
水平姿勢の確認
Z 軸 ── 手前奥
主担当: 両方 (二重取り)
TOP CAM
担当 ○
SIDE CAM
担当 ◎
整合性チェック
キャリブ診断
横カメラ設置直後の答え合わせ
机上検討の3つの懸念が一発で解消
答え合わせ 01
マット面干渉なし
底部とマット面に明確な隙間。TIP=12mmで干渉せず
答え合わせ 02
青マーカー検出可
上カメラの
detect_tip_blue_geometry()
関数を流用可
答え合わせ 03
DESCEND直前を捉える
上カメラの視差で見えなかった領域を真横から追える
09
次セッション
DAY193以降 ── 8ステップで PICK実機検証へ
DAY193以降の実装順序
8ステップで PICK実機検証へ向かう
01
iPhone 11 の物理固定
+
HARDWARE
卓上三脚
レンズ高さ再現
水平視線
02
カメラインデックスの自動検出
+
SOFTWARE
Iriun + Continuity 両対応
起動時判定
DAY153の事故防止
03
横カメラ単体テスト
+
VERIFY
青マーカー検出
上カメラ関数流用
04
キャリブスクリプト作成
+
SOFTWARE
FK scan 50〜100姿勢
両カメラ pixel記録
CSV保存
05
pixel ↔ (z, y) 変換式の作成
+
SOFTWARE
多項式回帰
scipy / numpy
06
整合性検証
+
VERIFY
z_top vs z_side
統計的評価
ズレ領域の原因特定
07
visual_servo_pick.py
リファクタ
+
SOFTWARE
平行スライド対応
両カメラ統合
γ-lookup組み込み
08
PICK実機検証
+
VERIFY
水平確認
Y=12mm安定
爪が届く
掴める
本日の総括
破棄したもの / 立ち上がる新構造
破棄したもの
Log#9で否定
追従
段階分け追従
運動学
3関節同方向リーチ伸縮
数値
Z係数 4.786 mm/deg
立ち上がる新構造
Log#10で確立 ★
追従
コマ撮り連続追従
運動学
γ-lookup逆引き平行スライド
視点
上 + 横の両カメラ統合
本日の結論 ── 横カメラを置く前と後では、見える世界が違う
BEFORE
1 CAMERA
TOP
Y / 水平
BLIND
X 左右
○
Y 高さ
✕
Z 手前奥
△ 視差
水平姿勢
✕
→
AFTER
2 CAMERAS
TOP
SIDE
X → TOP
Y/Z → SIDE
X 左右
◎ TOP
Y 高さ
◎ SIDE
Z 手前奥
◎ 二重取り
水平姿勢
◎ SIDE