佐藤さとる

佐藤さとる

梶研 [3次元空間の点を2次元平面に落とし込む]

2024年05月14日

3次元空間の点を2次元平面に落とし込む

出席率

スケジュール

短期的な予定

長期的な予定

進捗報告

梶先生と話した

https://kjlb.esa.io/posts/5528

目的

料理中の動作を mocopi を使ってセンシングする。

このデータから最終的に位置推定を行う。

目標

12月頃の WiNF に出たい

(10月末 論文完成)

前回

平面出せた. 2次元に変換したい

2次元に落とし込むための平面を出す別の案

  1. y軸と並行な腰を通る直線($L_1$)を取る
  2. その直線から最も遠い点($P_1$)を取る
  3. Aから最も遠い点($P_2$)を取る
  4. $L1$ と並行で $P1$ $P2$を結ぶ直線($L2$) と重なる平面を使う

点を2次元平面に落とし込む

今回やりたいのは 射影変換 の中の1つぽい

がある

https://sonson.jp/blog/2006/04/04/opengl-6/

今回は 正射影

最小二乗法を使って平面に落とし込む

# 最小二乗法による平面の推定
Xtil = np.c_[np.ones(len(points)), points[:, 0], points[:, 1]]
A = np.dot(Xtil.T, Xtil)
b = np.dot(Xtil.T, points[:, 2])
w = linalg.solve(A, b)

# 平面の方程式
def plane_eq(x, y):
    return w[0] + w[1] * x + w[2] * y

# 平面上への点の射影
projected_points = np.array([[point[0], point[1], plane_eq(point[0], point[1])] for point in points])
image (1).png (21.9 kB)

z軸を使っていないため違う. そもそも

→ 非連続的になる可能性があるためやめた

例) 腕を直角に伸ばす, 右手先が一番遠い→少しずつ縮めると左手先が一番遠くなった時平面が急激に変化する

---

別の案2

  1. 上記の図でいう xz 平面に落とし込む
  2. xz平面上で近似直線を引く
  3. y軸方向に伸ばして平面にする

二次元で考えれるためとても扱いやすい

近似直線を引く

points = np.array([j["coord"] for j in rotated_coord.values()])
res = np.polyfit(points[:, 0], points[:, 2], 1)

y = np.poly1d(res)(points[:, 0])

plt.scatter(points[:, 0], points[:, 2], label="元データ")
plt.plot(points[:, 0], y, label="1次")
plt.xlim(-60, 60)
plt.ylim(-20, 20)
plt.show()
image.png (19.7 kB)

直線上に射影した

image.png (13.5 kB)

縮尺を統一

! image.png (19.8 kB) ! image.png (14.9 kB)

ミスってそう

自分でコードを書いてみた

image.png (15.4 kB)

明らかに違う

中学数学を学び直した

https://www.nekonecode.com/math-lab/pages/collision2/point-and-segment-nearest/

https://www.try-it.jp/chapters-6533/sections-6534/lessons-6575/

https://manabitimes.jp/math/1137

<p style="font-size: 8px">アフィン変換すごい</p>

数学は理解したので、Python で書いているところ

進路関係

余談

プロジェクト演習やってます

! image.png (51.6 kB) ! image-1.png (227.0 kB)

code.png (281.5 kB)