我想创建一个基于Arduino的机器人,该机器人具有2个轮子,每个轮子上的正交编码器,一个H桥驱动器芯片(或电机控制器)和一个脚轮。我想使用PID库来确保速度与行进距离成正比。

从概念上讲(假设电动机对PWM的响应不同),如何实现PID控制,使其以直线运动,速度与所剩距离成正比。旅行?

评论

这个问题在这里也有它的位置,因为它专门基于Arduino PID库。

#1 楼

细节

以PID基本示例为例,我认为您只需要实例化PID控制器的两个副本,每个车轮,编码器和pwm一个:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);


然后,用等效的loop(),您只需读取两个编码器,将每个编码器值传递给相关的PID,最后写出两个PWM值。具有相同的值,但是像这样单独定义它们可以使您添加以后转弯的功能。足够的大小实际上取决于您需要的直线精度。

航位推算

如果运行两个PID回路并进行比较,则每个车轮上都有编码器车轮的跟随误差,那么假设您的车轮不打滑,则有可能计算出整个距离上的最大阿贝误差。如果该误差小于您的要求,那么就需要进行推算。

但是,如果车轮容易打滑,则可能是隐藏的跟随误差,您的控制系统无法检测到并跟踪。您将需要某种方式来独立于车轮编码器检测滑移或计算位置,然后使用高级软件校正所需的车轮位置/速度以保持直线。

相对位置确定

正如John所建议的那样,您可以使用加速度计来确定位置,但是鉴于其准确性以及随着时间的推移累积的误差的影响,您最好使用加速度计数据来检测和校正车轮打滑。

在移动机器人中,卡尔曼滤波技术通常用于融合来自多个来源的数据,例如加速度计和车轮编码器,以便更好地确定当前位置。

但是,无论您如何进行相对位置确定,随着时间的推移,您认为自己所处的位置都会偏离实际身体位置。

绝对位置确定

唯一的方法要解决这个问题,就是在您的车辆参照系之外建立参考点。

例如,Roomba通常使用推算法在房间内移动,但是只要需要停靠,它就会充电座发出的一束红外光。当Roomba随机移动通过该光束时,它会检测到它,锁定在光束上,然后将其返回到其源头。结合其碰撞传感器,它可以准确地将自己定位在充电触点上。位置。此时,它可以准确知道它的位置,并可以报告它的计算位置与实际位置之间的距离。

另一种选择,如果您需要机器人沿数百米的直线直线行驶,可以切换到其他技术,例如添加Arduino GPS屏蔽。这些技术的组合。

如果可以使用导向梁,则可以使用不可见的线跟随技术非常简单地完成所需的操作。如果您需要在约束区域内以任意直线移动,则像Roomba一样,您可以使用一对导向梁(彼此成直角)来校正一个直角坐标轴上的合成位置每次机器人通过其中一条光束时。

这里有很多选择,您选择哪种取决于您的需求。

#2 楼

如果您不是使用单个轴来驱动两个车轮,那么我看到的唯一解决方案是添加一个3轴加速度计或另一个传感器来检测机器人的方向,并相应地调整每个电机的信号。 br />

#3 楼

如上所述,您首先要告诉每个车轮以相同的速度运动,然后PID确保它们以该速度运行。但这不是完美的。您需要继续检查和纠正错误(1)定期读取和比较两个车轮编码器的计数,并在需要时使一个车轮略快一些,以使计数相等。和(2)编码器绝对不是完美的选择,您需要一个加速计和一个指南针。如果您想组合编码器,指南针和加速度计数据来确定航向。

#4 楼

该链接给出了一个很好的示例,无需进行两次PID计算。您也可以实现imu / compass来测量直线路径