

四连杆机构是机构学里最经典的模型之一。它看起来只是四根杆,但真正做仿真时,我们关心的不是“它长什么样”,而是:
当主动曲柄转到某个角度时,其他杆件的位置到底怎么确定?
这篇先不用 Adams,也不用 Motion,只用最基础的几何约束和 Python,把四连杆的位置求出来。
这里使用一个平面四连杆:
A、D 是固定铰点,也就是机架两端。
AB 是主动曲柄。
BC 是连杆。
CD 是摇杆。
我们给定四个长度:
AD = ground
AB = crank
BC = coupler
CD = rocker
当曲柄角度 theta 已知时,B 点位置可以直接求出来:
B = A + crank * [cos(theta), sin(theta)]
真正的问题是:C 点在哪里?

C 点必须同时满足两个条件:
|C - B| = coupler
|C - D| = rocker
也就是说:
C 点在“以 B 为圆心、连杆长度为半径”的圆上。
C 点也在“以 D 为圆心、摇杆长度为半径”的圆上。
所以四连杆的位置求解,可以转化为一个很直观的问题:
求两个圆的交点。
两个圆一般会有两个交点,对应机构的两种装配姿态。实际建模时,我们根据当前需要选择上方交点或者下方交点。
核心逻辑可以压缩成这几步:
def solve_four_bar(theta):
A = np.array([0.0, 0.0])
D = np.array([ground, 0.0])
B = A + crank * np.array([cos(theta), sin(theta)])
C_top, C_bottom = circle_intersections(B, coupler, D, rocker)
C = C_top if C_top[1] >= C_bottom[1] else C_bottom
return A, B, C, D
完整代码里还需要处理一些边界情况,比如:
两个圆没有交点。
两个圆相切。
两个圆重合或距离过近。
这些情况在机构设计里不是“程序异常”那么简单,它们往往对应机构尺寸不合理、运动范围受限、接近死点等问题。
我们把曲柄角度 theta 从 0 扫到 360 度,每一个角度都求一次 A、B、C、D 的位置。
如果把每一帧画出来,就得到机构动画;如果把 C 点连起来,就得到中间铰点的轨迹。

从结果里可以看到:
C 点轨迹不是简单直线。
摇杆不是匀速摆动。
机构运动范围会受到杆长组合限制。
后续可以继续分析速度、加速度、传动角和死点。
四连杆仿真不是为了画一个会动的图,而是为了回答工程问题:
这个机构能不能完成目标行程?
有没有死点或卡滞风险?
传动角是否太小?
输出运动是否足够平稳?
改变某根杆长后,轨迹会怎么变?
很多仿真软件的底层,本质上也是在解这些约束关系。区别只是软件把建模、求解、可视化封装好了。
但如果我们自己能写出最基础的位置求解,就更容易理解软件结果为什么是这样,也更容易判断仿真有没有问题。
这一篇只解决位置问题。
下一篇可以继续基于这个模型,分析:
B 点和 C 点速度。
摇杆角速度。
机构加速度。
传动角。
接近死点时的运动特征。
如果你想继续看,我会把这个系列做成《100 个机构仿真案例》。
第 001 篇:四连杆位置求解。 第 002 篇:四连杆速度、加速度和传动角。