My team is planning on changing our H-drive into a X-drive. I have been debating to myself whether or not to have a 6-motor X-drive. My main concern is that it won’t move correctly because of the imbalance of power between the wheels since you would have 2 motors for two of your wheels while the other two wheels only have one motor. Will this affect anything?
Last year we had a 6 motor mecanum drive without issue because the speeds were the same and unless I am missing some important difference 6 motor x drive won’t be bad.
We’ve done fine with 6 motor X drive.
There really shouldn’t be a noticeable difference in the wheel speeds.
Thanks for your comments! We were mainly concerned that it would have problems going straight.
EDIT: We are going to use a flip-out 6-motor X-drive
Our club is currently attempting to figure out how you would build a 6 motor X-drive. It may be a simple explanation but we can’t seem to understand it at the moment…
Your front two wheels (flipout or not) would be powered by one motor each.
Your back two wheels would be powered by two motors each.
It would make building much simpler if you directly attached your wheel axles to your motors.
A good example of this would be Team 44 GER from Cleansweep.
How fast did you put them? And did you have trouble strafing?
Thank you!
(oh and MERRY CHRISTMAS!!!)
Unless you select your gear ratios such that your motors spend more than a fraction of a second on the low speed end of the torque-speed curve, you will notice no appreciable difference in speed between your 2 motor wheels and 1 motor wheels. Adding motors to a drive will allow you to gear it more aggressively, but you still will likely observe next to no issues.
It is recommended that you put your 4 motors on the end of the robot that carries a greater percent of the robot’s weight distribution. Often, holonomic drivetrains with uneven weight distribution can be seen to drift, rotating about this side of the drivetrain when strafing due to the increased load. Adding your extra motors to this side helps compensate without resorting to software solutions that can cut your robot’s torque and acceleration potential. Also, remember that adding torque to your drivetrain is useless if you don’t have the tractive force to back it up.
Our flip-out 6-motor X-drive is all built in everything, but we’re having trouble programming it. We don’t have much of an idea. Can someone help us with this?
Which environment, EasyC or ROBOTC? How were the motors finally configured?
We are using EasyC V4. 2 motors each for the 2 back wheels, and only one motor each for 2 of the front wheels.
The simplest way (which I think should work) is just to use two holonomic blocks with the same joystick values, the same front motor values and different values for the back motors. Lets say front motors are on ports 1 & 2, the first two rear motors are non ports 3 & 4, the second set of rear motors on ports 5 & 6. your holo blocks may looks like this. (also with right hand motors reversed)
Holonomic ( 1 , 3 , 4 , 1 , 1 , 2 , 3 , 4 , 0 , 1 , 0 , 1 ) ;
Holonomic ( 1 , 3 , 4 , 1 , 1 , 2 , 5 , 6 , 0 , 1 , 0 , 1 ) ;
Another way would be to use a user function, read the joystick values and set the motors yourself. For example, this code (should, it’s untested, no cortex at work today) do the same thing as the two statements above.
// holo.c : implementation file
#include "Main.h"
void
MyHolo()
{
long drive_l_front;
long drive_l_back;
long drive_r_front;
long drive_r_back;
// Get joystick
int forward = GetJoystickAnalog( 1 , 3 ) ;
int right = GetJoystickAnalog( 1 , 4 ) ;
int turn = GetJoystickAnalog( 1 , 1 ) ;
// Set drive
drive_l_front = forward + turn + right;
drive_l_back = forward + turn - right;
drive_r_front = forward - turn - right;
drive_r_back = forward - turn + right;
// normalize drive so max is 127 if any drive is over 127
int max = Abs(drive_l_front);
if (Abs(drive_l_back) > max)
max = Abs(drive_l_back);
if (Abs(drive_r_back) > max)
max = Abs(drive_r_back);
if (Abs(drive_r_front) > max)
max = Abs(drive_r_front);
if (max>127) {
drive_l_front = 127 * drive_l_front / max;
drive_l_back = 127 * drive_l_back / max;
drive_r_back = 127 * drive_r_back / max;
drive_r_front = 127 * drive_r_front / max;
}
// Send to motors
// left drive
SetMotor ( 1 , drive_l_front ) ;
SetMotor ( 3 , drive_l_back ) ;
SetMotor ( 5 , drive_l_back ) ;
// right drive - reversed
SetMotor ( 2 , (-1) * drive_r_front ) ;
SetMotor ( 4 , (-1) * drive_r_back ) ;
SetMotor ( 6 , (-1) * drive_r_back ) ;
}