สมาร์ทไดรฟ์#

การแนะนำ#

คลาส smartdrive ควบคุมวิธีการขับเคลื่อนและเลี้ยวของหุ่นยนต์โดยใช้มอเตอร์ ล้อ และเซ็นเซอร์ smartdrive สามารถใช้ เซ็นเซอร์เฉื่อย หรือ เซ็นเซอร์ไจโร เพื่อติดตามทิศทางและการหมุน

ระบบขับเคลื่อนอัจฉริยะ A smartdrive ใช้เซ็นเซอร์เพื่อช่วยให้หุ่นยนต์เคลื่อนที่และเลี้ยวได้อย่างแม่นยำ ในตอนเริ่มต้นของแต่ละโครงการ ระบบขับเคลื่อนจะปรับเทียบเซ็นเซอร์โดยอัตโนมัติ ให้หุ่นยนต์อยู่นิ่งประมาณ 2 วินาทีในระหว่างการปรับเทียบ เพื่อให้หุ่นยนต์สามารถเคลื่อนที่และเลี้ยวได้อย่างถูกต้อง

คลาส smartdrive นั้นมีพื้นฐานมาจากคลาส drivetrain โดยสามารถใช้ฟังก์ชันการขับเคลื่อนและการหมุนแบบเดียวกับ drivetrain และยังเพิ่มฟังก์ชันที่ใช้เซ็นเซอร์ เช่น turnToHeading และ turnToRotation อีกด้วย

ตัวสร้างคลาส#

1 — สร้างสมาร์ทไดรฟ์โดยใช้วัตถุ motor_group ที่มีอยู่ ชิ้นสำหรับด้านซ้าย (&l) และด้านขวา (&r) พร้อมกับเซ็นเซอร์ความเฉื่อยหรือเซ็นเซอร์ไจโร

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 motor objects 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 );

ตัวทำลายคลาส#

ทำลายอ็อบเจ็กต์ smartdrive หมายเลข และปล่อยทรัพยากรที่เกี่ยวข้อง

~smartdrive();

พารามิเตอร์#

พารามิเตอร์ของเซ็นเซอร์อาจเป็น inertial หรือ gyro วัตถุ

พารามิเตอร์

พิมพ์

คำอธิบาย

&l / &r

motor_group / motor

References to existing motor or motor_group instances. Both parameters must be of the same type: either two motor_group instances or two motor instances. The &l parameter refers to the left motor or motor group, and &r refers to the right motor or motor group.

&g

gyro&

การอ้างอิงถึงอินสแตนซ์ไจ gyro หรือ inertial ที่มีอยู่แล้ว

wheelTravel

double

เส้นรอบวงของล้อระบบขับเคลื่อน ค่าเริ่มต้นคือ 320

trackWidth

double

ระยะห่างระหว่างล้อซ้ายและล้อขวา ค่าเริ่มต้นคือ 320

wheelBase

double

ระยะห่างระหว่างล้อหน้าและล้อหลัง ค่าเริ่มต้นคือ 130

unit

distanceUnits

หน่วยสำหรับ wheelTravel, trackWidthและ wheelBase: mm (มิลลิเมตร ค่าเริ่มต้น) หรือ inches

externalGearRatio

double

อัตราทดเกียร์ที่ใช้ปรับระยะทางการขับเคลื่อนหากมีการใช้เกียร์ ค่าเริ่มต้นคือ 1.0

ตัวอย่าง#

