四连杆机构到底怎么跑起来?从几何约束到 Python 仿真
机构仿真实验室
编辑于 2026年05月30日 15:23

四连杆机构是机构学里最经典的模型之一。它看起来只是四根杆,但真正做仿真时,我们关心的不是“它长什么样”,而是:

当主动曲柄转到某个角度时,其他杆件的位置到底怎么确定?

这篇先不用 Adams,也不用 Motion,只用最基础的几何约束和 Python,把四连杆的位置求出来。

1. 先定义一个四连杆

这里使用一个平面四连杆:

  • A、D 是固定铰点,也就是机架两端。

  • AB 是主动曲柄。

  • BC 是连杆。

  • CD 是摇杆。

我们给定四个长度:

代码块
PlainText
自动换行
复制代码
AD = ground
AB = crank
BC = coupler
CD = rocker
复制成功

当曲柄角度 theta 已知时,B 点位置可以直接求出来:

代码块
PlainText
自动换行
复制代码
B = A + crank * [cos(theta), sin(theta)]
复制成功

真正的问题是:C 点在哪里?

2. C 点其实是两个圆的交点

C 点必须同时满足两个条件:

代码块
PlainText
自动换行
复制代码
|C - B| = coupler
|C - D| = rocker
复制成功

也就是说:

  • C 点在“以 B 为圆心、连杆长度为半径”的圆上。

  • C 点也在“以 D 为圆心、摇杆长度为半径”的圆上。

所以四连杆的位置求解,可以转化为一个很直观的问题:

求两个圆的交点。

两个圆一般会有两个交点,对应机构的两种装配姿态。实际建模时,我们根据当前需要选择上方交点或者下方交点。

3. 核心代码

核心逻辑可以压缩成这几步:

代码块
Python
自动换行
复制代码
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
复制成功

完整代码里还需要处理一些边界情况,比如:

  • 两个圆没有交点。

  • 两个圆相切。

  • 两个圆重合或距离过近。

这些情况在机构设计里不是“程序异常”那么简单,它们往往对应机构尺寸不合理、运动范围受限、接近死点等问题。

4. 把角度扫一圈,机构就动起来了

我们把曲柄角度 theta 从 0 扫到 360 度,每一个角度都求一次 A、B、C、D 的位置。

如果把每一帧画出来,就得到机构动画;如果把 C 点连起来,就得到中间铰点的轨迹。

从结果里可以看到:

  • C 点轨迹不是简单直线。

  • 摇杆不是匀速摆动。

  • 机构运动范围会受到杆长组合限制。

  • 后续可以继续分析速度、加速度、传动角和死点。

5. 这件事的工程意义

四连杆仿真不是为了画一个会动的图,而是为了回答工程问题:

  • 这个机构能不能完成目标行程?

  • 有没有死点或卡滞风险?

  • 传动角是否太小?

  • 输出运动是否足够平稳?

  • 改变某根杆长后,轨迹会怎么变?

很多仿真软件的底层,本质上也是在解这些约束关系。区别只是软件把建模、求解、可视化封装好了。

但如果我们自己能写出最基础的位置求解,就更容易理解软件结果为什么是这样,也更容易判断仿真有没有问题。

6. 下一篇准备做什么

这一篇只解决位置问题。

下一篇可以继续基于这个模型,分析:

  • B 点和 C 点速度。

  • 摇杆角速度。

  • 机构加速度。

  • 传动角。

  • 接近死点时的运动特征。

如果你想继续看,我会把这个系列做成《100 个机构仿真案例》。

第 001 篇:四连杆位置求解。 第 002 篇:四连杆速度、加速度和传动角。