[具身智能-807]:ROSMASTER-M1:代码解析:Jupyter interact 四个滑块控制 PWM 舵机
·
代码解析: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 环境)
pwm_servo函数必须提前定义,4 个形参 S1,S2,S3,S4 不能少,顺序名字必须匹配
python
运行
#错误示例:参数名字对不上
def pwm_servo(a,b,c,d): # 名字S1/S2/S3/S4不匹配,interact直接报错
pass
- 滑块输出是角度 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)
- 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),和机器人整套架构思想完全一致:上层只输出诉求,下层执行硬件操作。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐



所有评论(0)