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

别再死记硬背PID公式了!用Arduino和Python手把手带你调一个会动的平衡小车

用Arduino和Python打造会跳舞的平衡小车PID调参实战指南看着桌上那个摇头晃脑的平衡小车我忍不住笑出了声——它正像个醉汉一样左右摇摆时不时还来个平地摔。这已经是我调参的第三个小时了但比起那些枯燥的理论公式这种看得见摸得着的调试过程简直让人上瘾。如果你也厌倦了死记硬背PID公式不妨跟着我一起动手用Arduino和Python打造一个真正会动的平衡小车在实践中感受控制算法的魔力。1. 项目准备硬件与软件搭建1.1 硬件清单与组装我们先来看看需要哪些硬件组件。别担心这些材料都很常见且价格亲民核心控制器Arduino Uno或任何兼容板运动传感器MPU6050六轴陀螺仪加速度计电机驱动L298N双H桥模块动力系统两个直流减速电机车轮结构件亚克力车架、电池盒、万向轮连接件杜邦线若干、螺丝螺母套装组装时有个小技巧把重心尽量抬高。这听起来违反直觉但较高的重心会让平衡效果更明显也更容易观察到PID参数的影响。我的第一版小车底盘太低结果调参时几乎看不出区别。1.2 软件环境配置软件部分我们需要两个关键组件# Python端需要安装的库 pip install pyserial matplotlib numpyArduino端则需要安装MPU6050_tockn库管理陀螺仪数据下载PID_v1库简化PID实现串口通信协议是我们项目的神经系统。我设计了一个简单的JSON格式来交换数据{ angle: 当前角度, output: 电机输出, p: 比例参数, i: 积分参数, d: 微分参数 }提示在Arduino端使用Serial.println()发送数据时记得在末尾加上换行符这样Python端才能正确解析。2. PID的物理直觉从摇晃到平衡2.1 比例控制小车的条件反射先来试试最简单的P控制。上传以下代码到Arduinodouble Setpoint 0; // 目标平衡角度 double Input, Output; PID myPID(Input, Output, Setpoint, Kp, Ki, Kd, DIRECT); void setup() { myPID.SetMode(AUTOMATIC); myPID.SetSampleTime(10); // 10ms采样周期 } void loop() { Input getAngle(); // 获取当前角度 myPID.Compute(); setMotorSpeed(Output); // 输出到电机 }当Kp5时你会看到有趣的现象小车像被施了魔法一样开始尝试站立但总是过度反应——向左倒就猛向右转向右倒又急刹向左。这其实就是比例控制的本质误差越大修正力度越大。P参数调试观察表Kp值小车行为问题诊断1轻微晃动反应不足5剧烈摇摆反应过度3短暂平衡接近临界2.2 加入微分给小车预见能力现在让我们引入D参数。微分就像小车的第六感它能预判未来的倾斜趋势// 在loop()前添加 unsigned long lastTime 0; double lastInput 0; void loop() { double dInput (Input - lastInput) / (millis() - lastTime) * 1000; // 计算角度变化率 lastInput Input; lastTime millis(); Output Kp * Input Kd * dInput; // PD控制器 setMotorSpeed(Output); }当Kd0.5时神奇的事情发生了——小车的摆动幅度明显减小。这是因为微分项在抑制系统的振荡就像有经验的骑自行车的人会通过细微的手腕动作保持平衡。PD参数黄金组合Kp3Kd0.5采样周期10ms2.3 积分项修正长期偏差加上I参数后我们的PID控制器就完整了。积分项专门对付那些顽固的系统性偏差比如电机不对称或地面不平。double ITerm 0; double totalError 0; void loop() { double error Setpoint - Input; totalError error; ITerm Ki * totalError; Output Kp * error ITerm Kd * dInput; setMotorSpeed(constrain(Output, -255, 255)); // 限制输出范围 }但积分项是把双刃剑。我的小车就曾因为Ki过大而表演过陀螺旋转——积分累积导致输出饱和电机全速旋转停不下来。解决方法是设置积分限幅增加积分抗饱和逻辑或者更简单——保持Ki很小如0.013. Python可视化让参数调整看得见3.1 实时数据监控用Python我们可以创建强大的调试界面import serial import matplotlib.pyplot as plt ser serial.Serial(COM3, 115200) plt.ion() fig, ax plt.subplots() x, y [], [] while True: data ser.readline().decode().strip() try: angle float(data) x.append(len(x)) y.append(angle) ax.clear() ax.plot(x, y) plt.pause(0.01) except: pass这个简单的脚本就能实时绘制小车角度变化曲线。当看到这样的图形时/\ / \ /\ / \_/ \_说明你的D参数还需要加强——振荡衰减太慢了。3.2 参数整定技巧通过反复实验我总结出一套调参顺口溜先调P稳又强 再加D不慌张 I最后微调量 参数过大反受伤具体步骤将Ki和Kd设为0逐渐增大Kp直到小车开始振荡取振荡时Kp值的60%作为基础逐步增加Kd直到振荡消失最后加入很小的Ki修正稳态误差典型参数范围参考参数起步值适用场景Kp3-8快速响应Ki0.01-0.1消除静差Kd0.3-1.5抑制振荡4. 进阶技巧当小车开始跳舞4.1 处理电机死区便宜的直流电机常有死区问题——小电压时根本不转。这会导致小车在接近平衡点时出现抽搐。解决方法void setMotorSpeed(int speed) { if (speed 0) speed 30; // 正向死区补偿 else if (speed 0) speed - 30; // 负向补偿 analogWrite(MOTOR_PIN, constrain(speed, -255, 255)); }4.2 动态调参策略为什么满足于静态参数我们可以让PID根据倾斜程度自动调整double adaptiveKp Kp * (1 abs(Input)/10.0); // 角度越大Kp越大这种非线性PID在小车快要倒下时会拼命挽救而在接近平衡点时则动作轻柔。4.3 手机蓝牙控制加个HC-05蓝牙模块就能用手机调节参数了if (Serial.available()) { char cmd Serial.read(); if (cmd p) Kp 0.1; else if (cmd P) Kp - 0.1; // 类似处理Ki和Kd... }现在你可以边观察小车行为边实时调整参数就像在调音台上混音一样有趣。记得第一次成功让小车稳定站立超过1分钟时我兴奋地像个孩子一样手舞足蹈。那种通过亲手调试让一堆零件活过来的成就感是任何理论推导都无法替代的。现在每当看到新手面对PID公式一脸茫然时我都会说别急着背公式先做个会动的小车吧

