从概念上讲(假设电动机对PWM的响应不同),如何实现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一样,您可以使用一对导向梁(彼此成直角)来校正一个直角坐标轴上的合成位置每次机器人通过其中一条光束时。
这里有很多选择,您选择哪种取决于您的需求。
评论
这个问题在这里也有它的位置,因为它专门基于Arduino PID库。