问题标签 [control-theory]

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.

0 投票
1 回答
74 浏览

robotics - 用于距离的四轴飞行器 PID 控制器

我正在尝试使用 PID 控制器在水平行进时将四轴飞行器停在特定位置,但是目前它根据最大速度过冲/下冲。我曾尝试手动调整 P、I 和 D 增益,但效果有限。本质上,速度需要在飞行路径的尽头从 maxSpeed 变为 0。

我运行一个每 0.1 秒执行一次的循环。四轴飞行器的俯仰输入以 m/s 为单位,我在每次迭代时重新计算到目标的距离。

一些伪代码

有没有办法可靠地将这个 PID 控制器调整到适用于不同最大速度的系统,和/或我需要考虑其他因素?

0 投票
0 回答
47 浏览

c++ - PID 控制:在下一个循环之前添加延迟是个好主意吗?

我正在用 C++ 实现 PID 控制,以使差动驱动机器人转动准确的度数,但我遇到了很多问题。

由于快速循环运行时间而提前退出控制循环

如果机器人测量其误差小于 0.5 度,它会退出控制循环并认为转弯“完成”(0.5 是我可能会在某个时候更改的随机值)。看起来控制回路运行得如此之快,以至于机器人可以以非常高的速度转动,转过设定点,然后退出回路/切断电机功率,因为​​它在设定点短时间。我知道这是 PID 控制的全部目的,即准确地达到设定值而不会超调,但这个问题使得调整 PID 常数变得非常困难。例如,我试图找到一个 kp 的值,使得有稳定的振荡,但从来没有任何振荡,因为机器人认为它一旦通过设定点就“完成”了。为了解决这个问题,我实现了一个系统,机器人在退出之前必须处于设定点一段时间,这很有效,允许发生振荡,但提前退出循环的问题似乎很不寻常问题,我的解决方案可能不正确。

由于运行时间快,D 项没有影响

一旦我让机器人仅使用 P 以受控方式振荡,我就尝试添加 D 以防止过冲。但是,这在大多数情况下都没有效果,因为控制循环运行得如此之快,以至于 20 个循环中有 19 个循环,误差变化率为 0:机器人没有移动或移动不足到那个时候去衡量。我打印了每个循环的误差变化和导数项来确认这一点,我可以看到在取一个合理的值之前,它们在大约 20 个循环周期内都为 0,然后在另外 20 个循环内回到 0。就像我说的那样,我认为这是因为循环周期太快了,以至于机器人实际上没有足够的移动来产生任何明显的错误变化。

注意:我还对静态摩擦系数使用了一个小的前馈,我称这个前馈为“f”

我应该添加延迟吗?

我意识到我认为这两个问题的根源是循环运行得非常快,所以我想到的是在循环结束时添加一个等待语句。但是,故意减慢循环似乎是一个整体糟糕的解决方案。这是一个好主意吗?

0 投票
2 回答
244 浏览

matlab - 如何用正弦波输入模拟系统输出?

我希望模拟我拥有的某个齿轮系统的输出。齿轮系统的外观对这个问题并不特别重要,我设法从机械系统中获得了所需的微分方程。这是我的代码

这应该可以生成一个图表,该图表显示了 Heaviside/step 输入的位置、我的输出。我的问题是,我将如何为正弦波输入执行此操作。我想我应该有sin(w*t)而不是(t>=0),其中 w 是我的脉冲频率。不过,我似乎无法完成这项工作。任何帮助将非常感激!:)

0 投票
1 回答
64 浏览

openmdao - 如何使用 OpenMDAO 在不反转 A 矩阵的情况下求解线性方程组?

我有一个方程组,其形式为:

轴 = b

其中 A 和 b 是已知状态和从早期组件派生的状态速率的混合,x 是四个未知状态速率的向量。我已经使用 Matlab 将问题线性化,我现在需要做的就是创建一些组件来找到 x。但是,就每个索引中的变量数量而言,A 的倒数很大,所以我不能将它们变成一个简单的线性方程。有人可以建议一条路线吗?

0 投票
0 回答
171 浏览

matlab - 以直流电机模型为强制函数的状态空间模型

因此,我正在使用状态空间模型为车载倒立摆系统设计控制器。我使用 MATLAB-Simulink 作为我的仿真环境,下面是控制系统动态行为的数学方程:

在此处输入图像描述

转换为状态状态空间,该模型表示如下:

在此处输入图像描述

