问题标签 [pid-controller]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 如何正确归一化 q15 定点中的 pid 系数
我正在使用 STM32F4 微控制器上的 CMSIS 库开发 PID 控制器。我无法真正理解 PID 参数的归一化。现在我有了 PID 控制器的三个 Kp、Ki、Kd 参数,我必须将它们放入系统中。我知道他们需要标准化,所以我必须从整数转换为 q15。问题来了。就我而言,我有:
据我了解,我需要找到一个因子以使这些数字在 -32768...32767 中可表示,因此我将2^13
其用作因子:
我不明白是否需要除以PID计算的结果。如果我除法,当误差较低时,pid 输出为零:让我们有一个恒定的误差 e(n) = 2。在 PID 计算中(我使用函数 arm_pid_q15() 中描述的公式):
如果y(n-1) = 0
,y(n) = 1392
。如果我除以2^13
因子,我有y(n) = 0
(整数)。
另一方面,如果我不除PID输出,就像将比例增益乘以2^13
因子。
有人可以帮助我理解这一点吗?谢谢。
unity3d - Unity3D车轮对撞机PID控制器?
我正在尝试根据以下教程制作车轮对撞机 PID 控制器:
https://www.habrador.com/tutorials/pid-controller/1-car-follow-path/
我对 FixedUpdate 方法进行了修订,以根据与样条航路点的角度差(如果在脚本中实例化一个)来修改转向方向,并尝试根据汽车的速度引入“滑行”或“制动”行为正在走,转弯的角度有多紧。目前,“漂移”将车轮摩擦曲线设置为车轮之间交替的前向和侧向摩擦刚度值。通常,任何汽车在车轮碰撞器上的侧向刚度系数为 2,如下所示:
现在,问题是,很难在理想的 PID 控制器设置和预期阈值之间找到平衡点 1.)由于转向角可能失控而导致制动或滑行 2.)当两者之间即将出现角度时“漂移”汽车前方的下一个航路点为汽车转弯提供了一个狭窄的角度。
这是我当前的 PID 值,老实说,我已经对这些值进行了相当多的调整(我知道这在某种程度上是可以预期的):
这是相关代码 - FixedUpdate 循环:
任何人都可以就我如何更有效地解决这个问题提出建议,也许?不管我做什么,即使我将速度限制在 10 或 20 的超慢速度,汽车也会继续以醉酒的方式转动。当然,想象汽车以 70 或 90 的速度行驶!事实证明,现在有点头疼。
感谢任何建议或意见。再次感谢。
robotics - 用于距离的四轴飞行器 PID 控制器
我正在尝试使用 PID 控制器在水平行进时将四轴飞行器停在特定位置,但是目前它根据最大速度过冲/下冲。我曾尝试手动调整 P、I 和 D 增益,但效果有限。本质上,速度需要在飞行路径的尽头从 maxSpeed 变为 0。
我运行一个每 0.1 秒执行一次的循环。四轴飞行器的俯仰输入以 m/s 为单位,我在每次迭代时重新计算到目标的距离。
一些伪代码
有没有办法可靠地将这个 PID 控制器调整到适用于不同最大速度的系统,和/或我需要考虑其他因素?
arduino - How to control the speed of a stepper motor using PID control and ultrasonic sensor?
Little backstory: I'm currently doing this project that deals with using two cars, called block A and B, which block B has to maintain a distance of 10 cm from block A using PID, PD, PI, or P. I'm using a PID. Block B uses an Arduino whereas Block A is controlled by the user by hand. Block B uses a unipolar stepper motor as the actuator and an ultrasonic sensor to sense the distance. My professor wants the motor to move in both directions and have varying speeds (slow, medium, and fast). I'm using brett's PID since I have used it before in my previous labs.
Problem:
I have an issue with how to create varying speeds for block B like intuitively I know that I want the B should move for example, fast if the car is greater than 20 cm, medium if the car is between 20cm and 14cm, and slow if it's between 14cm and 10cm. But I just can't use the input value retrieved from the sensor directly to control the motor as it would make it an open system. So I used the error retrieved from Brett's PID code to control the stepper motor. So far, I have gotten the directions to work by setting the myPID.SetOutputLimits(-800,800);
. But as it tried to use the error to control the speed it would be impossible because the error always fluctuates at a specific distance. For example at 12cm, I would get either 800 or around 300. I'm currently confused about how to implement control of the speed of my stepper motor through PID and any help regarding this issue will be appreciated.
Code: Code was through Arduino IDE.
c++ - PID 控制:在下一个循环之前添加延迟是个好主意吗?
我正在用 C++ 实现 PID 控制,以使差动驱动机器人转动准确的度数,但我遇到了很多问题。
由于快速循环运行时间而提前退出控制循环
如果机器人测量其误差小于 0.5 度,它会退出控制循环并认为转弯“完成”(0.5 是我可能会在某个时候更改的随机值)。看起来控制回路运行得如此之快,以至于机器人可以以非常高的速度转动,转过设定点,然后退出回路/切断电机功率,因为它是在设定点短时间。我知道这是 PID 控制的全部目的,即准确地达到设定值而不会超调,但这个问题使得调整 PID 常数变得非常困难。例如,我试图找到一个 kp 的值,使得有稳定的振荡,但从来没有任何振荡,因为机器人认为它一旦通过设定点就“完成”了。为了解决这个问题,我实现了一个系统,机器人在退出之前必须处于设定点一段时间,这很有效,允许发生振荡,但提前退出循环的问题似乎很不寻常问题,我的解决方案可能不正确。
由于运行时间快,D 项没有影响
一旦我让机器人仅使用 P 以受控方式振荡,我就尝试添加 D 以防止过冲。但是,这在大多数情况下都没有效果,因为控制循环运行得如此之快,以至于 20 个循环中有 19 个循环,误差变化率为 0:机器人没有移动或移动不足到那个时候去衡量。我打印了每个循环的误差变化和导数项来确认这一点,我可以看到在取一个合理的值之前,它们在大约 20 个循环周期内都为 0,然后在另外 20 个循环内回到 0。就像我说的那样,我认为这是因为循环周期太快了,以至于机器人实际上没有足够的移动来产生任何明显的错误变化。
注意:我还对静态摩擦系数使用了一个小的前馈,我称这个前馈为“f”
我应该添加延迟吗?
我意识到我认为这两个问题的根源是循环运行得非常快,所以我想到的是在循环结束时添加一个等待语句。但是,故意减慢循环似乎是一个整体糟糕的解决方案。这是一个好主意吗?
matlab - MATLAB与单片机连接实现实时控制系统
我有以下系统:由 MATLAB 中的 simulink 模拟的直流电机。通过串行通信块连接到 simulink 的微控制器。
simulink 和微控制器之间的数据交换进展顺利,但是当我使用直流电机模型制作闭环控制系统时,我总是面临模型中的奇点。奇点是由表示直流电机模型中电感的积分器产生的。
希望能帮助我解决这个问题,有关我的模型的更多详细信息,请写信给我,我会提供。
提前致谢
python - 如何将 PID 控制器应用于我的问题?云台摄像机跟踪
的背景
我最近设计了云台相机模块,它利用步进电机控制相机运动,并利用 Jetson Xavier NX 进行物体识别。
工作流程很简单:
- 用 Python 编写的程序正在分析视频输入并寻找对象。
- 当找到对象时,它会计算图像中心和对象位置(在 X 和 Y 轴上)之间的差异并启用电机。
- 当物体远离中心时,它会为电机设置更大的速度。当它关闭时,它以最低速度运行电机。
重要提示:程序不知道屏幕上的距离与步进电机到中心的步数之间的关系。它只是启用步进电机并不断检查,直到中心和物体之间的差异非常小。也许这个方法是错误的......
问题
我读过关于应用 PID 控制器来解决这类问题以最大限度地减少偏差,但我不明白如何在我的情况下应用。当我们想要达到一个绝对值(例如伺服电机的角度)时,它似乎更简单。PyImageSearch.com 有一个很好的例子,如何使用 PID 控制器来最小化基于伺服电机的云台模块的偏差。PID 控制器根据当前误差(物体位置与相机框架中心之间的差异)不断计算角度值并调整角度。
问题
我想问我如何考虑 PID 控制器(如果可能的话),当我只有速度变量来控制电机而不是像伺服系统中的角度时。
也许我必须改变它的工作方式并实现可以为我提供有关当前步进电机位置信息的功能(如伺服系统中的角度)?
controls - 具有阶跃响应的 Ziegler-Nichols 方法?
我有一个关于 Ziegler-Nichols 方法的快速问题:找到 PID 增益参数的一种方法是通过增加 P 增益直到它达到其临界值,方法是使操纵值以周期 T 连续振荡,并注意这一点评估 K_pcritical。这种方法是如何应用的?是通过阶跃响应吗?因为如果我能从逻辑上理解它,那是我能想象的唯一方法,即使我在互联网上没有找到任何提到这种方法中的阶跃响应的东西。
python - 为什么我的程序让我的机器人关闭电源?
我正在尝试组装一个程序化的机器人,该机器人可以通过阅读标志(例如浴室右侧)的说明来导航房间。我正在使用 AlphaBot2 套件和 RPI 3B+。
图像处理部分运行良好,但由于某种原因,运动控制不起作用。我写了一个简单的 PID 控制器来“馈送”电机,但是一旦电机开始转动,机器人就会关闭。
然后我有相机捕捉的循环,在那里我识别最近的标志并计算他的宽度和它的中心的x坐标: