Mecanum Single Joystick Control not working

We have put together our Mecanum drive and have the default drive program for a single joystick and have the motor controllers assigned the right ID in the web config (we are using CAN Talon SRX’s) and the right ID’s in the right spots but when we try and drive the robot it doesn’t move except in Mecanum which is moving it forward and backwards. we inverted the front motors and now it moves forward and back correctly but when we try to turn it Mecanums in the opposite direction. And when we try to Mecanum the wheels opposes each other and nothing happens. We are using a Logitech attack 3 to control the robot.

Any help would be appreciated.

Try this:

Swap the x and y inputs.
Invert your left motors in Begin.
Go into and change the inputs as well.

It should look like this, Begin not shown. You may want to change rotation to 0 as the Attack 3’s third axis is the throttle and that may cause unwanted movement.

Thank you your picture helped a lot but we are still having some issues could we see your for the drive. Also what controller are you using?
Thank you aging.
Team 2029

We used both jags and Victor 884s for our frame (at different times). Our code had the left motors ininverted in Begin. I cannot provide said picture atm because I am away from my computer. You should try to play aound with your axises and see what happens.

No, don’t do that.

Just make absolutely sure that the corners you have your motors on are the same as the corners you’re telling the program they are on in Begin. Usually it’s the two right side motors that need to be inverted.

How did you change it from Open 2 Motors to Open 4 Motors? If you used the “Replace” menu option, you might find that some of the constants’ labels are left over from the default code and don’t match what are actually connected to. You might find it easiest to delete the Open 4 Motor Drive function and all its associated inputs from, then replace them.

Which ones need to be inverted depends on the number of stages in your gearbox; each stage reverses the rotation direction.

The reason that only one side needs to be inverted is that the motors themselves have opposite orientations. A clockwise shaft rotation (viewed from the motor side) is forward on the left and reverse on the right for no gearbox or a spur gearbox with an even number of stages.

For some reason, it seems as the inputs in the default mecanum code are inverted for some people, including myself. I’m not sure if this occurs for everyone, but just try to play with your joystick inputs and inversions. I personally had to edit the default code to get the wheels to spin the right way. You probably don’t have to.

If by “play with your joystick inputs” you mean “wire the joystick values to the wrong inputs on the robot drive vi”, that should never be necessary… and it makes your code confusing and difficult for others to help you.

I personally had to edit the default code to get the wheels to spin the right way. You probably don’t have to.

If by “edit the default code” you mean “edit the inverse kinematic computation”, that should never be necessary…and it makes your code confusing and difficult for others to help you.

Correct me if I’m wrong, but I’ve been reading that the default mecanum code in the WPI library actually takes the incorrect inputs by default. I’m not sure if thats true for everyone, but it was only with that advice I recieved on this forum concerning possible incorrect code that we were able to get mecanum working. And this was after countless tests, wire swaps, and inversions.

Thank you all we got it working our wheels were inverted. ::rtm::

Would you please post a link to where you’ve been reading that?

I don’t have access to LabVIEW to inspect its code, but here’s the inverse kinematics code taken straight from 2015 WPILib RobotDrive.Java:

*wheelSpeeds[MotorType.kFrontLeft_val] = xIn + yIn + rotation;
wheelSpeeds[MotorType.kFrontRight_val] = -xIn + yIn - rotation;
wheelSpeeds[MotorType.kRearLeft_val] = -xIn + yIn + rotation;
wheelSpeeds[MotorType.kRearRight_val] = xIn + yIn - rotation;

I’m not a Java guru, but it looks correct to me.

I’m not quite sure how credible this is, but it sure did help me.

I compared the LV code to the attached Java, and they are the same.

The LV code first does a gyro transformation in case you have one and want to use field coordinates.

The code then uses the same expressions on the same inputs with the same output names. The code then normalizes the motor outputs.

If you have an issue with the code, can you be more specific about what was wrong with it?

Greg McKaskle