相关文章:

别再死记硬背PID公式了!用Arduino和Python手把手带你调一个会动的平衡小车

用Arduino和Python打造会跳舞的平衡小车:PID调参实战指南 看着桌上那个摇头晃脑的平衡小车,我忍不住笑出了声——它正像个醉汉一样左右摇摆,时不时还来个"平地摔"。这已经是我调参的第三个小时了,但比起那些枯燥的理论公…...

VLA-4D:多模态感知与动态适应的机器人视觉系统

1. 项目背景与核心价值去年在部署机械臂分拣系统时,我发现传统视觉引导方案存在明显局限——当目标物体被遮挡或位置动态变化时,系统需要频繁重新标定。这正是VLA-4D试图解决的痛点:通过融合多模态感知与时间维度理解,让机器人具备…...

基于AI的社群风格内容生成:从原理到实践

1. 项目概述:一个能“读懂”人群的智能内容生成器最近在GitHub上看到一个挺有意思的项目,叫talsraviv/peoples-post-generator。光看名字,你可能会觉得这又是一个普通的“帖子生成器”,市面上这类工具太多了。但当我深入研究了它的…...

读了libstdc++ std::allocator源码,发现它在GCC 5之后被彻底重写了——C++内存分配的3层架构

打开GCC 12的libstdc++源码,翻到bits/allocator.h,找到std::allocator<T>的allocate()成员函数——你猜里面有多少行实现代码?不是SGI STL时代那个维护着16个free-list、管理着一整套内存池的复杂二级配置器,不是侯捷《STL源码剖析》里用了整整一章才讲完的__default…...

