Using the example code found on , https://chameleon-vision.readthedocs.io/en/latest/getting-started/robot-code-example.html, we have followed it very closely and adjusted it to our camera, but when we run the code nothing happens. I’m not sure where in the code does it actually move the drive base and I don’t know how it is supposed to understand where to go based off our drive base.
I am planning on using the auto align, to take data and make a function to make a relationship between pitch and distance in order to determine the distance from the camera to the robot. I calibrated 3D, but I have no clue how to use it and I fear I might run into more issues…
SO if anyone could help me troubleshoot with auto align or chameleon vision that would be great. Thank you!
Yeah, so far we have used the second code example and have been unsuccessful in getting it to work.
I can’t open github for some reason but here’s my code at the moment.
/*----------------------------------------------------------------------------*/
/* Copyright (c) 2018 FIRST. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in the root directory of */
/* the project. */
/*----------------------------------------------------------------------------*/
package frc.robot;
import com.ctre.phoenix.motorcontrol.can.WPI_TalonFX;
import edu.wpi.first.networktables.NetworkTable;
import edu.wpi.first.networktables.NetworkTableEntry;
import edu.wpi.first.networktables.NetworkTableInstance;
import edu.wpi.first.wpilibj.Joystick;
import edu.wpi.first.wpilibj.SpeedControllerGroup;
import edu.wpi.first.wpilibj.TimedRobot;
import edu.wpi.first.wpilibj.drive.DifferentialDrive;
/**
* The VM is configured to automatically run this class, and to call the
* functions corresponding to each mode, as described in the TimedRobot
* documentation. If you change the name of this class or the package after
* creating this project, you must also update the build.gradle file in the
* project.
*/
public class Robot extends TimedRobot {
//Variables
//Robot vars (not directly related to the vision system)
public Joystick joystick;
//This example uses 4 spark motors controllers for the drivetrain with 2 motors on each side
WPI_TalonFX m_frontLeft, m_frontRight, m_rearLeft, m_rearRight;
DifferentialDrive m_drive;
/*
NetworkTable is a collection of databases stored in the RoboRIO
The co processor can change data inside it
This database can be viewed in a program named OutlineViewer
"table" represents a single database called "MyCamName" under "Chameleon Vision`"
*/
NetworkTable table;
/*
targetX represents the horizontal angle
targetY represents the vertical angle
*/
NetworkTableEntry targetX;
NetworkTableEntry targetY;
//Error values for the control loop
double rotationError;
double distanceError;
//Control loop constants
/*
This example uses proportional control loop with constant force
After you master proportional control use might want to try PID control loop
*/
double KpRot=-0.1;
double KpDist=-0.1;
//Deadzone is necessary because the robot can only get so accurate and cannot be pefectly head on the target
double angleTolerance=5;//Deadzone for the angle control loop
double distanceTolerance=5;//Deadzone for the distance control loop
/*
There is a minimum power that you need to give to the drivetrain in order to overcome friction
It helps the robot move and rotate at low speeds
*/
double constantForce=0.05;
/*
rotationAjust is rotational signal for the drivetrain
distanceAjust is forward signal for the drivetrain
*/
double rotationAjust;
double distanceAjust;
//Initilazition function
public void robotInit(){
SpeedControllerGroup m_left = new SpeedControllerGroup(m_frontLeft, m_rearLeft);
SpeedControllerGroup m_right = new SpeedControllerGroup(m_frontRight, m_rearRight);
//Initilazition of robot drivetrain and joystick
joystick = new Joystick(1);
m_frontLeft = new WPI_TalonFX(1);
m_rearLeft = new WPI_TalonFX(2);
m_left = new SpeedControllerGroup(m_frontLeft, m_rearLeft);
m_frontRight = new WPI_TalonFX(3);
m_rearRight = new WPI_TalonFX(4);
m_right = new SpeedControllerGroup(m_frontRight, m_rearRight);
m_drive = new DifferentialDrive(m_left, m_right);
//Points "table" to the NetworkTable database called "chameleon-vision"
table=NetworkTableInstance.getDefault().getTable("chameleon-vision").getSubTable("MyCamName");
//Points to the database value named "yaw" and "pitch"
targetX=table.getEntry("yaw");
targetY=table.getEntry("pitch");
}
//Periodic function
public void teleopPeriodic()
{
rotationAjust=0;
distanceAjust=0;
if (joystick.getRawButton(1))// the "A" button
{
/*
Fetches the rotation and distance values from the vision co processor
sets the value to 0.0 if the value doesnt exist in the database
*/
rotationError=targetX.getDouble(0.0);
distanceError=targetY.getDouble(0.0);
/*
Proportional (to targetX) control loop for rotation
Deadzone of angleTolerance
Constant power is added to the direction the control loop wants to turn (to overcome friction)
*/
if(rotationError>angleTolerance)
rotationAjust=KpRot*rotationError+constantForce;
else
if(rotationError<angleTolerance)
rotationAjust=KpRot*rotationError-constantForce;
/*
Proportional (to targetY) control loop for distance
Deadzone of distanceTolerance
Constant power is added to the direction the control loop wants to turn (to overcome friction)
*/
if(distanceError>distanceTolerance)
distanceAjust=KpDist*distanceError+constantForce;
else
if(distanceError<distanceTolerance)
distanceAjust=KpDist*distanceError-constantForce;
//Output the power signals to a arcade drivetrain
m_drive.arcadeDrive(distanceAjust,rotationAjust);
}
}
}
I am unsure, I am trying to line the robot up with the target which has reflective tape of it however it does not move to align with the target, it does nothing. I am sure I am missing something but i don’t know what.
Try arcade drive using the Xbox controller. If that works then attempt vision. Does basic drive work fine? Except the fact that I would use curly brackets on your if else statements. Also, you are only taking values from the network table once during init. I haven’t used anything but command based in a while, is there a periodic method? If so, put
targetX=table.getEntry(“yaw”);
Need to go in teleport periodic so it can update the values.
I would also make sure your talons are being powered properly, CAN loop is connected properly(terminating resistor, etc), and that the talonFX id’s values are correct.
If you’re using the latest version of ChameleonVision, shouldn’t the network table entries for yaw and pitch be “targetYaw” and “targetPitch”, not just “yaw” and “pitch”?
And is “MyCamName” the actual name of your camera? You’re probably not getting the right subtable either https://chameleon-vision.readthedocs.io/en/latest/getting-started/networktables.html