当前位置: 首页 > news >正文

使用python写一个虚拟的舵机模拟器

运行效果如上,

        这是一个用Python tkinter开发的舵机摆动模拟器,用于调试舵机控制代码。模拟器包含一个SwingArm类模拟舵机运动(固定速度180度/秒),通过滑动条输入PWM信号(1000-2000对应-45°至45°)。GUI显示当前角度和摆臂位置,每50ms更新一次状态。使用前需安装python-tk,主要功能包括:PWM到角度转换、平滑角度过渡和实时可视化。该工具便于开发者测试舵机控制算法而无需实际硬件。

1.需要安装python-tk 如

 brew install python-tk

2. class SwingArm 是舵机,它的速度是固定的,为180.0度/秒  

3. 滑条模拟输入的pwm

代码如下:

import tkinter as tk
import mathclass SwingArm:def __init__(self):self.current_angle = 0.0  # 当前角度(-45~45)self.target_angle = 0.0   # 目标角度self.speed = 180.0         #  180.0度/秒def set_target(self, pwm):# PWM映射到角度(1000→-45°,2000→45°)self.target_angle = (pwm - 1500) * 0.09def update(self, delta_time):# 计算移动方向和距离angle_diff = self.target_angle - self.current_angleif abs(angle_diff) < 0.1:  # 到达阈值returndirection = 1 if angle_diff > 0 else -1max_step = self.speed * delta_timestep = min(abs(angle_diff), max_step) * direction# 更新当前角度并限制范围self.current_angle = max(-45.0, min(45.0, self.current_angle + step))class ServoSimulator:def __init__(self, master):self.master = mastermaster.title("舵机摆动模拟器")# 界面布局self.canvas = tk.Canvas(master, width=400, height=300, bg='white')self.canvas.pack(pady=20)# PWM输入控件# 删除原有Entry控件,添加滑动条self.pwm_label = tk.Label(master, text="PWM控制 (1000-2000):")self.pwm_label.pack()# 创建水平滑动条self.pwm_slider = tk.Scale(master, from_=1000, to=2000, orient=tk.HORIZONTAL,length=300, command=self.update_angle)self.pwm_slider.set(1500)  # 设置默认值self.pwm_slider.pack(pady=10)# 删除原有pwm_entry及其绑定self.pwm_entry = tk.Entry(master)self.pwm_entry.pack()self.pwm_entry.insert(0, "1500")# 角度显示self.angle_label = tk.Label(master, text="当前角度: 0.00°")self.angle_label.pack(pady=10)# 绘制摆臂self.arm = self.canvas.create_line(200, 150, 300, 150, width=3, fill='blue')# 绑定输入事件self.pwm_entry.bind("<KeyRelease>", self.update_angle)# 新增初始化变量self.current_angle = 0.0self.direction = 1# 初始化摆臂对象self.swing_arm = SwingArm()# 删除残留的pwm_entry相关代码self.pwm_entry.pack_forget()  # 隐藏输入框self.pwm_entry.unbind("<KeyRelease>")  # 解除事件绑定# 启动动画循环self.update_animation()def update_angle(self, pwm_value):# 将PWM值传给摆臂对象self.swing_arm.set_target(int(pwm_value))def update_animation(self):# 更新摆臂状态(50ms间隔)self.swing_arm.update(0.05)# 更新界面显示self.angle_label.config(text=f"当前角度: {self.swing_arm.current_angle:+.2f}°")angle_rad = math.radians(self.swing_arm.current_angle)x = 200 + 100 * math.cos(angle_rad)y = 150 - 100 * math.sin(angle_rad)self.canvas.coords(self.arm, 200, 150, x, y)self.master.after(50, self.update_animation)def update_angle(self, pwm_value=None):try:# 从滑动条获取值pwm = int(pwm_value) if pwm_value else self.pwm_slider.get()print(f"更新pwm: {pwm}")self.swing_arm.set_target(pwm)except Exception as e:print(f"更新错误: {e}")except ValueError:self.angle_label.config(text="输入无效!")if __name__ == "__main__":root = tk.Tk()app = ServoSimulator(root)root.mainloop()

http://www.xdnf.cn/news/911863.html

相关文章:

  • 经典文献阅读之--LidaRefer(基于变换器的自动驾驶户外3D视觉定位)
  • Onenet云网关方案应用--基于米尔瑞芯微RK3576开发板
  • (附示例代码及图示)问题分解策略提升复杂问题检索正确率
  • 【公益护航青春路】 “成长的秘密花园”青春期身心成长讲座走进校园
  • 肖特基二极管的特性
  • 森马下沙奥莱旗舰店盛大启幕:以“新常服“理念重塑消费体验新范式
  • 2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程
  • OpenLayers 地图定位
  • 好子集的数目概念及表达形式
  • 数据库精选题(四)(E-R模型)
  • 基于nacos2.5.1的MCP服务端微服务项目开发环境配置简介
  • 提升CPU、内存及磁盘利用率脚本
  • 群晖文件操作API
  • 自然语言处理的发展
  • (33)课54--??:3 张表的 join-on 连接举例,多表查询总结。
  • MyBatis————入门
  • 【SSM】MyBatisPlus笔记:快速上手MyBatisPlus
  • C++算法动态规划3
  • VUE前端实现自动打包成压缩文件
  • Linux缓冲区与glibc封装:入门指南
  • 智能生成完整 Java 后端架构,告别手动编写 ControllerServiceDao
  • 网络编程及原理(三)
  • 2025最新VMware17如何通过官网进行下载
  • [蓝桥杯]迷宫与陷阱
  • 端游如何反调试
  • 几何引擎对比:OpenCasCade、ACIS、Parasolid和CGM
  • 使用 FastMCP 构建你的第一个 MCP 服务:从零开始的 Python 示例
  • DAX权威指南8:DAX引擎与存储优化
  • 缓解骨质疏松 —— 补钙和补维 D
  • TeamCity Agent 配置完整教程(配合 Docker Compose 快速部署)