我正在尝试控制线性执行器的速度和位置。

此时,我可以控制位置或速度。但是我试图控制两者。控制该怎么做:让线性执行器以1cm / s的恒定速度驱动到0至100 cm的位置。

我使用PWM信号控制执行器。然后,我使用轴上的位置传感器测量速度和位置。

首选哪种控制方式,级联PID? />还有其他控制功能会更好吗?

,谢谢! >
我想要一个速度控制的位置控制器。也许有一种简便的方法,无需太多计算能力即可将其更改为s-curbe。然后加速/加速将变得更加平滑。
我让微控制器随后计算3个不同的公式,它将使用循环迭代来计算它。这样,我可以为位置使用一个PID。以下代码中的参数是虚构的:上面的代码的一个大问题是,加速循环的数量是一个常数。除非您已经知道将要执行的循环数量,否则就无法更改它。无论如何,除非负载太高,否则他们将无法通过它进行通信。这将使主/从成为不可能。系统也必须是模块化的:在电路上增加另一个执行器不会有问题。执行器通过使用PWM信号进行速度控制。线性传感器将提供一个0-10v的信号,通过一个简单的分压器将其降低到0-5v。循环大约需要5到10毫秒,具体取决于最大循环时间。

Arduino有一个10位(1023)ADC,但是使用过采样我可能会尝试将其增加到12位。为了不降低读取速度,我将降低ADC的预分频器。

PWM输出为8位(255),我试图找到一种进一步提高方法。因为我认为255个步骤对我的应用程序来说太低了。

由于Arduino的内部存储器有限,所以不可能预先计算所有位置。

谢谢大家的帮助到目前为止!

评论

您是否看过前馈,对系统/扰动了解什么?

欢迎来到机器人堆栈交换KoenR。如果您对其进行了编辑以提供您在答案中添加的所有信息,则可以改善问题。这样一来,人们不必阅读每个答案和对这些答案的任何评论,就可以查看您要执行的操作的详细信息。

您的PWM控制什么?我的假设是转矩(流向电动机的电流),但了解您的PWM是否连接到速度甚至位置控制输入将很有用。
另外,为了让我们了解您系统的约束条件,您可能需要简短地提及编码器的预期分辨率,控制器的周期时间,要达到的速度范围以及位置/速度误差是可以接受的。不需要精确的细节,但是粗略的数字将使我们对您说“想要精确的位置和速度”的意思有所了解。它们永远不可能是“精确的”,并且您在不确定性原则生效之前就已经达到编码器分辨率极限。
谢谢你的帮助。我将问题更新为我认为更清楚的内容。

#1 楼

首先要意识到的是这不是控制问题,这是计划问题。如果将两者混为一谈,则会使生活变得比原本要复杂的多。

解决方案-运动计划

实现所需目标的传统方法是拥有两个循环。外部计划/监控回路会为特定的时间点生成航路点,而较低级别的PID回路会生成适当的PWM信号,以使电动机尽可能靠近那些航路点。生成的航路点越多,您就可以越紧密地跟踪速度和位置。较旧的系统通常以比其整数PID循环低得多的速率运行其浮点规划循环,但是如今,即使是谦虚的微控制器也具有足够的计算能力,能够以PID控制速率进行多轴的完整轨迹规划。 />
简单示例

尽管您绘制的示例是S曲线轨迹轮廓,但通过查看简单的梯形轮廓更容易解释原理。 />比方说,您想在9秒内从0mm移到36mm,巡航速度(进给速度)为6mm / s,加速度为2mm / s / s。您可以按照以下9个步骤计划移动:

\ begin {array} {| r | r |}
\ hline
时间&t&0&1&2 &3&4&5&6&7&8&9 \\
\ hline
加速度&a&0&2&2&2&0&0&0&-2&-2&- 2 \\
速度&v&0&2&4&6&6&6&6&4&2&0 \\
位置&d&0&1&4&9&15& 21&27&32&35&36 \\
\ hline
\ end {array}

