|
|
|
![]() |
|
|||||||
|
||||||||
![]() |
| Thread Tools |
Rating:
|
Display Modes |
|
#16
|
||||
|
||||
|
Re: H-Drive Programming
@kinganu123: Is the following a correct interpretation of what you meant? Let X be the value of the joystick strafe axis, If so, would you be so kind as to post your G(X) function. |
|
#17
|
|||
|
|||
|
Re: H-Drive Programming
Our formula is e^(gaussianInput^2/-.18) where the gaussianInput is the polar degrees from 0 to pi where pi/2 is 0, 0 is 1, and pi is -1.
I'm putting the code below, in case what I've typed doesn't make sense, here's the code: Code:
centerCurrent = xAxis;
double gaussianInput=angleToGaussianInput(Math.atan2(yAxis, xAxis));
leftCurrent =gaussianConversion(gaussianInput)+rotate;
rightCurrent=leftCurrent-2*rotate;
private double gaussianConversion(double gaussianInput) {
return Math.exp(Math.pow(gaussianInput, 2)/(-.18));
}
private double angleToGaussianInput(double rad) {
if(rad>Math.PI)
rad-=Math.PI;
return (rad-Math.PI/2.0)/(Math.PI/2.0);
}
|
|
#18
|
||||
|
||||
|
Re: H-Drive Programming
OK, to see if I'm understanding your formula correctly, can we take a simple numerical example?
Suppose the driver pushes the joystick to Y=1, X=0.5, rotate=0. What will be the "tapered" value of X? |
|
#19
|
|||
|
|||
|
Re: H-Drive Programming
Oh, sorry, I meant to say that the y-axis is the one that is modified, not the x.
So, x will be .5 and y will be 0.9702, or e^(((atan(1/.5)-pi/2)/pi/2)^2/-.18). |
|
#20
|
||||
|
||||
|
Re: H-Drive Programming
Quote:
e^(((atan(1/.5)-pi/2)/(pi/2))^2/-.18) This is quite different from the previous description. See attachments. Have you guys driven with this yet? How is it working? Last edited by Ether : 30-01-2015 at 08:45. |
|
#21
|
|||
|
|||
|
Re: H-Drive Programming
Yes, I didn't realize that he specified the strafe axis, which would result in the confusion.
And we haven't been able to test it yet since the mechanical guys are currently assembling the elevator on the robot, so we're losing a few days on testing and tuning this. Also, I thought I'd note here that we tweaked the code above, in case anyone else wanted to try our stuff out, because I noticed a slight flaw in getting the y values Code:
centerCurrent = xAxis; double gaussianInput=angleToGaussianInput(Math.atan2(yAxis, xAxis)); double scaledGaussianOutput=yAxis*gaussianConversion(gaussianInput) leftCurrent =scaledGaussianOutput+rotate; rightCurrent=scaledGaussianOutput-rotate; |
|
#22
|
||||
|
||||
|
Re: H-Drive Programming
Quote:
I'm a math enthusiast, so don't take this wrong, but why the complicated function with exponential and inverse trig? Wouldn't a simple linear interpolated 6x6 LUT do the job... and be far more easily tuned to compensate for actual behavior once you've done your testing? Last edited by Ether : 30-01-2015 at 09:35. |
|
#23
|
|||
|
|||
|
Re: H-Drive Programming
So we do have a simpler version coded up with some sort of linear adjustment instead of this one (I had some of the other students write that as a backup), but the main reasoning behind this method was to allow y to increase significantly to make up the lost y speed as the driver went at a smaller angle (with respect to the front of the robot).
|
|
#24
|
||||
|
||||
|
Re: H-Drive Programming
Instead of using arctangent and exponential functions, why not just multiply the X axis by a factor of 4, clip it at 1, and normalize the resulting X,Y pair? Code:
void adjust(float Xj, float Yj, float *Xa, float *Ya){
float mag;
*Ya=Yj;
if (Xj<=-0.25) *Xa=-1;
else if (Xj<0.25) *Xa=4.0*Xj;
else *Xa=1.0;
// normalize adjusted values:
mag=sqrt(*Xa**Xa+*Ya**Ya);
if (mag>1) {*Xa/=mag; *Ya/=mag;}
}
The attached plot shows a family of Xa vs Xj curves for Yj=0 to 1. Or you could make the X gain a function of Yj, like so: Code:
void adjust(float Xj, float Yj, float *Xa, float *Ya){
float mag, gain;
gain=1+3*Yj;
*Ya=Yj;
*Xa=gain*Xj;
if (*Xa>1) *Xa=1;
else if (*Xa<-1) *Xa=-1;
// normalize adjusted values:
mag=sqrt(*Xa**Xa+*Ya**Ya);
if (mag>1) {*Xa/=mag; *Ya/=mag;}
}
and Ya vs Yj for Xj=0 to 1 Last edited by Ether : 03-02-2015 at 23:13. Reason: added variable gain option and plots |
![]() |
| Thread Tools | |
| Display Modes | Rate This Thread |
|
|