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

这里是我的方法:我将左边的区别右编码器将误差限制在某个范围内,将其归一化为[-1,1],然后将其映射到电动机功率0到1。因此,如果I和D为零,则误差为1 (因此,左马达的旋转程度要比右马达大得多),然后将左马达设置为0,将右马达设置为1(导致硬左)。

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

#1 楼


这有什么问题吗?


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


什么是更好的方法?


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

第一步是设置一对PID循环,每个轮子一个,给他们两个相同的需求位置。正如我在对类似问题的回答中所建议的那样,如果将两个轮子都保持在要求它们的位置非常紧密的误差范围内,那么将花费一些时间来积累足够的误差以引起明显的转向。 >
调整两个名义上独立的电机级PID回路比调整单个复杂,相互依赖的组合系统要容易得多。为了承受更高级别控制工作的任何变化,您确实需要每个电动机在尽可能长的时间内尽可能地与另一个电动机保持相似的性能,这确实需要单独的伺服回路。

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

一个问题是,即使您的左右车轮都移动了1000个编码器计数,您也可能在两次不同的运行中可能仍会以不同的位置结束。

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

有关更多信息,请参阅我对类似但不太重复的问题的回答:如何使用Arduino PID库直线驱动机器人?
以及我对相关的线路跟随器优化的回答

#2 楼

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

我选择使用陀螺仪使其保持在所需的方向,颠簸滑行甚至将其拾起并转过来对它都没有多大影响,因为它只会纠正其航向。 />
我使用单个PID,该PID根据陀螺仪确定的当前航向(方向)中的误差,对2个电机中的每个电机的期望电流速度进行加/减校正。 >
例如,我将速度设置为50%,将航向设置为20度。这通常会以50%的功率驱动两个电动机。但是随着航向的消失,PID会进行调整,从而为一台电动机增加一些功率,并从另一电动机上去除一些功率,因此当pid校正航向时,您可能最终会在电动机之间分配45%/ 55%的功率。

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

如前所述,车轮上的编码器对于实际知道您走了多远是一个好主意。

评论


$ \ begingroup $
我希望看到您的代码。我正在使用陀螺仪/加速度计/磁力计沿着同一条路走,但我仍处于尝试从这些传感器的读数中弄清楚的早期阶段。
$ \ endgroup $
–罗恩·史密斯
17年8月9日在2:09

$ \ begingroup $
这是我的代码的链接,恐怕它可能不容易理解。 github.com/rlsutton1/piBot/blob/master/src/main/java/au/com / ...
$ \ endgroup $
–罗伯特·萨顿(Robert Sutton)
17年8月10日在3:18