让我试着描述一下我在做什么。
我在尝试编写吸尘器机器人的控制器。整个项目都在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
这一行可能有问题。有什么提示吗?也许有人能验证它的物理/力学方面是否正确?
1条答案
按热度按时间f1tvaqid1#
你能找出期望Angular 和实际(视觉)Angular 之间差异的原因吗?我似乎潜入和修复这将是一个更好的利用时间比修补补丁。