第一年 · 第10周
第十章:齿轮比与函数嵌套
上周你编写了让机器人移动的函数。本周我们继续使用函数,但从轮子切换到齿轮。通过数小齿轮、中齿轮和大齿轮的齿数,你可以精确预测每个轴转动多少度——再通过函数嵌套调用,只需几行Python就能建模整个机构。
第1部分:三种齿轮
我们使用了三种不同大小的LEGO齿轮,每种齿轮的齿数不同:
SMALL_GEAR = 12 # 12颗齿 MID_GEAR = 20 # 20颗齿 BIG_GEAR = 28 # 28颗齿
齿数就是关键。两个齿轮咬合时,它们交换的是齿,不是度数。每经过一颗齿,两个齿轮都向前走一颗齿的距离——这就是计算输出度数的依据。
第2部分:写出第一个齿轮比函数
从第一种搭配开始:小齿轮(12齿)驱动中齿轮(20齿)。
这个函数回答的问题是:如果我想让中齿轮转 degree 度,电机需要让小齿轮转多少度?
用齿数推导:两个咬合齿轮,通过的齿数相等。
小齿轮转过的齿数 = 中齿轮转过的齿数
SMALL_GEAR × 小齿轮度数 = MID_GEAR × 中齿轮度数
所以:小齿轮度数 = degree × MID_GEAR / SMALL_GEAR
把它写成函数:
def small_drive_mid(degree): # degree = 想让中齿轮转多少度 # 返回值 = 电机(小齿轮)需要转多少度 return int(degree * MID_GEAR / SMALL_GEAR)
测试一下:想让中齿轮转 90 度,电机需要转多少?
print( small_drive_mid(90) ) # 输出:150
90 × 20 ÷ 12 = 150 度。电机(小齿轮)需要转 150 度,才能让中齿轮转 90 度。小齿轮齿少,所以它必须多转一些才能"推动"中齿轮转够目标度数。
现在扩展到其他搭配
每个函数回答同一类问题——"想让从动轮转 X 度,主动轮需要转多少?"——只需换上对应齿数:
def mid_drive_small(degree): # degree = 想让小齿轮转多少度,返回中齿轮需要转多少度 return int(degree * SMALL_GEAR / MID_GEAR) def small_drive_big(degree): # degree = 想让大齿轮转多少度,返回小齿轮需要转多少度 return int(degree * BIG_GEAR / SMALL_GEAR)
mid_drive_small(90) 返回 int(90 × 12/20) = 54:想让小齿轮(12齿)转 90 度,中齿轮(20齿)只需转 54 度——主动轮齿多,转得少就能推够。
第3部分:函数嵌套——多轴爪子
真实的机器人手臂有多个轴(关节)。如果电机驱动轴1,轴1的齿轮又驱动轴2,轴2的齿轮再驱动轴3,该怎么计算?
用函数嵌套!把一个函数的输出直接作为另一个函数的输入:
def claw_3(degree): axis_2 = small_drive_mid(degree) # 轴1→轴2 axis_3 = small_drive_mid(axis_2) # 轴2→轴3(分步写法) return small_drive_mid( small_drive_mid(degree) ) # 一行写法
两种写法结果完全相同。分步写法更容易理解,一行写法更紧凑。选哪种取决于可读性。
第4部分:好的函数名 vs 坏的函数名
我们还讨论了什么是好的函数名。函数名应该像一句简短的说明,告诉读者这个函数做什么——不需要看函数体就能理解。
# 坏的函数名——看不出做什么 def f(d): ... def calc(x): ... def do_thing(n): ... # 好的函数名——一眼就懂 def small_drive_mid(degree): ... def mid_drive_small(degree): ... def claw_3(degree): ...
好的名字包含两个信息:做什么(驱动哪个齿轮)和输入是什么(度数)。当你六个月后再看这段代码,你不需要重新猜测每个函数的作用。
展望未来
本周你学会了用齿数计算齿轮传动,把公式封装成函数,再用函数嵌套模拟多轴机构。这是真实工程中计算机械臂关节角度的基本思路。接下来我们将继续探索如何用Python控制更复杂的机构,并引入条件判断让程序根据传感器数据做出决定。