ROS2机器人少年创客营:Python第三课
课程名称
机器人的工具箱------函数与模块化思维
课程目标
- 理解函数概念:学会将重复的代码块封装成"工具",理解"一次编写,多次调用"的优势。
- 掌握参数传递:理解如何给函数"喂料"(输入参数),让同一个工具处理不同的任务。
- 理解返回值:学会从函数中获取处理结果,打通数据流动的闭环。
- 建立模块化思维:初步接触"分而治之"的编程思想,为ROS2的"节点"概念做铺垫。
核心内容
为什么要用函数?
- 痛点分析 :
- 如果你要让机器人走一个正方形,你需要写4次"前进"和4次"转弯"。
- 如果要把正方形改成六边形,你得复制粘贴更多代码。
- 如果"转弯"的逻辑变了(比如要转得更平滑),你得修改8个地方。太麻烦了!
- 函数的定义 :
- 比喻:函数就是给机器人的一套"专用工具"或"必杀技"。
- 例子 :你不需要每次都告诉机器人"抬腿、前伸、下压、摩擦地面",你只需要定义一个工具叫
走路()。 - 好处:代码复用、易于修改、逻辑清晰。
定义与调用:制造工具与使用工具
- 定义函数(制造工具) :
-
使用
def关键字。 -
语法 :
pythondef 工具名称(): # 这里写具体的步骤 print("正在执行任务...") -
注意:定义时,工具不会立刻运行,只是被"存"进了工具箱里。
-
- 调用函数(使用工具) :
- 语法 :
工具名称()。 - 场景:当你需要执行任务时,喊出工具的名字,它就会工作。
- 语法 :
参数:让工具更灵活
- 概念 :
- 如果只有一个
做咖啡()函数,它只能做一种口味。 - 加上参数:
做咖啡(糖量, 水量)。这样同一个函数,根据你给的参数不同,能做出不同的咖啡。
- 如果只有一个
- ROS2关联 :
- 以后我们会写一个
转向(角度)的函数。告诉它90度,它就转90度;告诉它180度,它就转180度。
- 以后我们会写一个
返回值:不仅仅是执行,还要反馈
- 概念 :
- 你给洗衣机(函数)衣服和水(参数),它洗完后会给你一个结果:洗干净的衣服。
- 在编程中,这就是
return。
- 应用 :
- 函数
计算距离(起点, 终点),最后return一个数字,告诉你具体多少米。
- 函数
实践环节
任务:打造"万能绘图仪"
-
场景:我们要控制海龟(机器人)画图形。不要直接写移动代码,而是先制造"画笔工具"。
-
步骤1:定义基础工具
- 定义一个函数
draw_square(边长)。 - 在函数内部,使用
for循环(复习第二课),让机器人前进边长,然后右转90度,重复4次。
- 定义一个函数
-
步骤2:定义高级工具
- 定义一个函数
draw_polygon(边数, 边长)。 - 利用数学知识(360度除以边数),计算每次转弯的角度。
- 定义一个函数
-
步骤3:调用与组合
- 在主程序中,依次调用这些工具:
draw_square(100)------ 画一个大正方形。draw_polygon(6, 50)------ 画一个六边形。draw_polygon(3, 80)------ 画一个三角形。
- 在主程序中,依次调用这些工具:
-
代码示例 :
pythonimport time # 引入时间库,为了演示效果 # 模拟机器人动作的函数(代替真实的硬件控制) def move_forward(distance): print(f" 前进 {distance} 米") time.sleep(1) # 模拟耗时 def turn_right(angle): print(f" 右转 {angle} 度") time.sleep(0.5) # --- 定义我们的万能工具 --- def draw_square(size): print(f"--- 开始画正方形,边长: {size} ---") for i in range(4): move_forward(size) turn_right(90) print(" 正方形画完!\n") def draw_polygon(sides, size): print(f"--- 开始画多边形,边数: {sides}, 边长: {size} ---") # 计算每次转弯的角度:360 / 边数 angle = 360 / sides for i in range(sides): move_forward(size) turn_right(angle) print(f" {sides}边形画完!\n") # --- 主程序:像搭积木一样使用工具 --- print(" 机器人绘图系统启动...") # 任务1:画个小的正方形 draw_square(50) # 任务2:画个六边形 draw_polygon(6, 40) # 任务3:画个大的正方形 draw_square(100) print(" 所有绘图任务完成!")
课后总结
今天我们学会了"偷懒"的智慧。通过函数,我们将复杂的动作打包成了简单的指令。在ROS2中,每一个"节点"其实就是一个超级复杂的函数集合。掌握了函数,你就掌握了模块化编程的钥匙。
课后思考
如果我们把draw_square函数写在另一个文件里,现在的程序还能用吗?(引出下节课的内容:模块与库的导入)。