在这种情况下,在时间$ t = 0 $时,您将位置$ d = 1 $注入到PID中(如果PID回路具有加速度和速度前馈,则加上加速度$ a = 2 $和速度$ v = 1 $)。在$ t = 1 $处,您将$ d = 4 $注入您的PID,依此类推,直到$ t = 8 $,您命令PID移至最终位置$ d = 36 $,然后在$ t = 9 $系统应该已经停止移动。

实现

系统的限制将限制您的实现。


如果您使用的是CPU受限于您的微控制器,但有足够的存储空间来存储路径配置文件,您可能需要预先计算航路点。
如果您有大量CPU,则可能需要动态计算航路点。
如果CPU和内存都受限制,则可能需要降低航点生成频率或使用整数间隔算法来更快地计算近似值。

并发症

如果发现执行器在路径点之间跳跃而不是平滑移动,则需要减少路径点之间的时间或针对运动优化(调整)PID回路(例如,减小比例增益,增加导数增益和/或增加速度/加速度前馈增益)。但是,从开始使用PID回路调整预期运动的那一刻起,就使其他类型的运动的运动变得更糟。

我从评论中看到,您希望两个线性执行器相互匹配。

在这种情况下,虽然每个执行器的PID回路都需要独立运行,但是可以共享这些PID回路的航路点输入。

每个回路有多近伺服环路是否彼此跟随将取决于它们遵循路径点定义的理想轨迹的紧密程度。

如果您对单个PID回路的调整足够好,并且您对跟随误差设置了合理的限制,则两个执行器之间的总误差最多应该是其跟随误差的总和,并且平均而言可能要小得多。 >
顺便说一下,我的经验来自为2x2m双龙门直角坐标机器人编写控制软件。即使我们以1g的速度将龙门架加速至1m / s,我们的跟随误差也很少超过几百微米,并且龙门架两端之间的误差通常要低一个数量级。如果我们使用的是S曲线而不是梯形的运动曲线,则我们的误差可能还会低一个数量级,但这是90年代,微控制器的浮点性能要低得多,因此我们选择了简单快速复杂而缓慢。

#2 楼

我想说这个问题与空中加油问题非常相似:一个反馈控制器的草图,然后在https://robotics.stackexchange.com/a/5263/6941中解释其一种可能的解决方案。

EDIT

使系统在$ T $秒内从初始位置$ x_0 $移至所需位置$ x_d $的最小加速度位置配置文件(即s曲线)为:

$$
x \ left(t \ right)= x_0 + \ left(x_d-x_0 \ right)\ cdot \ left(10 \ left(\ frac {t} {T } \ right)^ 3-15 \ left(\ frac {t} {T} \ right)^ 4 + 6 \ left(\ frac {t} {T} \ right)^ 5 \ right),
$$

其中$ t \ in \ left [0,T \ right] $指定时间间隔,即设定点的数量。

最后,$ x \ left(t \ right)$将作为位置PID的参考。

评论


$ \ begingroup $
我想我还有其他想法,您可以检查一下我的编辑吗?提前致谢
$ \ endgroup $
–KoenR
15年6月15日在16:15

$ \ begingroup $
尝试回答以下问题:如果提供了一个PID控制器来使系统非常精确地跟踪位置,该怎么办?位置反馈的导数如何?
$ \ endgroup $
– Ugo Pattacini
15年6月15日在17:29

$ \ begingroup $
因此,您的想法是计算一段时间内所有不同的位置。然后要控制它在整个过程中的位置?谢谢您的回答
$ \ endgroup $
–KoenR
2015年6月16日在10:06



$ \ begingroup $
这是输入整形技术框架下的一种标准技术。无论如何,如果您想仅控制速度(例如,您描绘的梯形波形),也必须提供变化的参考。
$ \ endgroup $
– Ugo Pattacini
2015年6月16日在10:11



$ \ begingroup $
更清楚地说,存在许多将逐步输入过滤为平滑变化参考的块,因此不需要逐点计算参考轨迹。
$ \ endgroup $
– Ugo Pattacini
15年6月16日在10:14

#3 楼

