作为一个团队,我们决定在编码器和操纵杆的帮助下驱动我们的机器人。即使机器人是由操纵杆控制的,我们也希望能够直线行驶。我们不知道如何实现这一目标,因为一台电机显然速度较慢。此外,我们在屏幕上显示编码器值,但它们似乎在 25 左右的整数之后停止,而它们应该随着显示旋转计数而增加。你们能帮我们解决这个问题吗? 我们正在使用 FRC 库。 图书馆在这里
public class Robot extends IterativeRobot {
Victor Motor0= new Victor(0);
Victor Motor1= new Victor(1);
DifferentialDrive drive= new DifferentialDrive(Motor0,Motor1);
Joystick stick=new Joystick(0);
double dist =0.5*3.14/1024;
Encoder esit= new Encoder(0,1,true,Encoder.EncodingType.k4X);
Encoder esit1 = new Encoder(2,3,true,Encoder.EncodingType.k4X);
double m0 = esit.get();
double m1 = esit1.get();
double fark = m1 - m0;
double gidilen_mesafe1 = esit.getDistance();
double gidilen_mesafe2 = esit1.getDistance();
public void robotInit() {
esit.setDistancePerPulse(dist);
esit1.setDistancePerPulse(dist);
esit.reset();
esit1.reset();
}
public void autonomousInit() {
}
public void autonomousPeriodic() {
}
public void teleopPeriodic() {
drive.arcadeDrive(stick.getRawAxis(0), stick.getRawAxis(1));
SmartDashboard.putNumber("Tekerlek1", esit.get());
SmartDashboard.putNumber("Tekerlek2", esit1.get());
SmartDashboard.putNumber("Aradaki Fark", fark);
SmartDashboard.putNumber("Mesafe 1", gidilen_mesafe1);
SmartDashboard.putNumber("Mesafe 2", gidilen_mesafe2);
boolean m_stop = esit.getStopped();
boolean m1_stop = esit1.getStopped();
if(m_stop==false && m1_stop==false) {
esit.reset();
esit1.reset();
}
}
public void testPeriodic() {
}
}
我不确定你的程序中发生了什么,但似乎你只读取编码器值一次 - >这可以解释为什么该值不变。您可能希望在某种循环中读取编码器值,以便您的读数不断更新。
关于直线移动,您可以尝试使用PID(比例、积分、微分)控制器,其中编码器值的差异就是误差。根据差异,您的程序可以决定转动的急剧程度(即缩放电机速度)以纠正漂移。
这篇文章是一个很好的起点:https://robotics.stackexchange.com/questions/1711/approach-to-using-pid-to-get-a- Differential-robot-driven-straight