【问题标题】:Driving the Robot Straight Using Encoders and a Joystick使用编码器和操纵杆直接驱动机器人
【发布时间】:2023-04-02 08:22:02
【问题描述】:

作为一个团队,我们决定在编码器和操纵杆的帮助下驱动我们的机器人。即使机器人是由操纵杆控制的,我们也想直接驾驶我们的机器人。我们不知道如何实现这一点,因为一台电机显然更慢。此外,我们在屏幕上显示编码器值,但它们似乎在 25 左右的整数后停止,而它们应该随着显示旋转次数而增加。你们能帮我们解决这个问题吗? 我们正在使用 FRC 库。 library here

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() {
        }
    }

【问题讨论】:

  • “我们不知道如何实现这一点,因为一台电机显然更慢。” - 为什么一台电机慢?
  • 老实说,我们不确定,但电流可能不会平均分配,但我们认为修复它的最佳方法是修复软件。但是,我们只是猜测:)
  • 这也可能是与代码相关的问题,但这正是我们需要帮助的原因:/

标签: java robotics robot encoder


【解决方案1】:

我不确定您的程序中发生了什么,但您似乎只读取了一次编码器值 -> 这可以解释为什么值不变。您可能希望在某种循环中读取编码器值,以便您的读数不断更新。

关于直线运动,您可以尝试使用 PID(比例、积分、微分)控制器,其中编码器值的差异就是误差。根据差异,您的程序可以决定转向多快(即调整电机速度)以校正漂移。

这篇文章是一个很好的起点:https://robotics.stackexchange.com/questions/1711/approach-to-using-pid-to-get-a-differential-robot-driving-straight

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    相关资源
    最近更新 更多