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
| pros::MotorGroup left_mg({5, -6, -7, -8, 9}); pros::MotorGroup right_mg({15, -16, 17, 18, -19});
left_mg.set_brake_mode_all(pros::E_MOTOR_BRAKE_HOLD); right_mg.set_brake_mode_all(pros::E_MOTOR_BRAKE_HOLD);
left_mg.tare_position(); right_mg.tare_position();
left_mg.move(100); right_mg.move(-100);
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
| pros::Imu imu_sensor(1);
imu_sensor.reset(); while(imu_sensor.is_calibrating()) { pros::delay(10); }
float yaw = imu_sensor.get_yaw(); float pitch = imu_sensor.get_pitch(); float roll = imu_sensor.get_roll(); float heading = imu_sensor.get_heading();
imu_sensor.tare_rotation();
auto gyro_rate = imu_sensor.get_gyro_rate(); auto accel = imu_sensor.get_accel();
|
电磁阀与汽缸
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| pros::ADIDigitalOut solenoid('A');
solenoid.set_value(true); solenoid.set_value(false);
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
| if (controller.get_digital(PROS_CONTROLLER_DIGITAL_A)) { }
if (controller.get_digital_new_press(PROS_CONTROLLER_DIGITAL_R1)) { }
|
其他工具函数
1 2 3 4 5 6 7
| pros::lcd::clear_line(1); pros::lcd::set_text(1, "Hello VEX!");
pros::delay(100); uint32_t time = pros::milli();
|
自定义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) { 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_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); 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); } 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
|
chassis.moveToPose(x, y, theta, timeout_ms, params);
chassis.moveToPoint(x, y, timeout_ms, params);
chassis.turnToHeading(theta, timeout_ms, params);
chassis.turnToAngle(angle, timeout_ms, params);
lemlib::MoveParams params; params.forwards = true; params.maxSpeed = 100; params.minSpeed = 40; params.earlyExitRange = 100; params.lookahead = 10; params.curvature = 0.0; params.jerk = 250; params.ignoreObstacles = false;
lemlib::TurnParams params; params.direction = lemlib::AngularDirection::AUTO; params.maxSpeed = 180; params.minSpeed = 30; params.earlyExitRange = 100; params.lookahead = 1.0; params.relative = false;
|