あなたの問題は非常に単純なので、二次計画法 (QP) によって逆運動学 (IK) 問題を解くのが最善だと思います。Python では、CVXOPT ライブラリなどを使用して、数行のコードで QP を解くことができます (ここにいくつかのコードを含むチュートリアルを公開しました)。また、CVXOPT を QP ソルバーとして使用する Python の IK ソルバーの例を書きました。目の前の問題よりも複雑ですが、インスピレーションを得るために見てみることができます。
便利な部分は次の関数です。
def compute_velocity(self, q, qd):
P = zeros(self.I.shape)
r = zeros(self.q_max.shape)
for obj in self.objectives:
J = obj.jacobian(q)
P += obj.weight * dot(J.T, J)
r += obj.weight * dot(-obj.velocity(q, qd).T, J)
if self.K_doflim is not None:
qd_max = minimum(self.qd_max, self.K_doflim * (self.q_max - q))
qd_min = maximum(self.qd_min, self.K_doflim * (self.q_min - q))
else:
qd_max = self.qd_max
qd_min = self.qd_min
G = vstack([+self.I, -self.I])
h = hstack([qd_max, -qd_min])
if self.constraints:
A = vstack([c.jacobian() for c in self.constraints])
b = hstack([c.velocity() for c in self.constraints])
return cvxopt_solve_qp(P, r, G, h, A, b)
return cvxopt_solve_qp(P, r, G, h)
これは基本的に、グローバル IK 問題 (関節角度ベクトル 'q' を見つける) を微分 IKによって、つまり、システムを解に向かって駆動する速度 'qd' を計算することによって解決します。これは本質的に、Levenberg-Marquardt アルゴリズムの背後にある考え方です。