手臂的推導角度公式
角度推導公式
先用圖解法解,再來用python-solvespace 來驗證點坐標是否相符
底下是程式碼,可以跑出所有結果
from slvs import *
from math import *
def arm(degree1, degree2):
    sys = System(500)
    g = 1
    #原點Point0
    p0 = sys.add_param(0.0)
    p1 = sys.add_param(0.0)
    p2 = sys.add_param(0.0)
    Point0 = Point3d(p0, p1, p2)
    #XY法線
    qw, qx, qy, qz = Slvs_MakeQuaternion(1, 0, 0, 0, 1, 0)
    p3 = sys.add_param(qw)
    p4 = sys.add_param(qx)
    p5 = sys.add_param(qy)
    p6 = sys.add_param(qz)
    Normal1 = Normal3d(p3, p4, p5, p6)
    #工作平面
    Workplane1 = Workplane(Point0, Normal1)
    #3D版的Point0=>Point1
    p7 = sys.add_param(0.0)
    p8 = sys.add_param(0.0)
    Point1 = Point2d(Workplane1, p7, p8)
    Constraint.dragged(Workplane1, Point1)
    #Point2
    p9 = sys.add_param(10.0)
    p10 = sys.add_param(10.0)
    Point2 = Point2d(Workplane1, p9, p10)
    p11 = sys.add_param(-20.0)
    p12 = sys.add_param(20.0)
    Point3 = Point2d(Workplane1, p11, p12)
    p13 = sys.add_param(-30.0)
    p14 = sys.add_param(15.0)
    Point4 = Point2d(Workplane1, p13, p14)
    p15 = sys.add_param(-40.0)
    p16 = sys.add_param(10.0)
    Point5 = Point2d(Workplane1, p15, p16)
    #基線點
    p17 = sys.add_param(10.0)
    p18 = sys.add_param(0.0)
    Point6 = Point2d(Workplane1, p17, p18)
    Constraint.dragged(Workplane1, Point6)
    Line0 = LineSegment2d(Workplane1, Point1, Point6)
    Constraint.distance(55, Workplane1, Point1, Point2)
    Constraint.distance(135, Workplane1, Point2, Point3)
    Constraint.distance(55, Workplane1, Point3, Point4)
    Constraint.distance(145, Workplane1, Point4, Point5)
    Constraint.distance(135, Workplane1, Point4, Point1)
    Line1 = LineSegment2d(Workplane1, Point1, Point2)
    Line2 = LineSegment2d(Workplane1, Point3, Point4)
    Line3 = LineSegment2d(Workplane1, Point1, Point4)
    Constraint.on(Workplane1, Point5, Line2)
    Constraint.angle(Workplane1, degree1, Line0,  Line3, False)
    Constraint.angle(Workplane1, degree2, Line0,  Line1, False)
    sys.solve()
    if (sys.result == SLVS_RESULT_OKAY):
        print ("點座標:")
        print(("P5(%.3f %.3f %.3f)")%(sys.get_param(15).val, sys.get_param(16).val, sys.get_param(2).val))
        print(("P4(%.3f %.3f %.3f)")%(sys.get_param(13).val, sys.get_param(14).val, sys.get_param(2).val))
        #print(("P3(%.3f %.3f %.3f)")%(sys.get_param(11).val, sys.get_param(12).val, sys.get_param(2).val))
        #print(("P2(%.3f %.3f %.3f)")%(sys.get_param(9).val, sys.get_param(10).val, sys.get_param(2).val))
        print ("%d DOF" % sys.dof)
    elif (sys.result == SLVS_RESULT_INCONSISTENT):
        print ("solve failed")
        print ("SLVS_RESULT_INCONSISTENT")
        print ("%d DOF" % sys.dof)
        for i in range(sys.faileds):
            print(" %lu", sys.failed[i]);
    elif (sys.result == SLVS_RESULT_DIDNT_CONVERGE):
        print ("solve failed")
        print ("SLVS_RESULT_DIDNT_CONVERGE")
        print ("%d DOF" % sys.dof)
    elif (sys.result == SLVS_RESULT_TOO_MANY_UNKNOWNS):
        print ("solve failed")
        print ("SLVS_RESULT_TOO_MANY_UNKNOWNS")
        print ("%d DOF" % sys.dof)
#主程式
#限制範圍內的角度的所有組合
for i in range(90, 151):
    for j in range(0, 61):
        print (i,j)
        arm(i, j)
下圖的連桿是可以跑的最大角度範圍
底下是隨機抓取在限制範圍內的角度
Comments
comments powered by Disqus