Chief Delphi

Chief Delphi (http://www.chiefdelphi.com/forums/index.php)
-   Java (http://www.chiefdelphi.com/forums/forumdisplay.php?f=184)
-   -   PIDController Rotate (http://www.chiefdelphi.com/forums/showthread.php?t=95382)

notmattlythgoe 27-05-2011 11:48

Re: PIDController Rotate
 
Quote:

Originally Posted by Ether (Post 1063856)
Isn't there a generic PID in the WPI library for Java which lets you specify where the output goes? Like the LabVIEW PID ?



unfortunately not that I can find. Here is the link to the JavaDoc for the WPI Library. If you can find something let me know.

http://robotics.loyola.ca/javadoc201...s-noframe.html

Jared Russell 27-05-2011 12:00

Re: PIDController Rotate
 
WPILib and WPILibJ PID controllers take PIDOutputs as constructor parameters - this is where they "put" their output command. Some classes in WPILib(J) already implement the PIDOutput interface (like Victor or Jaguar). But because you can apply PID to so many different types of problems, there are going to be lots of instances where you need to write some code to "glue" the PIDController to whatever it is you want to control.

There are a couple of ways you could do this:

1. Make a new class that implements PIDOutput. You must implement a "pidWrite" function for your new class - this will get called every time the PID controller has a new output available.

2. Don't use the PIDOutput feature; instead, simply call <yourPIDcontrollername>.get() inside of a periodic loop (like "teleopPeriodic()" in IterativeRobot) to grab the output of the controller at some regular frequency.

3. Write your own PID controller class that behaves exactly the way you want it to :)

Joe Ross 27-05-2011 12:01

Re: PIDController Rotate
 
seems like it would be easy to make a class that implements PIDOutput that only sets a variable.

notmattlythgoe 27-05-2011 12:03

Re: PIDController Rotate
 
Quote:

Originally Posted by Jared341 (Post 1063864)
WPILib and WPILibJ PID controllers take PIDOutputs as constructor parameters - this is where they "put" their output command. Some classes in WPILib(J) already implement the PIDOutput interface (like Victor or Jaguar). But because you can apply PID to so many different types of problems, there are going to be lots of instances where you need to write some code to "glue" the PIDController to whatever it is you want to control.

There are a couple of ways you could do this:

1. Make a new class that implements PIDOutput. You must implement a "pidWrite" function for your new class - this will get called every time the PID controller has a new output available.

2. Don't use the PIDOutput feature; instead, simply call <yourPIDcontrollername>.get() inside of a periodic loop (like "teleopPeriodic()" in IterativeRobot) to grab the output of the controller at some regular frequency.

3. Write your own PID controller class that behaves exactly the way you want it to :)

So far I've taken the first step. I'm guessing this was the way it was intended to be done in Java. Currently my PIDOutput class takes a forward speed and a RobotDrive as parameters for its constructor and adjusts the right and left side motors as needed to correct the rotation.

notmattlythgoe 27-05-2011 12:07

Re: PIDController Rotate
 
Quote:

Originally Posted by Jared341 (Post 1063864)
2. Don't use the PIDOutput feature; instead, simply call <yourPIDcontrollername>.get() inside of a periodic loop (like "teleopPeriodic()" in IterativeRobot) to grab the output of the controller at some regular frequency.

How would you accomplish this without passing the PIDController's constructor a PIDOutput object? Create an abstract instance of one?

Jared Russell 27-05-2011 12:20

Re: PIDController Rotate
 
Quote:

Originally Posted by notmattlythgoe (Post 1063868)
How would you accomplish this without passing the PIDController's constructor a PIDOutput object? Create an abstract instance of one?

Yeah, you would just create a minimalist implementation of a PIDOutput (it could even be an anonymous class).

Something like...
Code:

xxx = new PIDController(Kp, Ki, Kd, source, new PIDOutput() {void pidWrite(double output){ } }, period);

notmattlythgoe 27-05-2011 12:27

Re: PIDController Rotate
 
Quote:

Originally Posted by Jared341 (Post 1063871)
Yeah, you would just create a minimalist implementation of a PIDOutput (it could even be an anonymous class).

Something like...
Code:

xxx = new PIDController(Kp, Ki, Kd, source, new PIDOutput() {void pidWrite(double output){ } }, period);

Makes sense. Having the thread controlled PID system is very nice though. Just takes that little bit of extra work. Once I get the code tested on the robot I will post it here for people to look at.

Strants 31-05-2011 23:59

Re: PIDController Rotate
 
Just a couple nit-picks: you defined DRIVE_P, DRIVE_I, and DRIVE_D as zero, which means that the controller won't do any corrections. Also, what is the value variable in the PIDRotate class supposed to do?

notmattlythgoe 01-06-2011 07:03

Re: PIDController Rotate
 
3 Attachment(s)
Quote:

Originally Posted by Strants (Post 1064375)
Just a couple nit-picks: you defined DRIVE_P, DRIVE_I, and DRIVE_D as zero, which means that the controller won't do any corrections. Also, what is the value variable in the PIDRotate class supposed to do?

I instantiated all of the PID values to 0 because I didn't have the correct values on me at the time. Here are some update files, I'm hoping to get the code tested this afternoon.


All times are GMT -5. The time now is 11:14.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Copyright © Chief Delphi