我正在使用arduino和6个伺服电机构建一个6自由度机械臂。
我使用串行通信创建了一个Python接口,这样我就可以编写:move_motor(angle1=45, angle2=37)
并且伺服电机会相应地移动。
现在我要进入IK部分,我正在寻找一个设置臂长的好包装,然后你可以给它(x,y,z,theta)
它将返回每个马达的角度。
有没有好的套餐?或者至少我可以为我的需求玩些什么?
答案 0 :(得分:3)
由于您的问题非常简单,我认为最适合您的是通过二次规划(QP)解决逆运动学(IK)问题。在Python中,您可以使用例如几行代码解决QP问题。 CVXOPT库(我发表了a tutorial with some code here)。另外,我写的是使用CVXOPT作为QP求解器的an example of IK solver in Python。它比手头的问题更复杂,但你可以看看它的灵感。
有用的部分是这个功能:
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 来解决全局IK问题(找到关节角矢量' q'),也就是说,通过计算速度来解决问题。 QD'这促使系统走向解决方案。这基本上是Levenberg-Marquardt algorithm背后的想法。