VEX 通用函数调用方法 (PROS & LemLib)

本文档总结了基于 PROS 内核和 LemLib 库的常用函数及配置方法。

1. 基础 PROS 函数

马达控制 (Motor Group)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 1. 初始化马达组 (端口号,负数表示反转)
pros::MotorGroup left_mg({5, -6, -7, -8, 9});
pros::MotorGroup right_mg({15, -16, 17, 18, -19});

// 2. 设置刹车模式 (HOLD: 锁死, COAST: 滑行, BRAKE: 主动刹车)
left_mg.set_brake_mode_all(pros::E_MOTOR_BRAKE_HOLD);
right_mg.set_brake_mode_all(pros::E_MOTOR_BRAKE_HOLD);

// 3. 清零编码器位置 (用于计算相对转动角度)
left_mg.tare_position();
right_mg.tare_position();

// 4. 控制移动
left_mg.move(100); // 速度 -127 到 127
right_mg.move(-100); // 差速转向

// 5. 获取控制器摇杆值 (-127 到 127)
int y_val = master.get_analog(ANALOG_RIGHT_Y);
int x_val = master.get_analog(ANALOG_RIGHT_X);

传感器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// 1. 初始化 IMU (端口号)
pros::Imu imu_sensor(1);

// 2. 校准环节 (必须静止放置约 2 秒)
imu_sensor.reset();
while(imu_sensor.is_calibrating()) {
pros::delay(10);
}

// 3. 读取角度数据 (返回 float)
float yaw = imu_sensor.get_yaw(); // 偏航角 (-180° ~ 180°)
float pitch = imu_sensor.get_pitch(); // 俯仰角 (前后倾斜)
float roll = imu_sensor.get_roll(); // 横滚角 (左右倾斜)
float heading = imu_sensor.get_heading(); // 罗盘方向 (0° ~ 360°)

// 4. 重置当前角度为 0
imu_sensor.tare_rotation();

// 5. 读取原始数据
auto gyro_rate = imu_sensor.get_gyro_rate(); // 角速度
auto accel = imu_sensor.get_accel(); // 加速度 (X,Y,Z)

电磁阀与汽缸

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1. 初始化
pros::ADIDigitalOut solenoid('A'); // 使用端口字母 'A'-'H'
// 或者 pros::ADIDigitalOut solenoid(1); // 使用端口号

// 2. 控制状态
solenoid.set_value(true); // 通电/伸出/打开
solenoid.set_value(false); // 断电/缩回/关闭

// 💡 提示:电磁阀没有状态反馈,建议在代码中使用 bool 变量跟踪状态
bool is_extended = false;
if (controller.get_digital_new_press(PROS_CONTROLLER_DIGITAL_L1)) {
is_extended = !is_extended;
solenoid.set_value(is_extended);
}

控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 1. 读取按键 (持续按下返回 true)
if (controller.get_digital(PROS_CONTROLLER_DIGITAL_A)) {
// 执行动作
}

// 2. 读取新按下 (只触发一次,防止连发)
if (controller.get_digital_new_press(PROS_CONTROLLER_DIGITAL_R1)) {
// 切换状态
}

// 常用按键常量:
// PROS_CONTROLLER_DIGITAL_A, B, X, Y
// PROS_CONTROLLER_DIGITAL_L1, R1, L2, R2
// PROS_CONTROLLER_DIGITAL_UP, DOWN, LEFT, RIGHT

其他工具函数

1
2
3
4
5
6
7
// LCD 屏幕显示
pros::lcd::clear_line(1);
pros::lcd::set_text(1, "Hello VEX!");

// 时间控制
pros::delay(100); // 暂停 100 毫秒
uint32_t time = pros::milli(); // 获取运行总时间(ms)

自定义PID示例

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
56
57
58
59
60
61
62
void PID_rotate_to_degree(double target_degree) {
// PID 参数
const double kP = 0.75;
const double kI = 0.01;
const double kD = 1.0;

double error = 0;
double prev_error = 0;
double integral = 0;
double derivative = 0;
double motor_power = 0.0;

// 重置 IMU 角度
imu_sensor.tare_rotation();
while (imu_sensor.is_calibrating()) { pros::delay(10); }

// 安全计数器
int safety_counter = 0;
const int MAX_ITERATIONS = 500;

// 可选:创建一个任务在屏幕上实时显示数据
pros::Task display_task([&]() {
while (true) {
double current = imu_sensor.get_rotation();
pros::lcd::print(1, "Tgt: %.1f Cur: %.1f", target_degree, current);
pros::delay(20);
}
});

do {
double current_degree = imu_sensor.get_rotation();
error = target_degree - current_degree;

integral += error;
derivative = error - prev_error;
prev_error = error;

// 积分限幅 (防止积分饱和)
if (integral > 300) integral = 300;
if (integral < -300) integral = -300;

// 计算输出
motor_power = (error * kP) + (integral * kI) + (derivative * kD);

// 功率限幅 (-60 到 60)
if (motor_power > 60) motor_power = 60;
else if (motor_power < -60) motor_power = -60;

// 应用动力 (差速转向)
left_mg.move(motor_power);
right_mg.move(-motor_power);

safety_counter++;
pros::delay(20); // 控制循环频率 ~50Hz

} while (fabs(error) > 2.0 && safety_counter < MAX_ITERATIONS);

// 停止并清理
left_mg.brake();
right_mg.brake();
display_task.remove();
}

2.Limlib相关

配置流程概览

  • 定义硬件: MotorGroup: 左右马达组 ImuSensor: 惯性传感器 RotationSensor: 追踪轮 (Tracking Wheels,如有)
  • 创建 Chassis: 组合 drivetrain, lateral PID, angular PID, odom sensors, curves.
  • 调用运动函数:
    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
    //常用运动函数
    // 1. 移动到绝对坐标点 (x, y) 并朝向绝对角度 (theta)
    chassis.moveToPose(x, y, theta, timeout_ms, params);

    // 2. 仅移动到绝对坐标点 (x, y),不改变朝向
    chassis.moveToPoint(x, y, timeout_ms, params);

    // 3. 旋转到绝对角度 (theta, 0-360°)
    chassis.turnToHeading(theta, timeout_ms, params);

    // 4. 相对旋转角度 (angle, 例如转 90 度)
    chassis.turnToAngle(angle, timeout_ms, params);


    //部分参数:
    //运动类
    lemlib::MoveParams params;
    params.forwards = true; // 是否向前移动
    params.maxSpeed = 100; // 最大线速度 (in/s)
    params.minSpeed = 40; // 最小线速度 (in/s)
    params.earlyExitRange = 100; // 提前退出误差范围 (0.01 inches)
    params.lookahead = 10; // 前瞻距离 (inches),越大路径越平滑
    params.curvature = 0.0; // 路径曲率
    params.jerk = 250; // 加加速度限制 (in/s^3)
    params.ignoreObstacles = false; // 是否忽略障碍物检测

    //转向类
    lemlib::TurnParams params;
    params.direction = lemlib::AngularDirection::AUTO; // AUTO, CW, CCW
    params.maxSpeed = 180; // 最大角速度 (deg/s)
    params.minSpeed = 30; // 最小角速度 (deg/s)
    params.earlyExitRange = 100; // 提前退出误差范围 (0.01 degrees)
    params.lookahead = 1.0; // 角度前瞻
    params.relative = false; // 是否为相对角度 (turnToAngle 专用)