Python反向运动学包

Ron*_*kel 1 python robotics inverse-kinematics

我正在使用 arduino 和 6 个伺服电机构建一个具有 6 DOF 的机械臂。

我使用串行通信为自己制作了一个 Python 接口,以便我可以编写:move_motor(angle1=45, angle2=37)伺服电机将相应地移动。

现在我要进入 IK 部分,我正在寻找一个好的包,你可以在其中设置臂长,然后你可以给它(x,y,z,theta),它会返回每个电机的角度。

有没有好的包可用?或者至少是我可以根据自己的需要玩的东西?

Tas*_*ian 5

由于您的问题很简单,我认为最适合您的是通过二次规划 (QP) 解决逆运动学 (IK) 问题。在 Python 中,您可以使用例如 CVXOPT 库(我在此处发布了包含一些代码的教程)在几行代码中解决 QP 。另外,我写了一个在 Python中使用 CVXOPT 作为 QP 求解器的 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)
Run Code Online (Sandbox Code Playgroud)

它基本上通过微分 IK来解决全局 IK 问题(找到关节角度向量“q”),也就是说,通过计算驱动系统向解决方案前进的速度“qd”。它本质上是Levenberg-Marquardt 算法背后的思想。