利用 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