想象一下为一个三轮足球机器人编程。您将使用哪种类型的控制器来旋转它? P? PID?

该控制器的目的在于,它应使机器人以规定的角度(0度)站立,并在用手或其他机器人旋转时返回。

我为机器人而不是伺服器使用步进电机,所以我需要在软件中实现它!

我已经编写了一个样本P型控制器,并且运动相当好。但是,如果可能的话,我想做得更好。代码如下:

void spinSpeed(int devidedValue, int addedValue, int correction) {

    if(degree<correction && degree>-correction) {
        motorSpeed = 0;
    } else {
        if(degree > 0) {
            motorSpeed = ((degree)/(devidedValue) + (addedValue));
        } else {
            motorSpeed = ((degree)/(devidedValue) - (addedValue));  
        }
    }
}


correction是一个范围,其中机器人没有运动。
degree是从指南针返回的-127到128之间的数字。
motorSpeed是从0到255之间的数字,适用于PWM。

评论

大概是每当compas生成一个新的度数值时,都运行此例程吗?

@MarkBooth我的代码在while(1)中,因此在每个循环中,它都会从罗盘获取值并将其提供给函数,然后将结果应用于电动机。

我将研究伺服系统使用哪种控制器,因为您试图在软件中复制伺服系统行为。

我不使用伺服器。我使用步进电机,所以电机中没有这种行为。

嗨,Miro,在堆栈交换中,最好根据评论中的问题来编辑您的问题,这样可以整理(删除)评论,以免分散他们对问题本身的注意力。

#1 楼

PID控制回路要记住的重要一点是,每个术语旨在在移动过程中的不同时间支配控制。

比例术语旨在支配并提供更大的转矩(或表壳速度)离目标位置越远。

派生术语旨在在典型梯形运动的“巡航”阶段占主导地位。当您离目的地较远时,它有助于重新控制非常高的比例项并限制失控加速度,但是当靠近目的地时,它也有助于提高收敛于目的地的速度,并且比例项的贡献要小得多。

如果使用速度控制器而不是扭矩控制器,则导数项实际上可能隐藏在速度控制器内部,并且PID回路无法直接访问。这可以使控制变得更简单(通常,它会尽可能快地加速到所需速度或最大速度,以较低者为准),但也可能会使控制变得困难。通常,过于激进的D(或P)项可能会导致进入极限循环(由于在这种状态下电动机的嗡嗡声或什至是尖叫声,通常会错误地称为共振或振荡,尽管极限循环是更准确的描述)。

积分项可以纠正残余的稳态误差,也就是说,您被要求去的地方与您实际去的地方之间存在长期的长期差异。您当前的correction(实际上只是容差)值的作用类似于积分项的相反值,当您位于所需位置附近的死区中时,它将完全切断电动机。

由于这些因素,您将获得除非您还计划在具有明显的加速,巡航和减速阶段的速度曲线中进行规划,否则几乎不会实现完整的PID回路。

还请记住,死区和缺少I术语将意味着最终位置将始终是随机的,并且很可能会根据您接近所需位置的方向而有所不同。因此,您的双向可重复性可能会比标准可重复性差得多。

有关准确性,可重复性和分辨率之间差异的更多信息,请参见此出色的说明。在您的情况下,您的分辨率就是您的罗盘传感器,而精度和可重复性都可能受correction值的限制,因为如果correction值大于您的罗盘分辨率,则您会舍弃一些位置精度以换取可以在关闭时关闭电动机。

#2 楼

PID控制器是最好的,使用指南针是一个相对简单的任务,即获取机器人的轴承并将其与您想要获得的轴承进行比较,并使用一些PID调整技术来实现平稳的转向运动。您想要的标题。这种方法也可以应用于精确地旋转给定的量。 ..

评论


$ \ begingroup $
感谢您的回答。我想接受答案,但我想看到更多答案,所以当有更多答案时,我会接受;)
$ \ endgroup $
– Miro Markaravanes
2012年10月23日在20:13