AI for Youth Academy 青少年AI研究计划

第一年 · 第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控制更复杂的机构,并引入条件判断让程序根据传感器数据做出决定。