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

การแนะนำ#

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

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

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

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

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

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, Gyro Sensor, or GPS 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หรือ gps วัตถุ

พารามิเตอร์

พิมพ์

คำอธิบาย

&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&

การอ้างอิงถึงอินสแตนซ์ที่มีอยู่ gps, 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 ประกอบด้วยฟังก์ชันสมาชิกต่อไปนี้:

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

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

  • 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 ปรับเทียบเซ็นเซอร์ความเฉื่อย เซ็นเซอร์ไจโร หรือเซ็นเซอร์ GPS ที่กำหนดค่าไว้กับสมาร์ทไดรฟ์

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

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

calibrateDrivetrain ถูกสร้างขึ้นโดยอัตโนมัติโดย VEXcode เมื่อมีการกำหนดค่าระบบขับเคลื่อนด้วยเซ็นเซอร์เฉื่อย เซ็นเซอร์ GPS หรือเซ็นเซอร์ไจโร ฟังก์ชันนี้เป็นส่วนหนึ่งของซอร์สโค้ดของโปรเจ็กต์และไม่ได้เป็นส่วนหนึ่งของ VEX V5 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();