मुख्य कंटेंट तक स्किप करें

2019 डीप स्पेस रोबोट

2019 FRC गेम डीप स्पेस में कई लक्ष्यों के ऊपर विज़न टारगेट थे। नीचे आप Java और Labview में पूर्ण उदाहरण प्रोग्राम पा सकते हैं जो डीप स्पेस में एक लक्ष्य की ओर स्वचालित रूप से ड्राइविंग करने के लिए एक सरल विधि को लागू करते हैं।

ये बहुत सरल प्रोग्राम हैं और केवल आपके रोबोट को नियंत्रित करने के लिए लाइमलाइट ट्रैकिंग डेटा का उपयोग करने की अवधारणा दिखाने के लिए हैं। प्रत्येक प्रोग्राम में, आप एक गेमपैड के साथ अपने रोबोट को चला सकते हैं। यदि आप 'A' बटन को दबाए रखते हैं, और लाइमलाइट एक वैध लक्ष्य देखता है (आपकी पाइपलाइन में सेटिंग्स के आधार पर) तो रोबोट स्वचालित रूप से लक्ष्य की ओर चलेगा। अपने विशेष रोबोट के लिए कोड में विभिन्न स्थिरांकों को ट्यून करने में सावधानी बरतें। कुछ रोबोट दूसरों की तुलना में आसानी से मुड़ते या चलते हैं, इसलिए आनुपातिक नियंत्रण स्थिरांकों को केस-दर-केस आधार पर ट्यून किया जाना चाहिए। लाइमलाइट खोज व्यवहार को सक्षम करने से पहले सुनिश्चित करें कि रोबोट गेमपैड कंट्रोलर का उपयोग करके सही ढंग से चलता है।

package frc.robot;

import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.smartdashboard.SendableChooser;
import edu.wpi.first.wpilibj.smartdashboard.SmartDashboard;
import edu.wpi.first.wpilibj.VictorSP;
import edu.wpi.first.wpilibj.SpeedControllerGroup;
import edu.wpi.first.wpilibj.XboxController;
import edu.wpi.first.wpilibj.GenericHID.Hand;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
import edu.wpi.first.networktables.*;


public class Robot extends TimedRobot {

private static final String kDefaultAuto = "Default";
private static final String kCustomAuto = "My Auto";
private String m_autoSelected;
private final SendableChooser<String> m_chooser = new SendableChooser<>();

private VictorSP m_Left0 = new VictorSP(0);
private VictorSP m_Left1 = new VictorSP(1);
private VictorSP m_Right0 = new VictorSP(2);
private VictorSP m_Right1 = new VictorSP(3);
private SpeedControllerGroup m_LeftMotors = new SpeedControllerGroup(m_Left0,m_Left1);
private SpeedControllerGroup m_RightMotors = new SpeedControllerGroup(m_Right0,m_Right1);
private DifferentialDrive m_Drive = new DifferentialDrive(m_LeftMotors,m_RightMotors);

private XboxController m_Controller = new XboxController(0);

private boolean m_LimelightHasValidTarget = false;
private double m_LimelightDriveCommand = 0.0;
private double m_LimelightSteerCommand = 0.0;

@Override
public void robotInit() {
m_chooser.setDefaultOption("Default Auto", kDefaultAuto);
m_chooser.addOption("My Auto", kCustomAuto);
SmartDashboard.putData("Auto choices", m_chooser);
}

@Override
public void robotPeriodic() {
}

@Override
public void autonomousInit() {
m_autoSelected = m_chooser.getSelected();
}

@Override
public void autonomousPeriodic() {
}

@Override
public void teleopPeriodic() {

Update_Limelight_Tracking();

double steer = m_Controller.getX(Hand.kRight);
double drive = -m_Controller.getY(Hand.kLeft);
boolean auto = m_Controller.getAButton();

steer *= 0.70;
drive *= 0.70;

if (auto)
{
if (m_LimelightHasValidTarget)
{
m_Drive.arcadeDrive(m_LimelightDriveCommand,m_LimelightSteerCommand);
}
else
{
m_Drive.arcadeDrive(0.0,0.0);
}
}
else
{
m_Drive.arcadeDrive(drive,steer);
}
}

@Override
public void testPeriodic() {
}

/**
* यह फ़ंक्शन लाइमलाइट कैमरा से ट्रैकिंग डेटा के आधार पर ड्राइविंग और स्टीयरिंग कमांड
* उत्पन्न करने की एक सरल विधि को लागू करता है।
*/
public void Update_Limelight_Tracking()
{
// इन संख्याओं को आपके रोबोट के लिए ट्यून किया जाना चाहिए! सावधान रहें!
final double STEER_K = 0.03; // लक्ष्य की ओर कितनी तेजी से मुड़ना है
final double DRIVE_K = 0.26; // लक्ष्य की ओर कितनी तेजी से आगे बढ़ना है
final double DESIRED_TARGET_AREA = 13.0; // जब रोबोट दीवार तक पहुंचता है तो लक्ष्य का क्षेत्रफल
final double MAX_DRIVE = 0.7; // सरल गति सीमा ताकि हम बहुत तेज न चलें

double tv = NetworkTableInstance.getDefault().getTable("limelight").getEntry("tv").getDouble(0);
double tx = NetworkTableInstance.getDefault().getTable("limelight").getEntry("tx").getDouble(0);
double ty = NetworkTableInstance.getDefault().getTable("limelight").getEntry("ty").getDouble(0);
double ta = NetworkTableInstance.getDefault().getTable("limelight").getEntry("ta").getDouble(0);

if (tv < 1.0)
{
m_LimelightHasValidTarget = false;
m_LimelightDriveCommand = 0.0;
m_LimelightSteerCommand = 0.0;
return;
}

m_LimelightHasValidTarget = true;

// आनुपातिक स्टीयरिंग से शुरू करें
double steer_cmd = tx * STEER_K;
m_LimelightSteerCommand = steer_cmd;

// लक्ष्य क्षेत्र हमारे वांछित क्षेत्र तक पहुंचने तक आगे बढ़ने का प्रयास करें
double drive_cmd = (DESIRED_TARGET_AREA - ta) * DRIVE_K;

// रोबोट को लक्ष्य में बहुत तेजी से न चलने दें
if (drive_cmd > MAX_DRIVE)
{
drive_cmd = MAX_DRIVE;
}
m_LimelightDriveCommand = drive_cmd;
}
}