ROS2机器人少年创客营:Python第三课

ROS2机器人少年创客营:Python第三课

课程名称

机器人的工具箱------函数与模块化思维

课程目标
  • 理解函数概念:学会将重复的代码块封装成"工具",理解"一次编写,多次调用"的优势。
  • 掌握参数传递:理解如何给函数"喂料"(输入参数),让同一个工具处理不同的任务。
  • 理解返回值:学会从函数中获取处理结果,打通数据流动的闭环。
  • 建立模块化思维:初步接触"分而治之"的编程思想,为ROS2的"节点"概念做铺垫。
核心内容

为什么要用函数?

  • 痛点分析
    • 如果你要让机器人走一个正方形,你需要写4次"前进"和4次"转弯"。
    • 如果要把正方形改成六边形,你得复制粘贴更多代码。
    • 如果"转弯"的逻辑变了(比如要转得更平滑),你得修改8个地方。太麻烦了!
  • 函数的定义
    • 比喻:函数就是给机器人的一套"专用工具"或"必杀技"。
    • 例子 :你不需要每次都告诉机器人"抬腿、前伸、下压、摩擦地面",你只需要定义一个工具叫走路()
    • 好处:代码复用、易于修改、逻辑清晰。

定义与调用:制造工具与使用工具

  • 定义函数(制造工具)
    • 使用def关键字。

    • 语法

      python 复制代码
      def 工具名称():
          # 这里写具体的步骤
          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) ------ 画一个三角形。
  • 代码示例

    python 复制代码
    import 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函数写在另一个文件里,现在的程序还能用吗?(引出下节课的内容:模块与库的导入)。

相关推荐
清水白石0084 小时前
Python 编程实战全景:从基础语法到插件架构、异步性能与工程最佳实践
开发语言·python·架构
Robot_Nav4 小时前
LV-DOT —— 用于自主机器人导航的激光雷达-视觉动态障碍物检测与跟踪文献解读
机器人·目标检测与跟踪·lv-dot
yaoxin5211235 小时前
390. Java IO API - WatchDir 示例
java·前端·python
武帝为此6 小时前
【数据清洗缺失值处理】
python·算法·数学建模
zhangchaoxies6 小时前
如何在 Go 中安全复制接口指针所指向的值
jvm·数据库·python
曲幽6 小时前
FastAPI + Pydantic 模型终极实战手册:从能跑就行到固若金汤,这些技巧你一定用得上
python·fastapi·web·model·field·pydantic·validator·basemodel
Halo_tjn6 小时前
Java 基于字符串相关知识点
java·开发语言·算法
梦想的颜色6 小时前
java 利用redis来限制用户频繁点击
java·开发语言
报错小能手6 小时前
Swift 并发 Combine响应式框架
开发语言·ios·swift
计算机软件程序设计7 小时前
Python Flask工程目录解读
python·flask·工程目录解读