View Single Post
  #4   Spotlight this post!  
Unread 11-02-2016, 14:41
mikets's Avatar
mikets mikets is offline
Software Engineer
FRC #0492 (Titan Robotics)
Team Role: Mentor
 
Join Date: Jan 2010
Rookie Year: 2008
Location: Bellevue, WA
Posts: 667
mikets is a glorious beacon of lightmikets is a glorious beacon of lightmikets is a glorious beacon of lightmikets is a glorious beacon of lightmikets is a glorious beacon of lightmikets is a glorious beacon of light
Re: DriveTrain TankDrive Control

Quote:
Originally Posted by Kevin Zhang View Post
Hello,
Our team has been experimenting with controlling our robot drivetrain better for driver assist. We wanted to make a basic command to drive the robot for a certain distance using encoders. However we have been having a lot of trouble.

We can get very accurate encoder data from the drivetrain that is accurate to about 2 cm but unless we drive the drivetrain at around 0.2 percentvbus speed(basically unmoving) if we cut the motors off when the robot hits the desired encoder value, the momentum carries the robot forward another couple of feet

As a result I tried to control the robot using a PID control algorithm. I have a very good understanding of PID and as a project to help with understanding created a PID controlled beam balance to balance a ball. However, the PID Control objects for wpilib are very confusing. We are using CanTalon SRX to control a tank drive with 2 talons per side controlling a 2 cim vex gearbox with encoders connected to each canTalon
We've tried different approaches that all have issues that have stranded us because of the lack of documentation.

1) Instantiate a PIDController object with each of the talons assigned to each and control through that way.
Problems
-Only the front two talons have encoders attached because the gearbox only has one encoder each
-PIDController have a setSetpoint() method but I have no idea what how to select what the setpoint is( can i just change it to speed or position control and it'll do it for me)
-I realized that the Talons can use different controlModes which I assumed would resolve this problem but PID controllers don't work with Talons.

2) Just use the inherent PID objects inside the Talons
Problems
-When a setpoint is set through position, the drivetrain moves in the opposite direction that it should(If we set the talon to setpoint 256 ticks the drivetrain starts at 0 and goes backward so the encoder reads negative and never reads 256.
-When the setpoint is flipped(-256), the drivetrain also flips and starts reading positive.

3) Implementing our own PID
-We can get error and find the setpoint to set the motors but the motors are set in a -1 to 1 fashion so we don't know how to convert m/s or ft/s setpoint measurements to the motors.

Could anyone explain to me how exactly the PID control for the drivetrain works and how exactly we can accurately move a certain distance. This doesn't have to be encoders connected to Talons. Encoders can be separate objects. Code isn't necessary, I just need a bridge between the theory and the actual implementation from how to get the error to how exactly we can set the setpoint on the motors accurately so that it drives the right distance.

Thanks
We are actually doing 3. The built-in PID control of CANTalon is nice but it is doing a per motor PID control which is fine if we are controlling a mechanism with only one motor (e.g. an arm or an elevator). In a drive base where you have at least 2, 4 or even 6 motors, individual motor PID control doesn't address the need for the drive base to run straight. For example, if you try to have the robot go forward 10 feet and say you have calculated 10 feet is equivalent to 10,000 encoder counts. If you command each motor to go 10000 encoder counts, what if the left motor is slightly faster than the right motor. The robot will curve to the right but the left motor will achieve the 10000 count earlier than the right motor, so it will stop while the right motor will try to catch up. This means the robot will now curve left. It will get there but the robot may be traveling in a slight 'S'. In a multi-motor PID control scenario, you need an overall PID control, not individual motor PID control. You need the ability to look at the overall drive base movement and be able to shift different power to different wheels in order to keep the robot on target whether it is the heading or the distance. So in our library, we implemented a PIDDrive class that takes two PID controllers. One PID controller is controlling the distance and the other PID controller is controlling the heading. My analogy to this is one is controlling the gas pedal and the other controlling the steering wheel. The PIDDrive class will combine all sensor data (e.g. 4 encoders and 1 gyro) to come up with "distance travelled" and "heading" data. Then it applies the distance data to the distance PID controller to calculate the base power for all four wheels. It also applies the heading data to the "Turn PID controller" to calculate the differential power to the left and the right side of the wheels. So it can add/subtract a delta power from the base power between the left and right side of the wheels (i.e. shift power from the left to the right and vice versa). This overall PID control is a lot better than individual motor PID control.
BTW, if you want to look at our library, you can find it here:
https://github.com/trc492/Frc2016Fir...cPidDrive.java
__________________

Last edited by mikets : 11-02-2016 at 14:48.
Reply With Quote