我正在构建线路跟随机器人,并希望优化其性能。有人建议我使用PID算法。我阅读了很多有关PID的内容,但对以下内容感到有些困惑:

我已经使用$ k_p *比例+ ... $
计算了error_value,但是关于电动机速度的变化我对比较期间要使用的差异(即当前位置-设定点)或误差值感到困惑。那就是我应该使用

if (difference > 0)
{ //code for changing appropriate motor's speed using error_value }




if (error_value > 0)
{ //code for changing appropriate motor's speed using error_value }


也有任何指定范围的值常量$ k_p $,$ k_i $和$ k_d $?
我正在使用差动轮式机器人作为线路跟随器。用于改进直线跟随器机器人的高级优化算法。

评论

我不确定您使用的是什么术语,但是在控制系统术语中,您的“差异”是错误值,而(我所能说的)您的“ error_value”是控制命令。
您好,变量$ K_ {p} $例如是您的比例增益。您熟悉控制理论吗?

@leCrazyEngineer我不记得这个问题的大部分了,就像3年前一样。我也不知道控制理论。也许回答的家伙会有一些线索。

#1 楼

当使用PID回路通过行跟随进行转向时,您的设定点将始终相同。您将始终希望直线相对于机器人处于相同位置,例如在传感器的中心。

因此,如果直线传感器输出的值从-1到1且为0作为传感器的中心,那么您将希望设定点为零(并且传感器的回读和差值将相同)。如果线传感器输出的值为0到10,那么您将希望设定点为5(并且传感器的回读和差值将有所不同)。车轮以不同的速度旋转,然后以恒定的速度平稳地跟随一条线,您可能需要根据误差调整两个车轮的速度。例如,如果您需要左转以保持在直线上,则可以降低左轮速度并加快右轮速度。您需要转动的次数越多,则越需要减慢内轮的速度,而就越需要加快外轮的速度。 $弧度向左校正错误$ e $,而您当前的速度为$ S_0 $: \ theta $和您的右轮需要以$ S_R =(r + b)\ theta $行驶。

要保持相同的整体速度$ S_0 $,您需要$ S_0 =(r + b / 2)\ theta $,
,因此左轮将需要以$ S_L = S_0行驶-(b / 2)\ theta $
而右轮将需要以$ S_R = S_0行驶+(b / 2)\ theta $。

由于误差趋于零,因此每个电动机的速度也趋于彼此。随着误差的增加,速度差也会增加。

如果您的传感器告诉您,直线弯曲的程度比轮子之间的距离更紧密,您甚至可能需要使内轮向后旋转。这些都是复杂性,但是随着控制变得越来越复杂,您可以逐步解决这些问题。

此外,由于您的错误将同时具有正值和负值(以表示超出标尺的连续区域)。 ..距离太远...在行上...距离太远...不在比例尺右边,那么您永远不必问if误差是正还是负,您应该仅基于误差值计算新值,因为正值和负值应该对电动机产生相反和对称的影响。其他项为零)。实施微分项可以使您将比例增益项推得更高,以获得更灵敏的系统,但是积分项可能无济于事。错误会变大,意味着您的机器人身体运动不管怎样,s都将像一个积分项。

P,D和I的具体值将由系统的响应度决定。有关调整PID参数的一般建议,请参阅我的答案以及其他有关调整PID回路的好的策略?

评论


$ \ begingroup $
根据您的说法,“您应该只基于误差值计算新值,因为正值和负值对电机产生相反和对称的影响。”但是,如何确定哪个电动机可以产生错误影响?
$ \ endgroup $
–流星
13年7月2日在15:52



$ \ begingroup $
@AnkitShah他们俩都做。希望我的更新会更好地解释它。
$ \ endgroup $
– Mark Booth♦
13年7月2日在17:45

$ \ begingroup $
谢谢@Mark Booth,他真的解释了这些内容。我没有足够的代表。在网站上投票支持您的答案,但实际上这很好解释。
$ \ endgroup $
–流星
13年7月3日于13:52

$ \ begingroup $
很高兴我可以帮忙@AnkitShah-如果您编辑问题以消除某些歧义(例如您是使用差速转向还是ackermann转向),那么至少我和其他人也可能会赞成。如果您听别人提出的建议,很快就可以获得15次代表。
$ \ endgroup $
– Mark Booth♦
13年7月3日在16:22

$ \ begingroup $
感谢@Mark,还有其他算法可以帮助减少错误并使机器人更平稳地移动并遵循规则吗?
$ \ endgroup $
–流星
13年7月3日在20:04

#2 楼

您可能需要检查有关如何调整PID的问题。

听起来您在混淆error在此计算中的作用。 PID方程进行误差测量(实际位置-所需位置),并确定应在控制器中发出多少“响应”指令(例如,多少力)。

因此,您不必像说if (error_value > 0) { }那样说。根据您的特定车辆的构造,该响应将作为节气门量,作为所需角度的转向或其他控制输入发送到驱动马达。

评论


$ \ begingroup $
这是我的arduino代码的链接,您有何建议。 www1.datafilehost.com/d/5dcbdd4e
$ \ endgroup $
–流星
13年7月2日在16:00

$ \ begingroup $
这取决于机器人在做什么错?
$ \ endgroup $
–伊恩
13年7月2日在18:35