无需本地安装,用快马平台在线验证你的python环境是否配置成功

最近在教朋友学Python时&#xff0c;发现很多初学者卡在环境配置这一步。传统安装教程需要下载、配置环境变量、验证版本等一系列操作&#xff0c;对新手不太友好。后来发现用InsCode(快马)平台的在线Python环境&#xff0c;能跳过这些繁琐步骤直接验证安装效果&#xff0c;特别…...

【万字长文】Agent 记忆设计:从短期上下文到长期记忆系统

一个 agent 真正露怯的时刻&#xff0c;往往是忘了刚刚和你一起建立过的上下文。 上周刚改过一个项目&#xff0c;今天它却表现得像第一次见到这个仓库一样。直觉上&#xff0c;这叫“没有记忆”。但真要做一个能长期工作的 agent&#xff0c;问题比“加一个 memory store”要…...

Dify低代码调试实战手册(生产环境真机复现版)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Dify低代码调试的核心理念与生产约束 Dify 的低代码调试并非追求“零编码”&#xff0c;而是将开发者的注意力从基础设施胶水代码中解放出来&#xff0c;聚焦于业务逻辑验证、提示工程迭代与可观测性闭…...

【2026实战】Go语言实现AI Agent任务调度网关

系列第6篇:Python+Go构建企业级AI Agent实战指南(6/13) 标签: Go | Hertz | 任务调度 | 网关 | 高并发 一、开篇:为什么用Go做Agent基础设施? Python是AI的"母语",但在企业级部署中,Go才是基础设施的"王者"。 字节跳动的实践数据: 40%的微服务采…...

从零构建全栈任务管理系统:Node.js+React+PostgreSQL实战

1. 项目概述&#xff1a;一个从零到一的任务管理系统最近在整理过往项目时&#xff0c;翻到了一个我几年前主导开发并持续维护的task-management-system。这个项目最初源于一个非常朴素的需求&#xff1a;团队内部需要一个轻量、灵活、能完全掌控在自己手里的任务协作工具。市面…...

轻量级塔防游戏评估LLM规划决策能力

1. 项目背景与核心价值TowerMind这个项目名称本身就很有意思——"塔"指向塔防游戏&#xff08;Tower Defense&#xff09;&#xff0c;"Mind"则暗示了AI的决策思维。简单来说&#xff0c;这是一个用轻量级塔防游戏环境来评估大语言模型&#xff08;LLM&…...

新手电钢琴怎么选?88键重锤避坑全攻略,5款高口碑型号推荐

接触钢琴学习快两年了&#xff0c;身边陆陆续续有好几个朋友来问我&#xff1a;电钢琴到底怎么选&#xff1f;网上说法太多&#xff0c;完全看不懂。说实话&#xff0c;选电钢琴最容易被忽视、却又最关键的一个维度&#xff0c;就是键盘手感。我自己当年入门时也在这个问题上吃…...

解锁纯净动漫世界:Hanime1Plugin如何让你的Android观影体验焕然一新

解锁纯净动漫世界&#xff1a;Hanime1Plugin如何让你的Android观影体验焕然一新 【免费下载链接】Hanime1Plugin Android插件(https://hanime1.me) (NSFW) 项目地址: https://gitcode.com/gh_mirrors/ha/Hanime1Plugin 你是否厌倦了观看动漫时被各种广告和弹窗打扰&…...

今天拆 8 个国外项目/需求信号:普通人怎么把“开源工具、README、AI 原型、数字模板”变成小生意?

