MecanumDrive

麦轮底盘教程

首先可以大部分参考这个官方教程:
https://gm0.org/zh-cn/latest/docs/software/tutorials/mecanum-drive.html
下面我对官方教程做一些补充说明

1. 如何推导出⻨克纳姆轮的不同移动⽅式

简而言之,每个麦轮会有一个斜向的实际作用力,我们可以把它分解成竖直和水平方向的两个分力,并且通过力的合成实现不同移动。

\"MecanumDrive\"
\"Chasis\"
下图是电机全部为正值时(向前转)的⻨轮的⼒和向量。当电机为负值时(向后转),⻨轮的⼒和向量都与左图中的呈中⼼对称。

2. 底盘 demo ⽰例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package org.firstinspires.ftc.teamcode; //定义这个class所在的包名,如果把程序放在其他包下,包名不对应就会报错
//写自己的代码时都会在teamcode这个package中

import com.qualcomm.robotcore.eventloop.opmode.LinearOpMode;
import com.qualcomm.robotcore.eventloop.opmode.TeleOp;
import com.qualcomm.robotcore.hardware.DcMotor;
import com.qualcomm.robotcore.hardware.DcMotorEx;

@TeleOp(name="Chasis") //一定要写name,这样你的程序才能出现在 driver hub 的列表中
//@TeleOp的意思是声明这个程序是一个手动控制程序,相应地 @Autonomous 是声明这是一个自动程序
public class Chasis extends LinearOpMode {
@Override //重写方法,让程序按照下面重写的执行
public void runOpMode() {


//链接硬件的方法,""里的硬件名称需要与 driver hub 里的config一致,注意要统一所有人的config
//DcMotorEx是DcMotor的扩展,两种任选其一
DcMotorEx frontLeftMotor = hardwareMap.get(DcMotorEx.class,"leftFrontMotor");
DcMotorEx backLeftMotor = hardwareMap.get(DcMotorEx.class,"leftBackMotor");
DcMotorEx frontRightMotor = hardwareMap.get(DcMotorEx.class,"rightFrontMotor");
DcMotorEx backRightMotor = hardwareMap.get(DcMotorEx.class,"rightBackMotor");

//底盘安装电机时左右两侧是镜像的,setDirection设置右侧电机反转
frontRightMotor.setDirection(DcMotor.Direction.REVERSE);
backRightMotor.setDirection(DcMotor.Direction.REVERSE);

//程序停在wait for start, driver hub显示init,启动程序需要点击init再点开始
//完成初始化后,让车不会乱动

waitForStart();

while (opModeIsActive()){
//程序启动后获取手柄左右两个摇杆的数值
double x = gamepad1.left_stick_x; //左摇杆x值控制车左右平移
double y = -gamepad1.left_stick_y; //左摇杆y值控制车前后平移
double rx = -gamepad1.right_stick_x; //右摇杆x值控制旋转

//max(最大电机功率绝对值,1),意思是当电机功率超过(-1,1)的范围时要取最大电机功率绝对值作为一个分母
//当超过范围时要把四个电机功率都除以这个分母a,使最大的电机功率为1,所有轮子的功率满足原本的比例关系
double a = Math.max(Math.abs(x)+ Math.abs(y)+ Math.abs(rx), 1);

//不在这里写详细的推导,举一个简化例子
//当希望车向左前方平移,左摇杆向左前方推,这时x=-1,y=1,右摇杆不动
//frontLeftMotor的功率是y + x + rx=0
//backLeftMotor的功率是y-x+rx=2
//frontRightMotor的功率是y-x-rx=2
//backRightMotor的功率是y+x-rx=0
//正好符合上面图中的方式
frontLeftMotor.setPower((y + x + rx) / a);
backLeftMotor.setPower((y-x+rx)/a);
frontRightMotor.setPower((y-x-rx)/a);
backRightMotor.setPower((y+x-rx)/a);
}
}
}

3. 测试

在driver hub的手机上测试,手机要链接车的WiFi。
在dirver hub里写好config,麦轮底盘用到了control hub 和expansion hub,在确定接口的时候可以顺着每个电机的线找到相应的hub和接口,编辑好config后点击 activate。

Tip
多人协作时要统一硬件映射名称,共同使用一个config

用CtoA数据线连接电脑和control hub,注意电脑不要连车的WiFi,AS的顶栏会有一个刷新的图标,点击之后传输程序,传程序之前要写程序的name。

1
@TeleOp(name="Chasis") 

传输好之后在driver hub右侧的倒三角(右侧是TeleOp手动程序)选你自己的程序,把手柄连接到手机上。
第一次启动手柄时按start和x键,手柄震动表示链接成功。