智能驱动#
介绍#
The smartdrive class controls how a robot drives and turns using motors, wheels, and a sensor. A smartdrive can use an Inertial Sensor or Gyro Sensor to track heading and rotation.
A smartdrive uses the sensor to help the robot move and turn precisely. At the start of each project, the drivetrain calibrates the sensor automatically. Keep the robot still for about 2 seconds during calibration, so the robot can move and turn correctly.
The smartdrive class is based on the drivetrain class. It can use the same drive and turn functions as drivetrain, and it also adds sensor-based functions like turnToHeading and turnToRotation.
类构造函数#
1 — Creates a smartdrive using existing
motor_groupobjects for the left (&l) and right (&r) sides, along with an Inertial Sensor or Gyro Sensor.smartdrive( motor_group &l, motor_group &r, inertial &g, double wheelTravel = 320, double trackWidth = 320, double wheelBase = 130, distanceUnits unit = mm, double externalGearRatio = 1.0 );
2 — Creates a smartdrive using existing
motorobjects for the left (&l) and right (&r) sides, along with an Inertial Sensor or Gyro Sensor.smartdrive( motor &l, motor &r, inertial &g, double wheelTravel = 320, double trackWidth = 320, double wheelBase = 130, distanceUnits unit = mm, double externalGearRatio = 1.0 );
类析构函数#
Destroys the smartdrive object and releases associated resources.
~smartdrive();
参数#
The sensor parameter can be an inertial or gyro object.
范围 |
类型 |
描述 |
|---|---|---|
|
|
References to existing |
|
|
A reference to an existing |
|
|
The circumference of the drivetrain wheels. The default is |
|
|
The distance between the left and right wheels. The default is |
|
|
The distance between the front and back wheels. The default is |
|
|
The unit for |
|
|
The gear ratio used to adjust drive distances if gears are used. The default is |
例子#
/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */
// Create the left and right motor instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);
// Create the inertial instance
inertial myInertial = inertial(PORT3);
// Create the smartdrive instance
smartdrive myDrivetrain = smartdrive(
leftMotor, // left motor object
rightMotor, // right motor object
myInertial, // inertial object
259.34, // wheelTravel
320, // trackWidth
40, // wheelBase
mm, // unit
1.0 ); // externalGearRatio
成员功能#
The smartdrive class includes the following member functions:
动作——使用航向或旋转控制机器人转向。
turnToHeading— Turns the robot to face a specific heading from -359 to 359 degrees. The robot will turn the shortest direction to reach the target heading.turnToRotation— Turns the robot to a specific rotation.calibrateDrivetrain— Calibrates the drivetrain’s configured Inertial Sensor or Gyro Sensor.
设置 — 调整航向和旋转值。
setHeading— Changes the robot’s current heading to a new heading.setRotation— Changes the robot’s current rotation to a new rotation.
数值——检查方向和旋转角度。
heading— Returns the robot’s current heading from 0 to 359 degrees.rotation— Returns the robot’s current rotation.
A smartdrive can also use the inherited member functions from drivetrain, such as drive, driveFor, turn, turnFor, stop, isDone, and isMoving.
Before calling any smartdrive member functions, a smartdrive instance must be created, as shown below:
/* This constructor is required when using VS Code.
Drivetrain configuration is generated automatically
in VEXcode using the Device Menu. Replace the values
as needed. */
// Create the left and right motor instances
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);
// Create the inertial instance
inertial myInertial = inertial(PORT3);
// Create the smartdrive instance
smartdrive myDrivetrain = smartdrive(
leftMotor, // left motor object
rightMotor, // right motor object
myInertial, // inertial object
259.34, // wheelTravel
320, // trackWidth
40, // wheelBase
mm, // unit
1.0 ); // externalGearRatio
turnToHeading#
A heading is the direction the robot is facing, measured in degrees. turnToHeading turns the robot to face a specific heading from -359 to 359 degrees. The robot will turn the shortest direction to reach the target heading.
机器人的初始航向角为0度。
程序会等到机器人完成转向后才运行下一行代码。
Available Functions1 — 使用当前配置的转弯速度 将传动系统转向指定的航向。
bool turnToHeading( double angle, rotationUnits units, bool waitForCompletion = true );
Parameters2 — 将传动系统转向指定航向,并达到指定速度。
bool turnToHeading( double angle, rotationUnits units, double velocity, velocityUnits units_v, bool waitForCompletion = true );
范围 |
类型 |
描述 |
|---|---|---|
|
|
The direction the robot should face, in degrees. This can be from -359 to 359 when using |
|
|
The rotation unit: |
|
|
The velocity to turn with from 0% to 100% when using |
|
|
The velocity unit: |
|
|
|
返回机器人是否达到目标航向,以布尔值表示。
true— The robot reached the target heading.false— The robot did not finish the turn, or the function returned before the turn completed becausewaitForCompletionwas set tofalse.
Executing another drivetrain movement function (such as
turnordrive) whileturnToHeadingis in progress will interrupt the current movement.Because
turnToHeadingis target-based (uses anangleparameter), functions such asisDoneandisMovingwork withturnToHeading.
// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);
turnToRotation#
turnToRotation turns the robot to a specific rotation.
Rotation is how much the robot has turned, measured in degrees or revolutions. At the beginning of a project, the rotation value is set to 0 degrees. Rotation can also be set using the setRotation function.
旋转角度是绝对值。这意味着转弯方向取决于机器人当前的旋转角度。向右转弯会增加旋转角度,向左转弯会减少旋转角度。
例如,如果机器人从0度开始,你将其旋转720度,它会向右转两次。如果你再将其旋转360度,它会向左转一次,因为360小于720。
程序会等到机器人完成转向后才运行下一行代码。
Available Functions1 — 使用当前配置的旋转速度 将传动系统旋转到指定的旋转方向。
bool turnToRotation( double angle, rotationUnits units, bool waitForCompletion = true );
Parameters2 — 使传动系统以指定的速度旋转到指定的转速。
bool turnToRotation( double angle, rotationUnits units, double velocity, velocityUnits units_v, bool waitForCompletion = true );
范围 |
类型 |
描述 |
|---|---|---|
|
|
机器人将转向的旋转值。 |
|
|
The rotation unit: |
|
|
The velocity to turn with from 0% to 100% when using |
|
|
The velocity unit: |
|
|
|
返回机器人是否达到目标旋转角度,以布尔值表示。
true— The robot reached the target rotation.false— The robot did not finish the turn, or the function returned before the turn completed becausewaitForCompletionwas set tofalse.
Executing another drivetrain movement function (such as
turnordrive) whileturnToRotationis in progress will interrupt the current movement.Because
turnToRotationis target-based (uses anangleparameter), functions such asisDoneandisMovingwork withturnToRotation.
// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);
calibrateDrivetrain#
calibrateDrivetrain calibrates the Inertial Sensor or Gyro Sensor configured with the smartdrive.
校准有助于传感器正确测量运动。校准期间,请保持机器人静止约 2 秒钟。如果机器人在校准期间移动,传感器可能无法正确测量运动。
程序将等待校准完成后再运行下一行代码。
calibrateDrivetrain is generated automatically by VEXcode when a drivetrain is configured with an Inertial Sensor or Gyro Sensor. It is provided as part of the project source and is not part of the VEX EXP C++ API.
void calibrateDrivetrain();
此函数不接受任何参数。
Return Values此函数不返回值。
Notes机器人会在每个项目开始时自动进行校准。
校准过程中,请保持机器人静止约 2 秒钟。
The following is the auto-generated implementation of calibrateDrivetrain created by VEXcode:
bool vexcode_initial_drivetrain_calibration_completed = false;
void calibrateDrivetrain() {
wait(200, msec);
Brain.Screen.print("Calibrating");
Brain.Screen.newLine();
Brain.Screen.print("Inertial");
DrivetrainInertial.calibrate();
while (DrivetrainInertial.isCalibrating()) {
wait(25, msec);
}
vexcode_initial_drivetrain_calibration_completed = true;
// Clears the screen and returns the cursor to row 1, column 1.
Brain.Screen.clearScreen();
Brain.Screen.setCursor(1, 1);
}
setHeading#
A heading is the direction the robot is facing, measured in degrees. setHeading changes the robot’s current heading to a new heading value.
例如,如果机器人转向右侧,将航向设置为 0 度,则该右侧位置将成为新的 0 度航向。然后,机器人可以根据新的航向转向其他位置。
Available Functionsvoid setHeading(
double value,
rotationUnits units);
范围 |
类型 |
描述 |
|---|---|---|
|
|
The heading value to set for the robot. This can be from -359 to 359 when using |
|
|
The heading unit: |
此函数不返回值。
Examples// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);
setRotation#
Rotation is how much the robot has turned, measured in degrees or revolutions. At the beginning of a project, the rotation value is set to 0 degrees. setRotation changes the robot’s current rotation to a new value.
例如,如果机器人向右转了两圈,它的旋转角度将为 720 度。将旋转角度设置为 0 度会将旋转角度从 720 度重置为 0 度。然后,机器人可以根据这个新的旋转角度进行旋转。
Available Functionsvoid setRotation(
double value,
rotationUnits units);
范围 |
类型 |
描述 |
|---|---|---|
|
|
要设置的机器人旋转值。 |
|
|
The rotation unit: |
此函数不返回值。
Examples// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);
heading#
A heading is the direction the robot is facing, measured in degrees. heading returns the robot’s current heading from 0 to 359 degrees.
机器人的初始航向角为0度。
Available Functionsdouble heading( rotationUnits units = rotationUnits::deg );
范围 |
类型 |
描述 |
|---|---|---|
|
|
Optional. The unit to return heading in: |
Returns the robot’s current heading as a double in the selected unit.
// Show heading before and after turning
Brain.Screen.print("Before: %f", myDrivetrain.heading(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.heading(degrees));
myDrivetrain.stop();
rotation#
Rotation is how much the robot has turned, measured in degrees or revolutions. At the beginning of a project, the rotation value is set to 0 degrees. rotation returns the robot’s current rotation.
向右转会增加旋转角度,向左转会减少旋转角度。例如,向右转两圈将得到 720 度的旋转角度。
Available Functionsdouble rotation( rotationUnits units = rotationUnits::deg );
范围 |
类型 |
描述 |
|---|---|---|
|
|
Optional. The unit to return heading in: |
Returns the robot’s current rotation as a double in the selected unit.
// Show rotation before and after turning
Brain.Screen.print("Before: %f", myDrivetrain.rotation(degrees));
myDrivetrain.turnFor(right, 90, degrees);
wait(1, seconds);
Brain.Screen.newLine();
Brain.Screen.print("After: %f", myDrivetrain.rotation(degrees));
myDrivetrain.stop();