我认为您无法同时控制速度和位置-如果您不更改位置参考值但有一些非零速度参考值会怎样?您是否要使输出保持静止或达到命令速度?

我认为您正在寻找的是软件施加的执行器权限限制。在这种情况下,您可以限制控制器的输出。我不知道您的执行器输入是什么,但是对于控制器,我会尝试类似的操作:

您对执行器的输入是。上面的模型假定PID控制器的输出是传递给执行器的参考速度。您可以限制传递给执行器的速度给定值,从而提供电子形式的执行器饱和度。控制器将继续控制越来越高的速度,直到到达接近参考位置的位置为止,此时它将开始后退。它会退回到outputLimit下方,此时电子饱和度会降低,并且控制会像往常一样恢复。

如果执行器使用位置输入并确定其自身的速度响应,则执行器可能使用比例控制器,其中利用的执行器速度由下式给出:

vActuator = $(1 / \ tau)$(positionRef-positionFbk);

其中$ \ tau $是执行器的时间常数。在这种情况下,只要可以测量或估计时间常数,就可以估算执行器速度并节流到达执行器的位置。恢复上面的代码:

dT = sampleTime;
input = positionRef;
feedback = positionFbk;
outputLimit = actuatorSpeedLimit;

errorP = input - feedback;
errorI = errorI + errorP;
errorD = (errorP - prevError)/dT;
prevError = errorP;

output = kP * errorP + kI * errorI + kD * errorD;

if abs(output) > outputLimit
  output = sign(output) * outputLimit;
end


同样,在此示例中,控制器输出是传递给执行器的位置,而不是传递给执行器的速度。如果为执行器提供加速度,则可以执行相同的操作,但是我认为我从未见过线性执行器接受加速度作为输入。

:编辑:

尽管已将此问题标记为已回答(并且我已经被否决了!),但我还是补充说,您可以拆分控件。使用PID来达到命令设定点,另一个执行器使用PID来根据第一个来调节其速度。这将设置一个主站/从站或领导者/从站,其中主站遵循位置参考,而从站遵循主站。

与任何其他PID控制器一样,您可以将从站调整为想要达到所需速度差公差的任何阈值。

评论


$ \ begingroup $
非常感谢您的详细回答。我还研究了最大速度的降低。虽然这带来了一些问题。 [加上下一条评论]
$ \ endgroup $
–KoenR
2015年6月16日在10:05



$ \ begingroup $
我希望位置和速度都准确。原因:我正在尝试使两个线性执行器彼此同步。因此,应同时控制速度和位置。速度是最重要的控制条件。但是,当我按照您的答案中所述用标准PID控制速度时。执行器不会停在给定的最终位置。速度的PID +位置上的迟滞会更好吗?因此,当结束位置越来越近时,速度呈指数下降。
$ \ endgroup $
–KoenR
15年6月16日在10:05

$ \ begingroup $
如果将这些信息特别编辑成您的问题@KoenR,这将非常有帮助。
$ \ endgroup $
– Mark Booth♦
2015年6月16日19:41

$ \ begingroup $
将pwm输出限制为固定值是行不通的。如果一台电动机以期望的速度运行,而另一台电动机却没有,则跟随者将永远无法追赶,并且跟随误差只会增加。这就是每个执行器的PID控制器必须独立的原因-如果一个执行器落后,则需要让它更加努力地追赶。同样,通过将相同的航路点需求位置馈入两个独立的控制回路,您将获得更好的响应,而如果您将一个从站切换为另一个(从站实际上将具有两倍的时间常数!)。
$ \ endgroup $
– Mark Booth♦
2015年6月16日在20:12



$ \ begingroup $
是的,我现在明白了。我最初的回答是基于他的最初问题:“我正在尝试控制线性致动器的速度和位置。” (强调)。我读过“ a”的意思是“一个”,意思是,我认为他试图在限制一个执行器速度的同时对一个执行器进行PID位置控制。直到今天早上他在上面发表评论时,我才意识到他试图同步两个执行器。
$ \ endgroup $
–卡盘
2015年6月16日在20:44