代码解析:Jupyter interact 四个滑块控制 PWM 舵机

python

运行

from ipywidgets import interact, widgets

interact(pwm_servo, 
         S1=widgets.IntSlider(min=0,max=180,step=1,value=90), 
         S2=widgets.IntSlider(min=0,max=180,step=1,value=90), 
         S3=widgets.IntSlider(min=0,max=180,step=1,value=90), 
         S4=widgets.IntSlider(min=0,max=180,step=1,value=90));

整体功能

在 Jupyter Notebook / JupyterLab 页面生成4 个拖动滑块,分别对应 4 路 PWM 舵机 S1、S2、S3、S4。 拖动任意一个滑块,就会自动调用函数 pwm_servo(),把 4 个滑块的实时角度传入函数,完成舵机角度控制。


逐部分拆解

1. interact()

interact 是 ipywidgets 的交互式装饰 / 调用函数。

  • 第一个参数:回调函数名称 pwm_servo

⚠️重点:你的代码必须提前定义函数:

python

运行

def pwm_servo(S1, S2, S3, S4):
    # S1~S4就是滑块传过来的角度 0~180
    print(f"S1:{S1}, S2:{S2}, S3:{S3}, S4:{S4}")
    # 在这里写底层:把角度转为PWM占空比,输出到舵机硬件

interact 会自动生成 UI 控件;滑块发生变化时,立刻调用 pwm_servo(S1=xx,S2=xx,S3=xx,S4=xx)

2. S1=widgets.IntSlider(...)

每一行定义一个整数滑块,参数含义:

表格

参数 含义
min=0 舵机最小角度 0°
max=180 舵机最大角度 180°(SG90 类 PWM 舵机标准范围)
step=1 拖动步长,每次变化 1 度
value=90 滑块初始默认位置,舵机上电居中 90°

S1,S2,S3,S4参数名必须和回调函数 pwm_servo 的形参名字一一对应

名字写错,会直接报错,interact 无法传参。

3. 末尾分号 ;

Jupyter 语法:抑制组件对象的多余打印输出,只渲染 UI 滑块,不输出控件对象文本。

完整执行链路

plaintext

网页拖动滑块S1~S4 → interact捕获滑块数值变化 → 自动调用 pwm_servo(S1=val1,S2=val2,S3=val3,S4=val4)
→ 在pwm_servo函数内部:角度 → PWM脉冲换算 → 硬件输出给舵机

关键工程坑点(ROSMASTER‑M1 Jupyter 环境)

  1. pwm_servo函数必须提前定义,4 个形参 S1,S2,S3,S4 不能少,顺序名字必须匹配

python

运行

#错误示例:参数名字对不上
def pwm_servo(a,b,c,d): # 名字S1/S2/S3/S4不匹配,interact直接报错
    pass
  1. 滑块输出是角度 0‑180 整数,不是 PWM 占空比!转化成占空比是运动控制板的职责。

SG90 舵机需要把角度换算成 PWM 高电平时间: 0°→500us,90°→1500us,180°→2500us。 pwm_servo函数内部要做换算,不能直接把角度当做 PWM 输出。

示例换算片段:

python

运行

def angle_to_pulse(angle):
    # 0~180度映射500~2500us
    return int(500 + (angle / 180) * 2000)
  1. ipywidgets 环境问题:ROSMASTER‑M1 的 jupyter 如果不显示滑块界面 需要确认 jupyterlab ipywidgets 插件完整安装。

最简完整可运行示例(直接复制到 jupyter)

python

运行

from ipywidgets import interact, widgets

def pwm_servo(S1, S2, S3, S4):
    print(f"S1={S1}°, S2={S2}°, S3={S3}°, S4={S4}°")
    # 此处增加硬件PWM输出代码

interact(pwm_servo,
         S1=widgets.IntSlider(min=0,max=180,step=1,value=90,description="舵机1"),
         S2=widgets.IntSlider(min=0,max=180,step=1,value=90,description="舵机2"),
         S3=widgets.IntSlider(min=0,max=180,step=1,value=90,description="舵机3"),
         S4=widgets.IntSlider(min=0,max=180,step=1,value=90,description="舵机4"));

增加description参数,滑块前面显示中文标签,方便调试。

补充对比理解

  • interact 本质:UI 界面与业务函数解耦。滑块只负责产生角度数值,不操作硬件;硬件操作全部交给回调函数 pwm_servo
  • UI 层(滑块) ↔ 业务逻辑层(pwm_servo),和机器人整套架构思想完全一致:上层只输出诉求,下层执行硬件操作。
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