/* 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

ฟังก์ชันสมาชิก#

คลาส smartdrive ประกอบด้วยฟังก์ชันสมาชิกต่อไปนี้:

การกระทำ — หมุนหุ่นยนต์โดยใช้ทิศทางหรือการหมุน

  • turnToHeading — หมุนหุ่นยนต์ให้หันหน้าไปยังทิศทางที่กำหนดตั้งแต่ -359 ถึง 359 องศา หุ่นยนต์จะหมุนไปในทิศทางที่สั้นที่สุดเพื่อไปยังทิศทางเป้าหมาย

  • turnToRotation — หมุนหุ่นยนต์ไปที่มุมการหมุนที่กำหนด

  • calibrateDrivetrain — ปรับเทียบ เซ็นเซอร์เฉื่อย หรือ เซ็นเซอร์ไจโร ที่กำหนดค่าไว้ของระบบขับเคลื่อน

การตั้งค่า — ปรับค่าทิศทางและการหมุน

  • setHeading — เปลี่ยนทิศทางปัจจุบันของหุ่นยนต์เป็นทิศทางใหม่

  • setRotation — เปลี่ยนการหมุนปัจจุบันของหุ่นยนต์เป็นการหมุนใหม่

ค่าต่างๆ — ตรวจสอบหัวเรื่องและการหมุน

  • heading — ส่งคืนทิศทางปัจจุบันของหุ่นยนต์จาก 0 ถึง 359 องศา

  • rotation — ส่งคืนการหมุนปัจจุบันของหุ่นยนต์

สมาร์ทไดรฟ์ smartdrive ยังสามารถใช้ฟังก์ชันสมาชิกที่สืบทอดมาจาก drivetrain เช่น drive, driveFor, turn, turnFor, stop, isDoneและ isMoving

ก่อนเรียกใช้ฟังก์ชันสมาชิก smartdrive ใดๆ จะต้องสร้างอินสแตนซ์ smartdrive ก่อน ดังแสดงด้านล่าง:

/* 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#

ทิศทาง (Heading) คือทิศทางที่หุ่นยนต์หันหน้าไป โดยวัดเป็นองศา คำสั่ง turnToHeading จะหมุนหุ่นยนต์ให้หันหน้าไปในทิศทางที่กำหนด ตั้งแต่ -359 ถึง 359 องศา หุ่นยนต์จะหมุนไปในทิศทางที่สั้นที่สุดเพื่อไปยังทิศทางเป้าหมาย

ทิศทางเริ่มต้นของหุ่นยนต์คือ 0 องศา

โปรเจ็กต์จะรอจนกว่าหุ่นยนต์จะหมุนเสร็จก่อนที่จะรันโค้ดบรรทัดถัดไป

Available Functions

1 — หมุนระบบขับเคลื่อนไปยังทิศทางที่กำหนดโดยใช้ ความเร็วในการเลี้ยวที่กำหนดค่าไว้ในปัจจุบัน

bool turnToHeading(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — หมุนระบบขับเคลื่อนไปยังทิศทางที่กำหนดด้วยความเร็วที่กำหนด

bool turnToHeading(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

angle

double

ทิศทางที่หุ่นยนต์ควรหันหน้าไป (หน่วยเป็นองศา) ค่านี้สามารถอยู่ระหว่าง -359 ถึง 359 เมื่อใช้ deg หรือ degrees

units

rotationUnits

หน่วยการหมุน: deg (องศา), rev (รอบ) หรือ raw (หน่วยดิบ) หนึ่งรอบเท่ากับ 360 องศา

velocity

double

ความเร็วในการหมุนสามารถกำหนดได้ตั้งแต่ 0% ถึง 100% เมื่อใช้ velocityUnits::pct, ตั้งแต่ 0 ถึง 600 รอบต่อนาที เมื่อใช้ rpm rpmหรือตั้งแต่ 0 ถึง 3600 องศาต่อวินาที เมื่อใช้ dps dpsหากไม่ได้ระบุความเร็ว หุ่นยนต์จะหมุนด้วยความเร็วในการหมุนปัจจุบัน

units_v

velocityUnits

หน่วยความเร็ว: velocityUnits::pct (เปอร์เซ็นต์), rpm (รอบต่อนาที), หรือ dps (องศาต่อวินาที)

waitForCompletion

bool

true (ค่าเริ่มต้น) จะทำให้โปรเจ็กต์รอจนกว่าหุ่นยนต์จะหมุนเสร็จก่อนที่โค้ดบรรทัดถัดไปจะทำงาน false จะทำให้โค้ดบรรทัดถัดไปทำงานทันที

Return Values

ส่งคืนค่าบูลีนว่าหุ่นยนต์ไปถึงทิศทางเป้าหมายหรือไม่

  • true — หุ่นยนต์ไปถึงทิศทางเป้าหมายแล้ว

  • false — หุ่นยนต์ไม่ได้ทำการหมุนให้เสร็จสิ้น หรือฟังก์ชันส่งกลับก่อนที่การหมุนจะเสร็จสมบูรณ์เนื่องจาก waitForCompletion ถูกตั้งค่าเป็น false

Notes
  • การดำเนินการฟังก์ชันการเคลื่อนที่ของระบบขับเคลื่อนอื่น (เช่น turn หรือ drive) ในขณะที่ turnToHeading กำลังดำเนินการอยู่ จะขัดจังหวะการเคลื่อนที่ปัจจุบัน

  • เนื่องจาก turnToHeading เป็นแบบกำหนดเป้าหมาย (ใช้พารามิเตอร์ angle ) ฟังก์ชันต่างๆ เช่น isDone และ isMoving จึงทำงานร่วมกับ turnToHeading

Examples
// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

turnToRotation#

turnToRotation หมุนหุ่นยนต์ไปยังทิศทางการหมุนที่กำหนด

การหมุนคือจำนวนรอบที่หุ่นยนต์หมุน โดยวัดเป็นองศาหรือรอบ ในตอนเริ่มต้นโครงการ ค่าการหมุนจะถูกตั้งไว้ที่ 0 องศา นอกจากนี้ยังสามารถตั้งค่าการหมุนได้โดยใช้ฟังก์ชัน setRotation

ค่าการหมุนเป็นค่าสัมบูรณ์ ซึ่งหมายความว่าทิศทางการเลี้ยวขึ้นอยู่กับการหมุนปัจจุบันของหุ่นยนต์ การเลี้ยวขวาจะเพิ่มการหมุน และการเลี้ยวซ้ายจะลดการหมุน

ตัวอย่างเช่น ถ้าหุ่นยนต์เริ่มต้นที่ 0 องศา และคุณหมุนเป็น 720 องศา มันจะเลี้ยวขวา 2 ครั้ง จากนั้นถ้าคุณหมุนเป็น 360 องศา มันจะเลี้ยวซ้าย 1 ครั้ง เพราะ 360 น้อยกว่า 720

โปรเจ็กต์จะรอจนกว่าหุ่นยนต์จะหมุนเสร็จก่อนที่จะรันโค้ดบรรทัดถัดไป

Available Functions

1 — หมุนระบบขับเคลื่อนไปที่การหมุนที่ระบุโดยใช้ ความเร็วในการหมุนที่กำหนดค่าไว้ในปัจจุบัน

bool turnToRotation(
    double        angle,
    rotationUnits units,
    bool          waitForCompletion = true );

2 — หมุนระบบขับเคลื่อนให้ได้ความเร็วและทิศทางการหมุนตามที่กำหนด

bool turnToRotation(
    double        angle,
    rotationUnits units,
    double        velocity,
    velocityUnits units_v,
    bool          waitForCompletion = true );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

angle

double

ค่ามุมการหมุนที่หุ่นยนต์จะหมุนไป

units

rotationUnits

หน่วยการหมุน: deg (องศา), rev (รอบ) หรือ raw (หน่วยดิบ) หนึ่งรอบเท่ากับ 360 องศา

velocity

double

ความเร็วในการหมุนสามารถกำหนดได้ตั้งแต่ 0% ถึง 100% เมื่อใช้ velocityUnits::pct, ตั้งแต่ 0 ถึง 600 รอบต่อนาที เมื่อใช้ rpm rpmหรือตั้งแต่ 0 ถึง 3600 องศาต่อวินาที เมื่อใช้ dps dpsหากไม่ได้ระบุความเร็ว หุ่นยนต์จะหมุนด้วยความเร็วในการหมุนปัจจุบัน

units_v

velocityUnits

หน่วยความเร็ว: velocityUnits::pct (เปอร์เซ็นต์), rpm (รอบต่อนาที), หรือ dps (องศาต่อวินาที)

waitForCompletion

bool

true (ค่าเริ่มต้น) จะทำให้โปรเจ็กต์รอจนกว่าหุ่นยนต์จะหมุนเสร็จก่อนที่โค้ดบรรทัดถัดไปจะทำงาน false จะทำให้โค้ดบรรทัดถัดไปทำงานทันที

Return Values

ส่งคืนค่าบูลีนว่าหุ่นยนต์หมุนถึงเป้าหมายหรือไม่

  • true — หุ่นยนต์หมุนได้ตามเป้าหมายแล้ว

  • false — หุ่นยนต์ไม่ได้ทำการหมุนให้เสร็จสิ้น หรือฟังก์ชันส่งกลับก่อนที่การหมุนจะเสร็จสมบูรณ์เนื่องจาก waitForCompletion ถูกตั้งค่าเป็น false

Notes
  • การดำเนินการฟังก์ชันการเคลื่อนที่ของระบบขับเคลื่อนอื่น (เช่น turn หรือ drive) ในขณะที่ turnToRotation กำลังดำเนินการอยู่ จะขัดจังหวะการเคลื่อนที่ปัจจุบัน

  • เนื่องจาก turnToRotation เป็นแบบกำหนดเป้าหมาย (ใช้พารามิเตอร์ angle ) ฟังก์ชันต่างๆ เช่น isDone และ isMoving จึงทำงานร่วมกับ turnToRotation

Examples
// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

calibrateDrivetrain#

calibrateDrivetrain ปรับเทียบเซ็นเซอร์ความเฉื่อยหรือเซ็นเซอร์ไจโรที่กำหนดค่าไว้กับสมาร์ทไดรฟ์

การปรับเทียบช่วยให้เซ็นเซอร์วัดการเคลื่อนไหวได้อย่างถูกต้อง ให้หุ่นยนต์อยู่นิ่งประมาณ 2 วินาทีในระหว่างการปรับเทียบ หากหุ่นยนต์เคลื่อนที่ในระหว่างการปรับเทียบ เซ็นเซอร์อาจวัดการเคลื่อนไหวไม่ถูกต้อง

โปรเจ็กต์จะรอจนกว่าการปรับเทียบจะเสร็จสิ้นก่อนจึงจะเริ่มรันโค้ดบรรทัดถัดไป

calibrateDrivetrain ถูกสร้างขึ้นโดยอัตโนมัติโดย VEXcode เมื่อมีการกำหนดค่าระบบขับเคลื่อนด้วยเซ็นเซอร์เฉื่อยหรือเซ็นเซอร์ไจโร ฟังก์ชันนี้เป็นส่วนหนึ่งของซอร์สโค้ดของโปรเจ็กต์และไม่ได้เป็นส่วนหนึ่งของ VEX EXP C++ API

Available Functions
void calibrateDrivetrain();

Parameters

ฟังก์ชันนี้ไม่รับพารามิเตอร์ใดๆ

Return Values

ฟังก์ชันนี้ไม่ส่งค่ากลับ

Notes
  • หุ่นยนต์จะปรับเทียบตัวเองโดยอัตโนมัติเมื่อเริ่มต้นโครงการแต่ละครั้ง

  • ระหว่างการปรับเทียบ ให้คงหุ่นยนต์ไว้นิ่งประมาณ 2 วินาที

Function Implementation

ต่อไปนี้คือการใช้งานฟังก์ชัน calibrateDrivetrain ที่สร้างขึ้นโดยอัตโนมัติโดย 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#

ทิศทางที่หุ่นยนต์หันหน้าไป (Heading) คือทิศทางที่หุ่นยนต์กำลังหันหน้าไป โดยวัดเป็นองศา คำสั่ง setHeading จะเปลี่ยนทิศทางปัจจุบันของหุ่นยนต์เป็นค่าทิศทางใหม่

ตัวอย่างเช่น หากหุ่นยนต์หันไปทางขวา การตั้งค่าทิศทางเป็น 0 องศา จะทำให้ตำแหน่งที่หันไปทางขวานั้นกลายเป็น 0 องศาใหม่ จากนั้นหุ่นยนต์สามารถหันไปตำแหน่งอื่น ๆ ได้โดยอิงจากทิศทางใหม่นั้น

Available Functions
void  setHeading(
  double value,
  rotationUnits units);

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

value

double

ค่าทิศทางที่จะตั้งให้กับหุ่นยนต์ สามารถมีค่าได้ตั้งแต่ -359 ถึง 359 เมื่อใช้ deg หรือ degrees

units

rotationUnits

หน่วยหัวเรื่อง: deg (องศา), rev (รอบ), หรือ raw (หน่วยดิบ) หนึ่งรอบเท่ากับ 360 องศา

Return Values

ฟังก์ชันนี้ไม่ส่งค่ากลับ

Examples
// Face the new 0 degrees
myDrivetrain.setHeading(90, degrees);
myDrivetrain.turnToHeading(0, degrees);

setRotation#

การหมุน คือจำนวนรอบที่หุ่นยนต์หมุนไป โดยวัดเป็นองศาหรือรอบ ในตอนเริ่มต้นโครงการ ค่าการหมุนจะถูกตั้งไว้ที่ 0 องศา คำสั่ง setRotation จะเปลี่ยนค่าการหมุนปัจจุบันของหุ่นยนต์เป็นค่าใหม่

ตัวอย่างเช่น หากหุ่นยนต์หมุนไปทางขวาครบสองรอบ ค่าการหมุนของมันจะเป็น 720 องศา การตั้งค่าการหมุนเป็น 0 องศาจะรีเซ็ตค่าการหมุนจาก 720 เป็น 0 องศา จากนั้นหุ่นยนต์สามารถหมุนได้ตามค่าการหมุนใหม่นั้น

Available Functions
void  setRotation(
  double value,
  rotationUnits units);

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

value

double

ค่าการหมุนที่จะตั้งค่าสำหรับหุ่นยนต์

units

rotationUnits

หน่วยการหมุน: deg (องศา), rev (รอบ) หรือ raw (หน่วยดิบ) หนึ่งรอบเท่ากับ 360 องศา

Return Values

ฟังก์ชันนี้ไม่ส่งค่ากลับ

Examples
// Spin counterclockwise for 2 turns, then face forward
myDrivetrain.setRotation(720, degrees);
myDrivetrain.turnToRotation(0, degrees);

heading#

ทิศทาง (Heading) คือทิศทางที่หุ่นยนต์หันหน้าไป โดยวัดเป็นองศา ค่า Heading heading จะเปลี่ยนทิศทางปัจจุบันของหุ่นยนต์จาก 0 เป็น 359 องศา

ทิศทางเริ่มต้นของหุ่นยนต์คือ 0 องศา

Available Functions
double heading( rotationUnits units = rotationUnits::deg );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

units

rotationUnits

ตัวเลือกเสริม หน่วยที่จะใช้ในการกำหนดทิศทางกลับ: degrees, deg (ค่าเริ่มต้น), revหรือ rawหนึ่งรอบเท่ากับ 360 องศา

Return Values

ส่งคืนค่าทิศทางปัจจุบันของหุ่นยนต์เป็นค่า double ในหน่วยที่เลือก

Examples
// 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#

การหมุน คือจำนวนรอบที่หุ่นยนต์หมุนไป โดยวัดเป็นองศาหรือรอบ ในตอนเริ่มต้นโครงการ ค่าการหมุนจะถูกตั้งไว้ที่ 0 องศา คำสั่ง rotation จะส่งคืนค่าการหมุนปัจจุบันของหุ่นยนต์

การเลี้ยวขวาจะเพิ่มมุมการหมุน และการเลี้ยวซ้ายจะลดมุมการหมุน ตัวอย่างเช่น การเลี้ยวขวาครบสองรอบจะทำให้ได้มุมการหมุน 720 องศา

Available Functions
double rotation( rotationUnits units = rotationUnits::deg );

Parameters

พารามิเตอร์

พิมพ์

คำอธิบาย

units

rotationUnits

ตัวเลือกเสริม หน่วยที่จะใช้ในการกำหนดทิศทางกลับ: degrees, deg (ค่าเริ่มต้น), revหรือ rawหนึ่งรอบเท่ากับ 360 องศา

Return Values

ส่งคืนค่าการหมุนปัจจุบันของหุ่นยนต์เป็นค่า double ในหน่วยที่เลือก

Examples
// 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();