Прямое вождение робота с использованием кодеров и джойстика - PullRequest
0 голосов
/ 11 января 2019

Как команда, мы решили управлять нашим роботом с помощью кодировщиков и джойстика. Мы хотим вести нашего робота прямо, даже если он управляется джойстиком. Мы не знаем, как этого добиться, поскольку один двигатель явно работает медленнее. Кроме того, мы отображаем значения кодировщика на экране, но они, кажется, останавливаются после целого числа около 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() {
        }
    }

1 Ответ

0 голосов
/ 11 января 2019

Я не совсем уверен, что происходит в вашей программе, но кажется, что вы только один раз читаете значения кодировщика -> это объясняет, почему значение не меняется. Возможно, вы захотите читать значения кодировщика в каком-то цикле, чтобы ваши показания постоянно обновлялись.

Что касается движения по прямой, вы можете попробовать использовать ПИД-регулятор (пропорциональный, интегральный, производный), где разница в значениях датчика является ошибкой. Основываясь на разнице, ваша программа может решить, насколько резко повернуть (т.е. масштабировать скорости двигателя), чтобы скорректировать отклонение.

Хорошей отправной точкой будет этот пост: https://robotics.stackexchange.com/questions/1711/approach-to-using-pid-to-get-a-differential-robot-driving-straight

...