&#x1f4e1; 信号解码器&#xff5c;每天一个海外信号&#xff0c;拆解成你明天就能试的赚钱动作 今日判断&#xff1a;不要追“大而全的AI风口”&#xff0c;先找一个很窄、很具体、已经有人在国外验证过的需求&#xff0c;然后翻译成国内能交付、能报价、能成交的小服务。 …...

收藏!月薪15K的程序员,转行大模型工程师,轻松翻倍高薪不是梦!

本文主要介绍了大模型工程师的入门门槛并不高&#xff0c;强调了应用工程师的重要性&#xff0c;并提出了四大核心能力&#xff1a;提示工程、RAG检索增强生成、模型微调、工程部署能力。文章通过真实案例展示了传统程序员成功转型大模型工程师的过程&#xff0c;并提供了一个零…...

视觉语言模型后门攻击与BEAT防御框架解析

1. 项目背景与核心问题 在计算机视觉与自然语言处理交叉领域&#xff0c;视觉语言模型&#xff08;Vision-Language Models&#xff09;正成为新一代多模态人工智能的核心基础设施。这类模型能够同时理解图像和文本信息&#xff0c;在图像描述生成、视觉问答、跨模态检索等任务…...

AI赋能开发:在快马平台用Python构建你的智能代码生成助手

最近尝试用Python做了一个AI辅助代码生成的小工具&#xff0c;整个过程比想象中顺利很多。这个工具的核心思路是让开发者用自然语言描述需求&#xff0c;自动转换成可运行的Python代码。下面分享下具体实现过程和几点心得体会&#xff1a; 需求分析与功能设计 最开始想解决的实…...

用HC-05蓝牙模块DIY智能小车?从手机APP控制到STM32代码移植全流程解析

用HC-05蓝牙模块打造智能小车&#xff1a;从零构建手机遥控系统 去年夏天&#xff0c;我在工作室里捣鼓一堆电子元件时&#xff0c;突然萌生了一个想法——为什么不把那个闲置的HC-05蓝牙模块变成一个真正的项目&#xff1f;于是&#xff0c;一台可以通过手机APP遥控的智能小车…...

Awoo Installer终极指南:如何一键解决Switch游戏安装的4大痛点

Awoo Installer终极指南&#xff1a;如何一键解决Switch游戏安装的4大痛点 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 还在为Switch游戏安装的…...

MovieLens数据集预处理避坑指南:用Pandas处理‘::’分隔符、编码分类变量与异常值检测的完整流程

MovieLens数据集预处理实战&#xff1a;从原始数据到推荐系统输入的完整避坑手册 当你第一次从GroupLens官网下载MovieLens数据集时&#xff0c;可能会被那些以.dat为扩展名的文件弄得一头雾水。这些文件使用::作为分隔符&#xff0c;包含各种需要清洗和转换的数据字段。本文将…...

Dify多租户数据隔离实战配置:从零搭建RBAC+Schema+Row-Level三级防护体系(附生产环境YAML校验清单)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Dify多租户数据隔离优化配置 在企业级 AI 应用部署中&#xff0c;Dify 默认采用单租户架构&#xff0c;若需支持多租户场景&#xff08;如 SaaS 平台&#xff09;&#xff0c;必须显式强化数据隔离策略…...

开源AI智能体框架:如何用本地模型替代Claude实现自主可控

1. 项目概述&#xff1a;一个开源替代方案的诞生最近在AI应用开发圈里&#xff0c;一个名为“BlueBirdBack/openclaw-without-claude”的项目引起了我的注意。这个项目名本身就充满了故事性&#xff0c;它直指当前一个非常现实的问题&#xff1a;当我们依赖某个强大的闭源API&a…...

互联网大厂 Java 求职面试:从音视频场景到微服务的深入探讨

