车轮覆盖的距离及其转动的角度物理和机器人

问题描述

让我试着描述一下我在做什么。

我正在尝试为吸尘机器人编写控制器代码。整个项目是在 Webots 平台内完成的。它的工作原理是当机器人碰到墙壁时,它会随机旋转一个角度并继续清洁房屋。

问题:我发现它转的金额不准确。如果我指定它转 90 度,它只转 60 度。如果我指定它转 360 度,它只转 240 度左右(视觉猜测)。

我找到了一个解决方法 - 一个临时的解决方法。我发现将角度乘以一定量 (1.2275) 会使角度非常接近问题中指定的真实角度。因此,如果我将要转动的角度指定为 180,并将其乘以 1.2275,我得到的值可能是 175 或 177(同样来自视觉猜测)。

问题是这个错误会随着时间的推移而累积。所以最初它可能只是 2-3 度的偏移,这没什么,但运行模拟超过 30 分钟,它可能会建立相对较高的数字。这是不可接受的。

我问了一个朋友,他建议我随着模拟的进行调整偏移量,这样偏移量就会随着错误而变化,但我觉得这是一个临时的解决方法

我希望能在物理方面得到一些帮助,因为我不太了解或不太了解它所涉及的机械领域。任何帮助将不胜感激。

下面提供了转弯功能代码

static void turn(double angle) {
    double l_offset = wb_position_sensor_get_value(left_position_sensor);
    double r_offset = wb_position_sensor_get_value(right_position_sensor);
    double orient;

    stop();

    angle = angle * ANGLE_OFFSET;   //the important part
    double neg = (angle < 0.0) ? -1.0 : 1.0;

    step();

    wb_motor_set_veLocity(left_motor,neg * HALF_SPEED);
    wb_motor_set_veLocity(right_motor,-neg * HALF_SPEED);

    do {
        double l  = wb_position_sensor_get_value(left_position_sensor) - l_offset;
        double r  = wb_position_sensor_get_value(right_position_sensor) - r_offset;
        double dl = l * WHEEL_RADIUS;  // distance covered by left wheel in meter
        double dr = r * WHEEL_RADIUS;  // distance covered by right wheel in meter

        orient = neg * (dl - dr) / AXLE_LENGTH; // delta orientation in radian

        step();
    } while (orient < neg * angle);

    stop();
    step();
}

让我对代码进行一些解释。 angle 显然指定了机器人转动的角度。第二行显示了我目前使用的解决方法。阅读接下来的几行代码,您可以看到机器人通过向后移动左轮和向前移动右轮来转动。它不断获取车轮覆盖的距离并检查条件。当该条件成立时,它停止转动。

我的猜测是 orient = neg * (dl - dr) / AXLE_LENGTH; // delta orientation in radian 这一行可能有问题。有小费吗?也许有人可以验证它的物理/力学方面是否正确?

解决方法

您能细分出所需角度与实际(视觉)角度之间差异的原因吗?我似乎潜入并修复这会比修补补丁更好地利用时间。