C语言 车轮覆盖的距离和它转动的Angular (物理学和机器人学)

nnsrf1az  于 2023-05-16  发布在  Angular
关注(0)|答案(1)|浏览(110)

让我试着描述一下我在做什么。
我在尝试编写吸尘器机器人的控制器。整个项目都在Webots平台上完成。它的工作原理是,当机器人撞到墙上时,它会随机转动一个Angular ,继续打扫房子。
问题是:我发现它转的量是不准确的。如果我指定它旋转90度,它只旋转60度。如果我指定它旋转360度,它只旋转240度左右(视觉估计)。
我找到了一个解决办法-一个临时的解决办法。我发现将Angular 乘以一定的量(1.2275)将使Angular 非常接近问题中指定的真实的Angular 。因此,如果我指定旋转Angular 为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显然指定了机器人转动的Angular 。第二行显示了我当前使用的解决方法。阅读下面的几行,你可以看到机器人通过向后移动左轮来转弯,右轮向前移动。它不断地获得车轮覆盖的距离并检查条件。当该条件为真时,它停止转动。
我的猜测是orient = neg * (dl - dr) / AXLE_LENGTH; // delta orientation in radian这一行可能有问题。有什么提示吗?也许有人能验证它的物理/力学方面是否正确?

f1tvaqid

f1tvaqid1#

你能找出期望Angular 和实际(视觉)Angular 之间差异的原因吗?我似乎潜入和修复这将是一个更好的利用时间比修补补丁。

相关问题