Programming Mecanum - Refined
How a Mecanum Drivetrain is programmed largely depends on the driver's preference for how the controller is configured.
In our provided example, the left joystick controls forward/back and strafe then the right joystick controls turning. This code is based on the sample provided by FIRST for Blocks (BasicOmniOpMode) available in the Robot Controller Console.
Mecanum Configuration
Mecanum Example Code
Mecanum Code Breakdown
Before diving into mecanum, double check the direction your motors and wheels are spinning. They may need to be reversed if you're experiencing jittering or inverted controls!
This example makes use of functions to help organize the code!
At the very beginning of our program, our MOTOR_SETTINGS function is called. Within it the drivetrain motors are set to RUN_WITHOUT_ENCODER and are set to run the appropriate direction.
Establishing Variables
Next, we need to create some new variables in order to use mecanum.
Let's break those down first:
Calculating Motor Movement with the Gamepad
At the beginning of the MECANUM_DRIVE function, our variables for each movement direction are being set to the value generated by the movement of the matching joystick axis.
Since we now have four motors in play, our equation for setting the needed power to each motor gets a little more complicated.
Our robot first needs to determine the combined movement of the gamepads's left joystick:
Then calculate with the right stick's value:
All our calculations together allows for movement when the left joystick is moved at an angle, such as for strafing along a diagonal!
Quick Check! - Understanding Motor Power
Let's take a closer look at how our motor power is being determined. For example, our leftFrontPower variable will equal:
So what if we move our left joystick all the way to the left side along the X-axis. To our robot, our equation will read something like this:
Take a moment to think: What would be the power of our other motors?
What about a more complicated example? What if we had the left joystick at an angle, all the way to the left and halfway towards the top? Or had our left stick forward and right stick all the way right?
Setting Motor Power
For our last step, our robot sets the power of each pair of motors based on all our calculations!
Clipping Input Values
This section of code is not within the provided copy of the mecanum code used in this tutorial. Follow the steps below to add it!
While driving, there's a possibility a value may fall outside the range of the motor's power (-1 to 1). To help make sure no inputs are lost because of this, we can clip our calculated values to remain inside the intended range.
Creating a Max Variable
First we need to create a new variable called "max".
In Blocks, we use something called a "list", also known as an "array" to store a set of numbers. In this case, we will be storing all of our motor powers.
Since our motor power will sometimes be negative, such as when turning in reverse, we want to make sure we're using the absolute value of our motor powers.
Creating the If/Else Statement
Next, we will set up our If/Else to check if our "max" is higher than 1 and therefore outside the motor's range.
Using this statement, we'll readjust each of our motor's power back to be within range proportionally by dividing each by the max value.
Now our full drivetrain function will look like the following:
Last updated