利用 Onshape 與 V-rep 驗證 inverse kinematics.pdf 之運算結果
IKBT: https://arxiv.org/pdf/1711.05412.pdf
Robot Manipulators and Control Systems.pdf
Kinematic Analysis and Design of 3dof robot.pdf
https://sajidnisar.github.io/posts/python_kinematics_dh
http://royfeatherstone.org/spatial/
https://github.com/NiryoRobotics/niryo_one



https://www.poppy-project.org/en/
https://github.com/poppy-project/pypot

參考連結:
http://www.coppeliarobotics.com/helpFiles/en/inverseKinematicsTutorial.htm
http://www.coppeliarobotics.com/helpFiles/en/basicsOnIkGroupsAndIkElements.htm
http://www.coppeliarobotics.com/helpFiles/en/inverseKinematicsModule.htm
https://www.cnblogs.com/21207-iHome/p/7420733.html
https://github.com/KmolYuan/Pyslvs-PyQt5
https://github.com/mdecourse/kll3pp
http://rattlecad.sourceforge.net/
https://github.com/KmolYuan/python-solvespace
在近端利用 Msys2 編譯 GCS 動態程式庫, 之後建立 Python 呼叫範例.
在 Github 嘗試利用 https://travis-ci.org/ 進行整合.
tinycadlib 程式庫研究: https://github.com/KmolYuan/pyslvs/blob/master/src/tinycadlib.pyx
四連桿運動模擬
from math import pi, cos, sin, sqrt, acos
import matplotlib.pyplot as plt
radian = 180/pi
degree = pi/180
#PLAP
def plap(ax, ay, ac, bac, bx, by, pos):
if pos == 0:
cx= ac*cos(bac - acos((ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 + abs(ax - bx)**2 - abs(ay - by)**2)/(2*sqrt(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2)*abs(ax - bx)))) + ax
cy= ac*sin(bac - acos((ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 + abs(ax - bx)**2 - abs(ay - by)**2)/(2*sqrt(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2)*abs(ax - bx)))) + ay
else:
cx= ac*cos(bac + acos((ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 + abs(ax - bx)**2 - abs(ay - by)**2)/(2*sqrt(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2)*abs(ax - bx)))) + ax
cy= ac*sin(bac + acos((ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 + abs(ax - bx)**2 - abs(ay - by)**2)/(2*sqrt(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2)*abs(ax - bx)))) + ay
return cx, cy
#PLLP
def pllp(ax, ay, ac, cb, bx, by, pos):
if pos == 0:
cx = -((ay - by)*(-ac**2*ay + ac**2*by + ax**2*ay + ax**2*by - 2*ax*ay*bx - 2*ax*bx*by + ay**3 - ay**2*by + ay*bx**2 - ay*by**2 + ay*cb**2 + bx**2*by + by**3 - by*cb**2 - sqrt((-ac**2 + 2*ac*cb + ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 - cb**2)*(ac**2 + 2*ac*cb - ax**2 + 2*ax*bx - ay**2 + 2*ay*by - bx**2 - by**2 + cb**2))*(ax - bx)) + (ac**2 - ax**2 - ay**2 + bx**2 + by**2 - cb**2)*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))/(2*(ax - bx)*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))
cy = (-ac**2*ay + ac**2*by + ax**2*ay + ax**2*by - 2*ax*ay*bx - 2*ax*bx*by + ay**3 - ay**2*by + ay*bx**2 - ay*by**2 + ay*cb**2 + bx**2*by + by**3 - by*cb**2 + sqrt((-ac**2 + 2*ac*cb + ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 - cb**2)*(ac**2 + 2*ac*cb - ax**2 + 2*ax*bx - ay**2 + 2*ay*by - bx**2 - by**2 + cb**2))*(-ax + bx))/(2*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))
else:
cx = -((ay - by)*(-ac**2*ay + ac**2*by + ax**2*ay + ax**2*by - 2*ax*ay*bx - 2*ax*bx*by + ay**3 - ay**2*by + ay*bx**2 - ay*by**2 + ay*cb**2 + bx**2*by + by**3 - by*cb**2 + sqrt((-ac**2 + 2*ac*cb + ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 - cb**2)*(ac**2 + 2*ac*cb - ax**2 + 2*ax*bx - ay**2 + 2*ay*by - bx**2 - by**2 + cb**2))*(ax - bx)) + (ac**2 - ax**2 - ay**2 + bx**2 + by**2 - cb**2)*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))/(2*(ax - bx)*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))
cy = (-ac**2*ay + ac**2*by + ax**2*ay + ax**2*by - 2*ax*ay*bx - 2*ax*bx*by + ay**3 - ay**2*by + ay*bx**2 - ay*by**2 + ay*cb**2 + bx**2*by + by**3 - by*cb**2 + sqrt((-ac**2 + 2*ac*cb + ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2 - cb**2)*(ac**2 + 2*ac*cb - ax**2 + 2*ax*bx - ay**2 + 2*ay*by - bx**2 - by**2 + cb**2))*(ax - bx))/(2*(ax**2 - 2*ax*bx + ay**2 - 2*ay*by + bx**2 + by**2))
return cx, cy
def crank_rocker(angle, p1x, p1y, p2x, p2y, len1, len2, len3, len4, len5):
p4x, p4y = plap(p1x, p1y, len1, angle, p2x, p2y, 0)
#print("cx=", cx, "cy=", cy)
p5x, p5y = pllp(p4x, p4y, len2, len3, p2x, p2y, 0)
#print("dx=", dx, "dy=", dy)
p3x, p3y = pllp(p4x, p4y, len4, len5, p5x, p5y, 0)
#print("ex=", ex, "ey=", ey)
return p3x, p3y
#主程式
Xval = []
Yval = []
inc = 5
for i in range(0, 360+inc, inc):
try:
p3x, p3y = crank_rocker(i*degree, 0, 0, 90, 0, 35, 70, 70, 40, 40)
Xval += [p3x]
Yval += [p3y]
print(i, ":", round(p3x, 4), round(p3y, 4))
except:
pass
print ("Solve Completed")
plt.plot(Xval, Yval)
plt.xlabel('x coordinate')
plt.ylabel('y coordinate')
#plt.title("Involute - "+str(degree)+" deg")
plt.show()
上述四連桿運動模擬, 採用 Solvespace GCS 動態連結程式庫執行運算: sgcs_2_1_py3.7.1.7z (使用可攜 Python 3.7.1 進行測試)
https://github.com/AliShug/EvoArm
Automated Configuration Analysis of Planar Eight-Bar Linkages.pdf
Automated Generation of Linkage Loop Equations for Planar One Degree-of-Freedom Linkages.pdf
Automated Synthesis of Planar Mechanisms with Revolute, Prismatic and Pin-In-Slot Joints.pdf