关于利用MPU8060的数据达成z轴旋转角度控制的问题
-
我想用机器人做给定角度的旋转,下面是我的代码
void Motor::spin_with_angle(float angle, int speed_ratio, bool clockwise) { spin_mode(speed_ratio, clockwise); if(!clockwise){ angle = -angle; // If not clockwise, reverse the angle } Serial.printf("Spinning with angle: %.2f degrees, speed: %d, clockwise: %d\n", angle, speed_ratio, clockwise); imu.mpu.update(); // Update the IMU data float present_angle = imu.getAngle('z'); // Get the current angle from the IMU float target_angle = _calTargetAngle(angle, present_angle); // Calculate the target angle printf("Current angle: %.2f, Target angle: %.2f\n", imu.getAngle('z'), target_angle); while( clockwise ? imu.getAngle() < target_angle : imu.getAngle() > target_angle ) { printf("Current angle: %.2f, Target angle: %.2f\n", imu.getAngle('z'), target_angle); // Continuously check the angle until the target angle is reached delay(10); imu.mpu.update(); // Update the IMU data } spin_mode(0, true); // Stop the motors after reaching the target angle // Implement the actual spinning logic here }
他的逻辑很简单,就是先算当前角跟目标角,然后开始转,并持续跟踪,等到到达后就停止,但结果我发现无论怎么设置,甚至我人为给目标角加上一个修正项(大概-20°),他还是会在我设置90度时转动到100多度,我测试下是每10次90°旋转大概转3圈(这个还挺精准的,我试过多次,都是大概10次3圈,相差不会大于+-10°),也就是每次大约都会转108°,即使我设置让他转70°,他还是会转这么多。这有什么解决的办法吗
我把mpu封装到了Imu类里,这个类只有一个mpu的实例和一些函数的简单再封装,而Motor类就定义了一些操作马达的函数,spin_mode就是设置pwmratio和顺时针还是逆时针。
我比较希望有离线的方案,因为我需要用到的测试软件只能在windows下用,但如果要无线链接又得用linux版本,而且我期望的测试目标是绕一个固定的路线,所以期望他的旋转角能精度比较高。
-