Currently i have a drive function which consists of 3 PID loops, one for x, one for y and one for orientation. (i also have position tracking). But even after having 3 PID loops, i am still having trouble getting the strafing to be clean, By that I mean, for it to be strafing smoothly and in a straight line. And i know it isnt a build problem since it strafes in a smooth line in opcontrol.
So does anyone have any ideas and or suggestions for me to make my strafing as clean and accurate as possible?
Could you post your code? A video of the robot would also be helpful, so we can see the issue. If the strafing is clean in driver but not in auto, I’d suspect there’s an issue in your code.
Strafing via 3 PID controllers isn’t really clean, as you said. However, using mecanum/x-drive math (google it) you can write a function that accepts a direction and a power and it distributes that power across the wheels so that the robot strafes in the proper direction.
That way, you just need two PID controllers (distance and heading). The distance controller is based on the distance to the point, and you just point the output of the pid controller towards the target point using holonomic math (which is pretty simple btw).
I’m not going to tell you how to do it, I just said that it’s possible and suggested you do some research. That paper explains the math behind a holonomic drive, if you read closely and understand it you should be able to figure out how to apply it to both auton and driving (there is little use for driving btw).
So i gave the document a thorough read and made the code from my understanding and this is what i made (Ubuntu Pastebin) but its am still having trouble strafing in a straight line, it tends to sway backwards and it doesnt end up near its target. If you see any mistakes please let me know or if you have any other suggestions
Aside from needing more general abstraction, one thing I noticed right away is that 1/4 results in 0, as you are doing integer division.
Edit:
Same with abs, depending on the header you are using it will accept and return an integer, meaning / abs(largestVal) might be doing integer division as well. Use fabs or std::abs.
Disclaimer: I am not the primary coder for my team.
With that said, perhaps the problem could be something to do with your robot’s center of gravity, greater friction on one wheel, or some other physical aspect of the robot.
this shouldnt be an issue since the robot can strafe straight in driver control, so if it were to be the wheels, then it would show in the driver control as well