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

2017 फ्यूल लॉन्चर रोबोट

इस उदाहरण में, हम एक पूर्ण रोबोट प्रोग्राम प्रस्तुत करते हैं जो 2017 बॉयलर गोल को लागू करता है। हमने इस प्रोग्राम को 987 स्टीमवर्क्स रोबोट पर टेस्ट किया और बॉयलर में आसानी से फ्यूल स्कोर करने में सक्षम रहे। इस उदाहरण में हम रोबोट के ड्राइवट्रेन का उपयोग करके एम करते हैं और रेंज में मूव करते हैं। एक बात जो हमें तुरंत स्पष्ट हुई वह यह है कि limelight ने हमें अपने वास्तविक 2017 रोबोट की तुलना में कोड और समय की बहुत कम मात्रा में इस फीचर को लागू करने दिया।

नीचे दिए गए कोड में कुछ अन्य फीचर्स भी हैं जैसे LEDs को ब्लिंक करने की क्षमता और कई विज़न पाइपलाइनों के बीच डायनामिक रूप से टॉगल करना। यह उदाहरण यह भी दिखाता है कि शूटर व्हील के RPM को कंट्रोल करने के लिए मैग्नेटिक एनकोडर के साथ Talon SRX स्पीड कंट्रोलर का उपयोग कैसे करें।

#include <iostream>
#include <string>

#include <Drive/DifferentialDrive.h>
#include <Joystick.h>
#include <SampleRobot.h>
#include <SmartDashboard/SendableChooser.h>
#include <SmartDashboard/SmartDashboard.h>
#include <Spark.h>
#include <Victor.h>
#include <Timer.h>
#include "ctre/phoenix/MotorControl/CAN/TalonSRX.h"

//
#define Vic_Drive_Left_1 0
#define Vic_Drive_Left_2 1
#define Vic_Drive_Right_1 2
#define Vic_Drive_Right_2 3

#define Tal_Shooter_Wheel 21
#define Tal_Shooter_Wheel_2 2
#define Tal_Intake 3
#define Tal_Uptake 9

