but I’m new to Java and have no idea where I would put the statement.
Also: I’m planning on using one thumbstick to turn, and the right trigger as throttle, but I’m not sure how you would accomplish that and most tutorials are either for tank drive or in languages other than Java.
This checks the value of the given joystick and returns a double based on your threshold. You’ll have to create the Joystick objects yourself; I am unfamiliar with Xbox controllers.
As for your second question about using two joysticks, the RobotDrive classes have an arcadeDrive method that has two arguments: the speed you go forward (the value of the throttle joystick) and the speed you turn at (the value of the turning joystick).
I’d just suggest changing the name of your “turn” method to something less confusing, such as “getCompensatedValue” or “getBetterValue” (or anything better you can think of). If you call “turn(Xbox)”, then you may be confused why the robot’s not turning Other than that, you should be good. Good luck!
You’ve created a new function, but haven’t called it. In order to do the equivalent of the commented out code, you would need to add another line similar to the following
double turn = turn(Xbox);
(I’m not very experienced with java, so it might not even compile with having variable named the same as a function). Notice how this isn’t exactly clear, which is why Djur recommended renaming turn to something more generic. Doesn’t this sound better?
double turn = applyDeadband(Xbox);
There’s probably a better way to write the deadband function so that you could apply it to the throttle also easily without creating a second function. Can you think of another way to do it?
Allow me to show you a piece of code my team has used the last three years…
public double deadband(double JoystickValue, double DeadbandCutOff) {
if (JoystickValue<DeadbandCutOff&&JoystickValue>(DeadbandCutOff*(-1))) {
deadbandreturn=0;
}
else {
deadbandreturn=(JoystickValue-(Math.abs(JoystickValue)/JoystickValue*DeadbandCutOff))/(1-DeadbandCutOff);
}
return deadbandreturn;
}
this not only cuts it off at a point, but prevents jumping up to 0.1 after you get past it. it basically smooths the dead band curve. How ever, i would recommend making a algorithm you understand. ((i am still working on understanding this one. lol))
That’s actually some pretty clever code… I’d like to put that on our robot this year, if you’re okay with that.
To anyone confused:
The first if() checks if the joystick value is in the (-deadband,deadband) range (this could more succinctly be done with Math.abs(JoystickValue) < deadband), and if so, puts the output to 0. Otherwise, it scales the joystick value to [0,1] or -1,0] depending on the sign by modifying the ranges this way:
[deadband,1] -> [0,1-deadband] -> [0,1]
-1,-deadband] -> -1+deadband,0] -> -1,0]
deadbandreturn=(JoystickValue- // initially in one of two ranges: [DeadbandCutOff,1] or -1,-DeadBandCutOff]
(Math.abs(JoystickValue)/JoystickValue // 1 if JoystickValue > 0, -1 if JoystickValue < 0 (abs(x)/x); could use Math.signum(JoystickValue) instead
*DeadbandCutOff // multiply by the sign so that for >0, it comes out to - (DeadBandCutOff), and for <0 it comes to - (-DeadBandCutOff)
)
) // now in either [0,1-DeadBandCutOff] or -1+DeadBandCutOff,0]
/(1-DeadbandCutOff); // scale to [0,1] or -1,0]
Personally, the best way I can think of to go about this would be to extend the Joystick class, making a DeadbandJoystick class. I’ll write up an example of what I’m talking about when I get home tonight.