第1章:Python基础回顾
各位工程师朋友,咱们开始之前,我先说句实在话。做凸轮曲线设计,光会机械理论是不够的。你得会编程,得会用工具把想法快速验证出来。这一章,我就带你快速过一遍Python的基础环境配置和两个最常用的库。别担心,咱们不搞学院派那套,怎么实用怎么来。
1.1 Python环境配置——别在这卡住
我个人习惯用Anaconda来管理Python环境。为什么?因为省心。你想想看,搞凸轮设计要装NumPy、SciPy、Matplotlib这些库,一个一个装多麻烦。Anaconda一次性全给你打包好了。
安装步骤其实就三步:
- 去Anaconda官网下载对应系统的安装包
- 一路默认安装,记得勾选「Add Anaconda to my PATH environment variable」
- 打开终端或Anaconda Prompt,输入
python --version验证
装好之后,我建议你创建一个专门的项目环境。在终端里敲:
conda create -n cam_design python=3.9
conda activate cam_design
pip install numpy matplotlib scipy
嗯,这里要注意。每次打开新终端,记得先 conda activate cam_design。不然你装的库全白费。
1.2 NumPy快速入门——凸轮计算的核心
NumPy说白了就是Python里的数学引擎。咱们做凸轮曲线,位移、速度、加速度、跃度,全是数组运算。没有NumPy,你写个循环算1000个点,电脑得卡半天。
最常用的几个操作:
- 创建数组:
np.array([1,2,3])或np.linspace(0, 2*np.pi, 1000) - 数学运算: 直接加减乘除,比如
s = a * t + b - 三角函数:
np.sin(),np.cos()—— 凸轮曲线里天天用
举个例子,生成一个简单的正弦加速度曲线:
import numpy as np
theta = np.linspace(0, 2*np.pi, 1000) # 凸轮转角,0到360度
s = 0.5 * (1 - np.cos(theta)) # 正弦加速度位移曲线
# 速度是位移的一阶导数
v = np.gradient(s, theta[1] - theta[0])
# 加速度是二阶导数
a = np.gradient(v, theta[1] - theta[0])
我在项目中遇到过一个问题:直接用 np.gradient 算导数,边界点会有误差。后来我改用中心差分法,边界用前向和后向差分,精度高不少。这个后面讲凸轮曲线评价时会细说。
1.3 Matplotlib快速入门——把曲线画出来
光有数据不行,你得看得见。Matplotlib就是干这个的。咱们做凸轮设计,位移曲线、速度曲线、加速度曲线,甚至极坐标下的凸轮轮廓,都得靠它可视化。
画图三板斧:
import matplotlib.pyplot as plt
# 1. 创建画布和子图
fig, ax = plt.subplots(figsize=(8, 4))
# 2. 画数据
ax.plot(theta, s, label='位移', linewidth=2)
ax.plot(theta, v, label='速度', linestyle='--')
ax.plot(theta, a, label='加速度', linestyle=':')
# 3. 加标签和网格
ax.set_xlabel('凸轮转角 (rad)')
ax.set_ylabel('值')
ax.legend()
ax.grid(True, alpha=0.3)
plt.show()
你想想看,如果不用Matplotlib,你只能看一堆数字。但画成图,一眼就能看出加速度有没有突变,有没有冲击。这就是可视化的价值。
🔑 核心要点: 凸轮曲线设计里,我习惯把位移、速度、加速度画在同一张图上,用不同线型区分。这样能直观看到运动规律是否平滑。加速度曲线如果有尖角,说明有冲击,得改曲线类型。
1.4 面向对象编程基础——把凸轮曲线封装起来
面向对象编程,说白了就是把数据和操作数据的方法打包在一起。咱们做凸轮设计,一个凸轮曲线有类型、有参数、有计算方法。用类来管理,比写一堆散乱的函数强多了。
一个简单的凸轮曲线类:
class CamCurve:
"""凸轮曲线基类"""
def __init__(self, name, start_angle, end_angle, lift):
self.name = name
self.start_angle = start_angle
self.end_angle = end_angle
self.lift = lift
self.theta = None
self.s = None
self.v = None
self.a = None
def calculate(self, num_points=1000):
"""计算位移、速度、加速度——子类实现"""
raise NotImplementedError("子类必须实现此方法")
def plot(self):
"""绘制曲线"""
if self.theta is None:
print("请先调用 calculate() 方法")
return
plt.figure(figsize=(8, 4))
plt.plot(self.theta, self.s, label='位移')
plt.plot(self.theta, self.v, label='速度')
plt.plot(self.theta, self.a, label='加速度')
plt.legend()
plt.grid(True)
plt.title(f'{self.name} 曲线')
plt.show()
class SineAccelCurve(CamCurve):
"""正弦加速度曲线"""
def calculate(self, num_points=1000):
self.theta = np.linspace(self.start_angle, self.end_angle, num_points)
beta = self.end_angle - self.start_angle
# 正弦加速度位移公式
self.s = self.lift * (self.theta / beta - np.sin(2*np.pi*self.theta/beta) / (2*np.pi))
self.v = np.gradient(self.s, self.theta[1] - self.theta[0])
self.a = np.gradient(self.v, self.theta[1] - self.theta[0])
用的时候很简单:
curve = SineAccelCurve("推程正弦加速度", 0, np.pi, 50)
curve.calculate()
curve.plot()
CamCurve,重写 calculate 方法就行。这就是「开闭原则」——对扩展开放,对修改关闭。
1.5 本章知识体系
下面这张图,是我自己总结的本章知识结构。你看一遍,心里就有数了。
这张图你看懂了吗?从上到下,环境配置是地基,NumPy和Matplotlib是左右手,面向对象是组织方式。最终都指向凸轮曲线参数化设计这个目标。
公众号:蓝海资料掘金营,微信deep3321