|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools | Rate Thread | Display Modes |
|
#1
|
|||
|
|||
|
Deadzone Programming
I looked around a bit but couldn't find any resources on this for c++
How do you program in a deadzone for a attack 3 joystick? I wrote this code but it doesn't seem to be working. Code:
void driving(){
double y; //variable for forward/backward movement
double x; //variable for side to side movement
double turn; //variable for turning movement
if(driverStick.GetY()>0.3||driverStick.GetY()<-0.3){
y=driverStick.GetY();
}
if(driverStick.GetX()>0.3||driverStick.GetX()<-0.3){
x=driverStick.GetX();
}
if(driverStick2.GetX()>0.3||driverStick2.GetX()<-0.3){
turn=driverStick2.GetX();
}
|
|
#2
|
||||
|
||||
|
Re: Deadzone Programming
Try this, you need to set default values. Also I just cleaned it up a bit.
Code:
void driving(){
double y = 0; //variable for forward/backward movement
double x = 0; //variable for side to side movement
double turn = 0; //variable for turning movement
double deadzone = 0.3; //variable for amount of deadzone
if(driverStick.GetY() > deadzone || driverStick.GetY() < -deadzone) {
y = driverStick.GetY();
}
if(driverStick.GetX() > deadzone || driverStick.GetX() < -deadzone) {
x = driverStick.GetX();
}
if(driverStick2.GetX() > deadzone || driverStick2.GetX() < -deadzone){
turn = driverStick2.GetX();
}
|
|
#3
|
|||
|
|||
|
Re: Deadzone Programming
Ok, thanks, I'll try that at practice on monday.
Also, how does setting default values for those variables change it? |
|
#4
|
||||
|
||||
|
Re: Deadzone Programming
Well, if you don't and you try to use it later after the if statement failing the value is set to null and you'll get an error.
|
|
#5
|
||||
|
||||
|
Re: Deadzone Programming
We've found the following to work great for dead zones. The main advantage is you can still generate values between 0 and .3. With the previously posted solution once you get out of the dead zone you're instantly outputting .3 or 30%. If you notice we have a lot of 127s in the middle of the array. Those provide the dead zone but we shift everything else over so that once your out of the dead zone it doesn't go straight to .3.
This was written on the old control system. Technically the cRio has enough power to run the equation we are using to generate the array. We've just never taken the time to switch it over. Code:
const char inputShape[255] = {0,1,3,4,5,6,7,9,10,11,12,13,15,16,17,18,19,21,22,23,24,25,27,28,29,30,31,
33,34,35,36,37,38,40,41,42,43,44,46,47,48,49,50,52,53,54,55,56,58,59,60,61,62,
64,65,66,67,68,70,71,72,73,74,76,77,78,79,80,82,83,84,85,86,88,89,90,91,92,94,
95,96,97,98,100,101,102,103,104,106,107,108,109,110,112,113,114,115,116,117,
118,119,120,121,121,122,123,123,124,124,125,125,125,126,126,126,126,126,127,
127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,
128,128,128,128,128,129,129,129,130,130,131,131,132,133,133,134,135,136,
137,138,139,140,141,142,144,145,146,147,148,150,151,152,153,154,156,157,158,
159,160,162,163,164,165,166,168,169,170,171,172,174,175,176,177,178,180,181,
182,183,184,186,187,188,189,190,192,193,194,195,196,198,199,200,201,202,204,
205,206,207,208,210,211,212,213,214,216,217,218,219,220,221,223,224,225,226,
227,229,230,231,232,233,235,236,237,238,239,241,242,243,244,245,247,248,249,
250,251,253,254,255};
*/
float InputShape(float userValue)
{
int iUserValue;
iUserValue = (int)(userValue * 127);
iUserValue += 127;
iUserValue = inputShape[iUserValue];
userValue = iUserValue - 127;
userValue /= 127;
return userValue;
}
--SNIP--
ly = InputShape(stick->GetRawAxis(2));
ry = InputShape(stick->GetRawAxis(5));
|
|
#6
|
|||
|
|||
|
Re: Deadzone Programming
Quote:
|
|
#7
|
|||||
|
|||||
|
Re: Deadzone Programming
It comes from whatever line calls the InputShape() function.
|
|
#8
|
|||
|
|||
|
Re: Deadzone Programming
Gah, wasnt paying attention lol
|
|
#9
|
|||
|
|||
|
Re: Deadzone Programming
Quote:
Code:
#include <math.h>
...
void driving() {
double y = driverStick.GetY();
double x = driverStick.GetX();
double turn = driverStick2.GetX();
double deadzone = 0.3;
if(fabs(y) < deadzone)
{
y = 0;
}
if(fabs(x) < deadzone)
{
x = 0;
}
if(fabs(turn) < deadzone)
{
turn = 0;
}
...
}
Code:
#include <math.h>
...
void driving() {
double y = driverStick.GetY();
double x = driverStick.GetX();
double turn = driverStick2.GetX();
double deadzone = 0.3;
y = ((fabs(y) < deadzone) ? (0) : (y));
x = ((fabs(x) < deadzone) ? (0) : (x));
turn = ((fabs(turn) < deadzone) ? (0) : (turn));
...
}
Last edited by David++ : 12-02-2013 at 13:54. |
|
#10
|
|||
|
|||
|
Re: Deadzone Programming
Thanks! Also, did you mean abs() instead of fabs()?
|
|
#11
|
|||
|
|||
|
Re: Deadzone Programming
abs() takes an int and returns an int. fabs() takes a float and returns a float.
Since Joystick::GetX() and GetY() return floats, he did mean fabs(). |
|
#12
|
|||
|
|||
|
Re: Deadzone Programming
Ah, thanks for the correction.
|
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|