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

การแนะนำ#

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

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

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

หน้านี้ใช้ myDrivetrain เป็นตัวอย่างชื่อ smartdrive โปรดแทนที่ด้วยชื่อที่คุณกำหนดเองตามต้องการ

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

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

smartdrive(
    motor_group     &l,
    motor_group     &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

2 — สร้างสมาร์ทไดรฟ์โดยใช้วัตถุมอเตอร์ motor ที่มีอยู่สำหรับด้านซ้ายและด้านขวา พร้อมด้วยเซ็นเซอร์ไจโร

smartdrive(
    motor           &l,
    motor           &r,
    gyro            &g,
    double          wheelTravel = 320,
    double          trackWidth  = 320,
    double          wheelBase   = 130,
    distanceUnits   unit = mm,
    double          externalGearRatio = 1.0 );

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

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

~smartdrive();

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

พารามิเตอร์

พิมพ์

คำอธิบาย

&l / &r

motor_group / motor

มอเตอร์ซ้ายและขวา หรือกลุ่มมอเตอร์ พารามิเตอร์ทั้งสองต้องใช้ประเภทเดียวกัน: อย่างใดอย่างหนึ่งคือ วัตถุ motor_group สองตัวที่ หรือวัตถุ motor สองตัวที่เป็น

&g

gyro

เซ็นเซอร์ไจโร ที่ใช้โดยสมาร์ทไดรฟ์

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 objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Gyro Sensor object.
gyro myGyro = gyro(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myGyro,     // Gyro Sensor
    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 objects.
motor leftMotor = motor(PORT1, false);
motor rightMotor = motor(PORT9, true);

// Create the Gyro Sensor object.
gyro myGyro = gyro(PORT3);

// Create the smartdrive object.
smartdrive myDrivetrain = smartdrive(
    leftMotor,  // left motor
    rightMotor, // right motor
    myGyro,     // Gyro Sensor
    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 ถึง 120 รอบต่อนาที เมื่อใช้ rpm rpmหรือตั้งแต่ 0 ถึง 720 องศาต่อวินาที เมื่อใช้ dps dpsหากไม่ได้ระบุความเร็ว หุ่นยนต์จะหมุนด้วยความเร็วในการหมุนปัจจุบัน

units_v

velocityUnits

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

waitForCompletion

bool

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

Return Values

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

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

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

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

  • turnToHeading ใช้หัวเป้าหมาย ดังนั้น isDone และ isMoving จึงสามารถใช้ร่วมกับมันได้

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 ถึง 120 รอบต่อนาที เมื่อใช้ rpm rpmหรือตั้งแต่ 0 ถึง 720 องศาต่อวินาที เมื่อใช้ dps dpsหากไม่ได้ระบุความเร็ว หุ่นยนต์จะหมุนด้วยความเร็วในการหมุนปัจจุบัน

units_v

velocityUnits

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

waitForCompletion

bool

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

Return Values

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

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

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

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

  • turnToRotation ใช้การหมุนเป้าหมาย ดังนั้น isDone และ isMoving สามารถใช้ร่วมกับมันได้

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

calibrateDrivetrain#

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

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

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

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

Available Functions
void calibrateDrivetrain();

Parameters

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

Return Values

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

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

  • ระหว่างการปรับเทียบ ให้คงหุ่นยนต์ไว้นิ่งประมาณ 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("Gyro");
  DrivetrainGyro.calibrate();
  while (DrivetrainGyro.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();