此外,我还有一个直流电机模型(作为传递函数/微分方程),它应该驱动这个系统,或者提供输入力。我很难意识到如何用直流电机模型代替强制功能?这样我就可以观察直流电机所需的控制力

这是我的 Simulink 模型,它正在通过 MATLAB 工作区的状态空间和增益矩阵: 在此处输入图像描述

0 投票
2 回答
69 浏览

scilab - xcos中如何使用exp(x)?

我正在尝试模拟 K e^(-θ s)/(*s + 1),但 xcos 不允许我在 CLR 块中使用 exp(s)。有什么办法吗?另外,如何在没有变量值的情况下创建 xcos 模型,然后通过编辑器分配值?

谢谢!

0 投票
1 回答
59 浏览

python-3.x - 关于正确实现带矢量输出端口的 LeafSystem 的困惑

我是一名自学 Drake 的学生,特别是 pydrake 和 Russ Tedrake 博士出色的欠驱动机器人课程。我正在尝试编写一个组合的能量整形和 lqr 控制器来保持手推车系统平衡直立。我的图表基于欠驱动机器人技术 [http://underactuated.mit.edu/acrobot.html] 第 3 章中的购物车示例,以及第 2 章中的 SwingUpAndBalanceController:[http://underactuated.mit.edu/pend .html]。

我发现由于我cart_pole.sdf model使用FramePoseVectorcart_pole.get_output_port(0). 从那里我知道我必须创建一个 BasicVector 类型的控制信号输出,以在馈入手推车的驱动端口之前馈入饱和块。

我现在遇到的问题是,我不确定如何在DeclareVectorOutputPort的回调函数中获取系统当前的状态数据。我假设我会LeafContext在回调函数中使用参数OutputControlSignal,获得BasicVector连续状态向量。但是,这个结果向量x_bar总是NaN。出于绝望(并进行测试以确保我的程序的其余部分正常工作),我设置x_bar为控制器的初始化cart_pole_context,并发现模拟以 0.0 的控制信号运行(如预期的那样)。我也可以设置output为 100,然后手推车模拟就飞入无尽的空间(如预期的那样)。

LeafSystemTL;DR:在扩展的自定义控制器中获取连续状态向量的正确方法是DeclareVectorOutputPort什么?

感谢您的任何帮助!我真的很感激 :) 我一直在自学,所以有点辛苦哈哈。

0 投票
0 回答
34 浏览

math - Unscented Kalman 滤波器线性非自变量

理论问题:

我有一个扩展卡尔曼滤波器,其中我的状态向量变量是线性独立的(例如,具有滚动-俯仰-偏航角的传统位置跟踪)。然后,在计算系统的雅可比行列时,过程非常简单(例如有限差分)。

但是,对于四元数雅可比行列式需要一些特殊处理(参见:http ://www.iri.upc.edu/people/jsola/JoanSola/objectes/notes/kinematics.pdf ,第 4.2 章,第 38 页。)。

据我了解,这背后的主要原因是,四元数变量(至少在单位四元数旋转的情况下)不是线性独立的(?)https://quaternions.online/见这里,如果你改变一个四元数参数,其他参数也会改变)。

现在我的问题是,Unscented Kalman Filter (UKF) 的情况如何?很明显雅可比在这种情况下是不必要的,但我仍然觉得这很重要。我可以使用常规方法计算sigma,还是必须将 4 个四元数参数视为我想要映射的“sigma 点”?

通常如何影响问题的不正确表述(状态向量元素的线性相关性)结果?

0 投票
0 回答
13 浏览

convex-optimization - 使用 LMI 约束执行凸优化

我怀疑是否有可能做这样的事情。假设我有一个类似这样的优化问题,目标函数的形式为 (xT)M(x),其中 xT 表示向量 x 的转置。现在我们必须最小化这个目标函数,并且 M 是要优化的矩阵变量,但是,我想通过将所有特征值设置为某个值来限制问题,因此只在矩阵 M 的特征向量上运行优化器。是这可能吗?有什么文件或其他我可以参考的吗?如果这个问题是微不足道的或完全愚蠢的,请原谅我,我是这个领域的新手。谢谢 :)

0 投票
2 回答
163 浏览

matlab - 如何离散非线性系统

我如何离散以下非线性系统。我使用 Matlab 和 Casadi 进行模型预测控制。常数 C 介于 0 和 1 之间。

感谢您的时间和帮助。