互联网大厂 Java 求职面试&#xff1a;从音视频场景到微服务的深入探讨 在互联网大厂求职&#xff0c;面试过程常常充满紧张与期待。今天&#xff0c;我们将一起走进燕双非的面试现场&#xff0c;看看他是如何应对面试官的提问的。第一轮提问 面试官&#xff1a;燕双非&#xf…...

互联网大厂 Java 求职面试:从音视频到微服务的技术探讨

互联网大厂 Java 求职面试&#xff1a;从音视频到微服务的技术探讨 在这场严肃的面试中&#xff0c;面试官与搞笑的候选人燕双非之间的对话充满了技术和幽默。以下是他们的对话记录。第一轮提问 面试官&#xff1a;燕双非&#xff0c;首先请你介绍一下 Java SE 的特点&#xff…...

互联网大厂 Java 求职面试:从基础到微服务的技术深潜

互联网大厂 Java 求职面试&#xff1a;从基础到微服务的技术深潜在一个阳光明媚的下午&#xff0c;面试官坐在桌子后面&#xff0c;脸上挂着严肃的表情&#xff0c;而燕双非则略显紧张&#xff0c;但他努力让自己看起来从容不迫。第一轮提问面试官&#xff1a;首先&#xff0c;…...

t技巧笔记(十):Painter 详解与实践指南

简介 langchain中提供的chain链组件&#xff0c;能够帮助我门快速的实现各个组件的流水线式的调用&#xff0c;和模型的问答 Chain链的组成 根据查阅的资料&#xff0c;langchain的chain链结构如下&#xff1a; $$Input \rightarrow Prompt \rightarrow Model \rightarrow Outp…...

ESP32H2-N4开发板三模无线与低功耗设计解析

1. WeAct ESP32H2-N4开发板深度解析1.1 硬件架构与核心特性WeAct ESP32H2-N4开发板采用Espressif Systems的ESP32-H2-MINI-1无线模块作为核心组件。这颗32位RISC-V架构的微控制器运行频率最高可达96MHz&#xff0c;内置320KB SRAM和128KB ROM存储空间&#xff0c;特别值得注意的…...

FPGA加速机器学习:原理、优化与应用实践

1. FPGA加速的实时机器学习技术概述 在科学实验领域&#xff0c;数据处理的速度和效率直接决定了研究的深度和广度。传统CPU架构在处理TB/s量级的实时数据流时往往力不从心&#xff0c;而FPGA&#xff08;现场可编程门阵列&#xff09;凭借其可重构特性和并行计算能力&#xff…...

UM482 RTK差分定位实战:从基站固定到4G无线数传的全链路配置

UM482 RTK差分定位实战&#xff1a;从基站固定到4G无线数传的全链路配置 在自动驾驶、精准农业和移动测绘等领域&#xff0c;厘米级定位精度已成为刚需。传统GNSS定位误差约2-5米&#xff0c;而RTK&#xff08;实时动态差分定位&#xff09;技术通过基站与流动站的协同工作&…...

Dify插件沙箱逃逸实录:从CVE-2026-0891漏洞复现到RCE防护加固的7步闭环方案

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Dify插件沙箱逃逸实录&#xff1a;从CVE-2026-0891漏洞复现到RCE防护加固的7步闭环方案 CVE-2026-0891 是 Dify v0.6.10 及更早版本中插件执行沙箱的关键绕过漏洞&#xff0c;攻击者可通过构造恶意 plu…...

渗透测试干货:WiFi 无线网络攻防详解,一步一步手把手教学,小白也能学会

【渗透干货-近源渗透】破解WiFi无线网络教程&#xff08;保姆级教程&#xff09; 前言 破解无线的原理就是大量多次重复性的密码碰撞爆破&#xff0c;理论上只要你的密码足够多&#xff0c;就可以很轻松的爆破无线网络。 总体步骤 ​ 01 连接无线网卡 ​ 02 开启网卡监听 …...