使用PID获得差动机器人直线驱动的方法


13

考虑一个差动驱动机器人,该机器人具有两个电动轮,每个电动轮都附有一个编码器,用于反馈。假设每个DC电动机都有一个功能,其浮点数从-1到1,并设置PWM信号以向该电动机提供成比例的功率。不幸的是,并非所有电机都相等,因此向每个电机发送相同的PWM信号会使机器人转向左侧或右侧。我试图考虑如何使用附加到每个电机的编码器作为PID回路的输入来直线驱动机器人。

我将执行以下操作:我将左右编码器之间的差取整,将误差限制在某个范围内,将其归一化为[-1,1],然后将其映射到电机功率0至1。因此,如果I和D为零,并且我们得到的误差为1(因此,左马达的旋转比右马达大得多),则左马达将设置为0,右马达将设置为1(造成硬剩下)。

这有什么问题吗?有什么更好的方法?

Answers:


5

这有什么问题吗?

这样做的主要问题是,虽然您提出的解决方案可以立即纠正电动机性能之间的不匹配,但不能纠正累积的误差,更不用说诸如阿贝误差之类的更复杂的位置误差了(请参阅下文)。

有什么更好的方法?

您可以执行几项操作,具体取决于您对错误的容忍度以及要为纠正错误付出的努力。

第一步是建立一对PID回路,每个车轮一个,分别给它们两个相同的需求位置。正如我在对类似问题的回答中所建议的那样,如果将两个轮子都保持在要求它们的位置的非常严格的误差范围内,那么将花费一些时间来积累足够的误差以引起明显的转向。

调谐两个名义上独立的电动机水平PID回路比调谐单个复杂的,相互依存的组合系统要容易得多。为了经受住更高级别控制工作的任何变化,您确实需要每个电动机在尽可能长的时间内尽可能地与另一个电动机保持相似的性能,这确实需要单独的伺服回路。

但是,还有许多其他的复杂情况,这取决于您需要什么精度以及您准备付出多少努力来纠正它们,以寻求哪种解决方案。航位推算可能就足够了,或者您可能需要在机器人中添加相对或绝对位置确定。

一个问题是,即使您的左轮和右轮都移动了1000个编码器计数,您仍然可能在两次不同的行程中最终处于不同的位置。

例如,假设您的最大跟随误差为10个编码器计数,并且您的电机以每个PID循环迭代10个编码器计数的速度运行。您的左马达可能会移动5,10,10,10 ... 10,5,而您的右马达可能会具有4,11,10,10 ... 10,5的轮廓,甚至在开始时的加速度也略有不同此举可能导致机器人朝错误的方向出发。不仅如此,您朝该方向移动的越远,绝对误差就会越大。这就是我们谈论Abbe错误时所要谈论的内容,并且如果没有复杂的运动学模型或某种外部参考,您将永远无法对其进行校正。

有关更多信息,请参见对类似但并非完全重复的问题的回答:如何使用Arduino PID库直线驱动机器人? 还有对相关的线路跟随器优化的回答


2

我有一个带有2个独立驱动的车轮的机器人。

我选择使用陀螺仪将其保持在期望的方向上,颠簸滑移,甚至将其拾起并转过来对它都没有多大影响,因为它只会纠正航向。

我使用单个PID,它根据陀螺仪确定的当前航向(方向)中的误差,对2个电动机中的每一个电动机的期望电流速度进行加/减校正。

例如,我将速度设置为50%,航向设置为20度。这通常会以50%的功率驱动两个电动机。但是随着航向的消失,PID会进行调整,从而为一台电动机增加一些功率,而从另一电动机上去除一些功率,因此当pid校正航向时,您可能最终会在电动机之间分配45%/ 55%的功率。

陀螺仪有他们的问题,即使花了一些时间进行校准,我仍然发现我的陀螺每分钟漂移约1度。可能是因为地球每小时旋转15度,从长远来看也应该考虑这一点。

如前所述,轮毂上的编码器是一个真正了解您走了多远的好主意。


我希望看到您的代码。我正在使用陀螺仪/加速度计/磁力计开始同一条路,但我仍处于尝试从这些传感器的读数中弄清楚的早期阶段。
罗恩·史密斯

这是我的代码的链接,恐怕可能不容易理解。github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…–
罗伯特·萨顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.