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

2017 ईंधन लॉन्चर रोबोट

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

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

#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)
{
// यह कोड दो टैलन को एक साथ काम करने और पीआईडी आरपीएम नियंत्रण को लागू करने के लिए सेट करता है
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();

// ट्रैकिंग डेटा पढ़ने के लिए लाइमलाइट टेबल प्राप्त करें
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);

// कैलिब्रेटेड लाइमलाइट क्रॉस-हेयर पर आधारित लक्ष्य त्रुटि और दूरी त्रुटि
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 = एलईडी को फ्लैश करें
{
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);
}

//
// शूटर फंक्शंस - शूटर व्हील आरपीएम को नियंत्रित करने के लिए टैलन पीआईडी का उपयोग करता है
// टैलन में 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);
}

//
// टैलन को हमारे वांछित शूटर व्हील आरपीएम बताएं
//
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 सेट करें, वर्तमान में इसका उपयोग नहीं कर रहे हैं क्योंकि आरपीएम नियंत्रण सेट है
//
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)