class Robot : public frc::SampleRobot
{
public:

Robot() :
LeftDrive(Vic_Drive_Left_1),
RightDrive(Vic_Drive_Right_1),
LeftDrive2(Vic_Drive_Left_2),
RightDrive2(Vic_Drive_Right_2),
Shooter(Tal_Shooter_Wheel),
Shooter_2(Tal_Shooter_Wheel_2),
Intake(Tal_Intake),
Uptake(Tal_Uptake)
{
// यह कोड दो Talons को एक साथ काम करने और PID RPM कंट्रोल लागू करने के लिए सेट करता है
Shooter.SetControlMode(CTRE::MotorControl::ControlMode::kSpeed);
Shooter_2.SetControlMode(CTRE::MotorControl::ControlMode::kFollower);
Shooter_2.Set(Tal_Shooter_Wheel);
Shooter.SetClosedLoopOutputDirection(false);
Shooter.SetStatusFrameRateMs(CTRE::MotorControl::CAN::TalonSRX::StatusFrameRateAnalogTempVbat,10);

Shooter.SetFeedbackDevice(CTRE::MotorControl::CAN::TalonSRX::CtreMagEncoder_Relative);
SetShooterConstants(.0002f, .00009f, .0000f, .000006f); // शूटर व्हील के लिए P,I,D,F कॉन्स्टेंट्स
Shooter.SetAllowableClosedLoopErr(10);
Shooter.ConfigNominalOutputVoltage(+0.f,-0.f);
Shooter.ConfigPeakOutputVoltage(+12.f,-12.f);
Shooter.SelectProfileSlot(0);
Shooter.SetSensorDirection(true);
Shooter.SetVoltageRampRate(100);
Shooter.SetIzone(300);
Shooter_2.SetVoltageRampRate(100);
}

void RobotInit()
{
}

void Autonomous()
{
}

/*
* ऑपरेटर कंट्रोल
*/
void OperatorControl() override
{
while (IsOperatorControl() && IsEnabled())
{
// जॉयस्टिक्स पढ़ें!
float left_command = m_stickLeft.GetY();
float right_command = m_stickRight.GetY();

// ट्रैकिंग डेटा पढ़ने के लिए limelight टेबल प्राप्त करें
std::shared_ptr<NetworkTable> table = NetworkTable::GetTable("limelight");

float KpAim = 0.045;
float KpDist = 0.0f; //0.09;
float AimMinCmd = 0.095f;

float targetX = table->GetNumber("tx", 0);
float targetY = table->GetNumber("ty", 0);
float targetA = table->GetNumber("ta", 0);

// कैलिब्रेटेड limelight क्रॉस-हेयर के आधार पर एम एरर और डिस्टेंस एरर
float aim_error = targetX;
float dist_error = targetY;

// 0.2 डिग्री डेडबैंड के साथ स्टीयरिंग एडजस्ट (0.2deg पर काफी करीब)
float steeringAdjust = KpAim*aim_error;
if (targetX > .2f) steeringAdjust += AimMinCmd;
else if (targetX < -.2f) steeringAdjust -= AimMinCmd;

// डिस्टेंस एडजस्ट, गोल से सही दूरी पर ड्राइव करें
float drivingAdjust = KpDist*dist_error;
bool doTarget = false;

if(m_stickLeft.GetRawButton(3)) // पाइपलाइन 0 का उपयोग करके एम करें
{
doTarget = true;
table->PutNumber("pipeline", 0);
}
else if (m_stickLeft.GetRawButton(2)) // पाइपलाइन 1 का उपयोग करके एम करें
{
doTarget = true;
table->PutNumber("pipeline", 1);
}

if(doTarget) // यदि ऑटो-एमिंग है, तो ड्राइव और स्टीयर एडजस्ट करें
{
ShooterSetRPM(3300);
left_command += drivingAdjust - steeringAdjust;
right_command += drivingAdjust + steeringAdjust;
}
else
{
ShooterOff();
}

// टैंक ड्राइव, लेफ्ट और राइट ड्राइवट्रेन मोटर कमांड भेजें
StandardTank(left_command,right_command);

if(m_stickRight.GetRawButton(3)) // बॉल्स को अंदर खींचें और शूट करें
{
IntakeIn();
UptakeUp();
}
else if(m_stickRight.GetRawButton(2)) // बॉल्स को बाहर थूकें
{
IntakeIn();
UptakeDown();
}
else // बॉल्स को अकेला छोड़ दें!
{
IntakeOff();
UptakeOff();
}
if(m_stickLeft.GetRawButton(5)) // जॉयस्टिक बटन 5 = LEDs फ्लैश करें
{
table->PutNumber("ledMode", 2); // लाइट्स फ्लैश करें
}
else
{
table->PutNumber("ledMode", 0); // लाइट्स ऑन करें
}

// मोटर अपडेट टाइम के लिए प्रतीक्षा करें
frc::Wait(0.005);
}
}

/*
* टेस्ट मोड के दौरान चलता है
*/
void Test() override {}


void StandardTank(float left, float right)
{
LeftDrive.Set(-left);
LeftDrive2.Set(-left);
RightDrive.Set(right);
RightDrive2.Set(right);
}

//
// शूटर फंक्शन्स - शूटर व्हील RPM को कंट्रोल करने के लिए talon PID का उपयोग करता है
// Talon में P,I,D,F कॉन्स्टेंट्स सेट करें, ये वैल्यूज आपके मैकेनिज्म पर बहुत निर्भर करती हैं
//
void SetShooterConstants(float p,float i,float d,float f)
{
p *= 1024.f;
i *= 1024.f;
d *= 1024.f;
f *= 1024.f;

Shooter.SetP(p);
Shooter.SetI(i);
Shooter.SetD(d);
Shooter.SetF(f);
}

//
// Talons को हमारा वांछित शूटर व्हील RPM बताएं
//
void ShooterSetRPM(float desrpm)
{
Shooter.SetControlMode(CTRE::MotorControl::ControlMode::kSpeed);
Shooter_2.SetControlMode(CTRE::MotorControl::ControlMode::kFollower);
Shooter_2.Set(Tal_Shooter_Wheel);
Shooter.Set(desrpm);
}

//
// बस पावर -1..+1 सेट करें, अभी इसका उपयोग नहीं कर रहे क्योंकि RPM कंट्रोल सेट अप है
//
void ShooterSetPower(float power)
{
Shooter.SetControlMode(CTRE::MotorControl::ControlMode::kPercentVbus);
Shooter_2.SetControlMode(CTRE::MotorControl::ControlMode::kPercentVbus);
Shooter_2.Set(power);
Shooter.Set(power);
}

//
// शूटर व्हील बंद करें
//
void ShooterOff()
{
Shooter.SetControlMode(CTRE::MotorControl::ControlMode::kPercentVbus);
Shooter_2.SetControlMode(CTRE::MotorControl::ControlMode::kPercentVbus);
Shooter.Set(0.0f);
Shooter_2.Set(0.0f);
}

//
// इनटेक फंक्शन्स
//
void IntakeIn()
{
Intake.Set(-.8f);
}
void IntakeOut()
{
Intake.Set(.8f);
}
void IntakeShooting()
{
Intake.Set(-1.0f);
}

void IntakeOff()
{
Intake.Set(0);
}

//
// अपटेक फंक्शन्स
//
void UptakeUp()
{
Uptake.Set(-1.0f);
}
void UptakeDown()
{
Uptake.Set(1.0f);
}
void UptakeOff()
{
Uptake.Set(0);
}

private:

// रोबोट ड्राइव सिस्टम
frc::Victor LeftDrive;
frc::Victor RightDrive;
frc::Victor LeftDrive2;
frc::Victor RightDrive2;

// शूटर व्हील
CTRE::MotorControl::CAN::TalonSRX Shooter;
CTRE::MotorControl::CAN::TalonSRX Shooter_2;
CTRE::MotorControl::CAN::TalonSRX Intake;
CTRE::MotorControl::CAN::TalonSRX Uptake;

// जॉयस्टिक इनपुट्स
frc::Joystick m_stickLeft{0};
frc::Joystick m_stickRight{1};
};

START_ROBOT_CLASS(Robot)