PiCar-X เป็นรถหุ่นยนต์ขับเคลื่อนอัตโนมัติที่ขับเคลื่อนด้วย AI สำหรับแพลตฟอร์ม Raspberry Pi ของบริษัท SunFounder โดยมี Raspberry Pi ทำหน้าที่เป็นบอร์ดประมวลผลหลักมี โมดูลกล้องสามารถเคลื่อนไหวด้วยเซอร์โวมอเตอร์แบบ 2 แกนโดยสามารถแพนหรือเอียงของกล้องได้ มีโมดูลอัลตราโซนิกในการตรวจับวัตถุระยะไกล และมีโมดูลตรวจจับเส้นเพื่อการเรียนรู้เกี่ยวกับเดินตามเส้น หุ่นยนต์ PiCar-X สามารถเรียนรู้เกี่ยวกับ Computer Vision ได้ด้วยไม่ว่าจะเป็นฟังก์ชันการตรวจจับสี การตรวจจับใบหน้า การตรวจจับป้ายสัญญาณจราจร การหลบเลี่ยงสิ่งกีดขวางแบบอัตโนมัติ และการติดตามเส้นอัตโนมัติ
PiCar-X สามารถเขียนโปรแกรมได้ 2 ภาษาคอมพิวเตอร์ ได้แก่: Blockly (Ezblock Studio) เป็นลักษณะลากวางที่ทำให้การเขียนโปรแกรมเป็นเรื่องง่าย และ ภาษา Python เพื่อการเรียนรู้การใช้โมดูลต่างๆที่เกี่ยวกับ Computer Vision Library ของ OpenCV และ TensorFlow ของ Google เป็นการเรียนรู้เชิงลึกเกี่ยวกับ Computer Vision ได้เป็นอย่างดี อีกทั้งยังสามารถควบคุมหุ่นยนต์ผ่านแอบพลิเคชั่น SunFounder Controller บนมือถือได้อีกด้วย
รายละเอียดของหุ่นยนต์ SunFounder PICAR-X
ชุดหุ่นยนต์ Picar-X ในกล่องจะประกอบไปด้วยชิ้นส่วนต่างๆ ที่ถูกแยกชิ้นมาเป็นชิ้นๆ ไม่ว่าจะเป็น ชุดโครงสร้าง, มอเตอร์ไฟฟ้ากระแสตรงที่ใช้ในการขับเคลื่อน, ล้อหุ่นยนต์, บอร์ดขยาย RoboHat, เซนเซอร์ Ultrasonic, เซนเซอร์จับเส้น, เซอร์โวมอเตอร์, แบตเตอรี่, ชุดน๊อตสกรูในการประกอบ โดยผู้เรียนจะต้องทำการประกอบเองเพื่อการเรียนรู้เกี่ยวกับประกอบหุ่นยนต์และเรียนรู้การต่อสายไฟของหุ่นยนต์ชุดนี้ สามารถดูรายละเอียดและการประกอบเพิ่มเติมบนเอกสาร
บอร์ดควบคุมหลักของหุ่นยนต์ SunFounder PICAR-X
Raspberry Pi เป็น Single Board Computer ขนาดเล็กราคาประหยัดที่ได้รับความนิยมเป็นอย่างมาก ด้วยความสามารถประสิทธิภาพการทำงานที่ยอดเยี่ยม Raspberry Pi จึงได้รับการพัฒนาขึ้นมาเพื่อวัตถุประสงค์ทางด้านการศึกษา โดยสามารถเชื่อมต่อบอร์ดเสริม HAT ได้ทำให้เพิ่มประสิทธิภาพในการเชื่อมต่ออุปกรณ์ต่างๆสูงขึ้น จึงทำให้ Raspberry Pi ถูกนำมาใช้ในชุดหุ่นยนต์ PICAR-X ชุดนี้ และเป็นเครื่องมือที่เหมาะสมเป็นอย่างยิ่งสำหรับการเรียนรู้เกี่ยวกับหุ่นยนต์ระบบอัตโนมัติ โดยการรีวิวในบทความนี้เราจะใช้ Raspberry Pi 4 Ram 4GB
บอร์ดขยาย SunFounder PICAR-X Robot HAT
บอร์ดขยาย Robot HAT ที่ออกแบบโดย SunFounder PiCar-X มาพร้อมสวิตซ์ เปิด-ปิด มีพอร์ตขับมอเตอร์ 2 พอร์ต สามารถเชื่อมต่อมอเตอร์ซ้ายและมอเตอร์ขวาได้ มีพอร์ตขับเซอร์โวมอเตอร์ 12 พอร์ต สามารถใช้งานในการขับเคลื่อน Sterring หรือ พวงมาลัยของรถ และสามารถควบคุมการแพน-เอียงของกล้องได้อีกด้วย บอร์ดขยาย Robot HAT มีลำโพงในการเล่นเสียงที่เป็นแบบเอฟเฟกต์ หรือ ตอบโต้เป็นคำพูด หรือการเล่นเพลง mp3 ได้ด้วย อีกทั้งสามารถตั้งค่าพอร์ต ADC พอร์ต PWM และ พอร์ตการสื่อสารแบบอนุกรม I2C ได้ สามารถเชื่อมต่อแบตเตอรี่ 7-12 โวลต์ได้และมีพอร์ต USB-C ในการชาร์จแบตเตอรี่พร้อมไฟสถานะของแบตเตอรี่ได้อีกด้วย
โดยรายละเอียดของ Robot HAT มีดังนี้
พอร์ตมอเตอร์ ซ้าย/ขวา
- จำนวน 2 ช่อง 2P XH2.54 ช่องมอเตอร์ซ้ายเชื่อมต่อ GPIO 4 และ ช่องมอเตอร์ขวาเชื่อมต่อ GPIO 5
I2C Pin
- จำนวน 2 ช่องจาก Raspberry Pi
PWM Pin
- จำนวน 12 ช่อง P0-P12
ADC Pin
- จำนวน 4 ช่อง A0-A3
Digital Pin
- จำนวน 4 ช่อง D0-D3
การแสดงไฟสถานะของแบตเตอรี่
- ไฟ LED 2 ดวงสว่างขึ้นเมื่อแรงดันไฟฟ้ามากกว่า 7.8 โวลต์
- ไฟ LED 1 ดวงสว่างขึ้นเมื่อแรงดันไฟฟ้าอยู่ในช่วงระหว่าง 6.7 – 7.8 โวลต์
- ไฟ LED ดับลงทั้ง 2 ดวง เมื่อแรงดันไฟฟ้าต่ำกว่า 6.7 โวลต์
Power Port
- แรงดันไฟเข้า 7 – 12โวลต์ แบบ 2P PH2.0 สามารถจ่ายไฟให้ Raspberry Pi ไปพร้อมๆกัน
การติดตั้ง OS Raspberry Pi
ระบบปฎิบัติการของหุ่นยนต์ PiCar-Xจะใช้โปรแกรม Pi Imager
โดยมี 2 ระบบปฏิบัติการให้เราได้เลือกใช้งานว่าเราจะเลือกเขียนโปรแกรมแบบไหนได้แก่
- ภาษา Python โดยสามารถติดตั้งได้โดยเลือกที่ CHOOSE OS -> Raspberry Pi OS(Legacy).
- ภาษา Blockly จะใช้โปรแกรม Ezblock Studio โดยจะต้องทำการโหลด Firmware นามสกุล .img จาก -> Link นี้ จากนั้นเลือกไปที่ CHOOSE OS -> เลือก Use Custom -> เลือกไฟล์ที่ดาวน์โหลดมา RaspiOS-xxx_EzBlockOS-xxx.img
เลือก Device ของ SD Card
จากนั้นทำการเขียน Firmware ลงไปใน SD Card รอจนเสร็จ ถือว่าการติดตั้ง OS เรียบร้อยแล้ว
การเริ่มต้นใช้งานหุ่นยนต์ SunFounder PICAR-X
นำ SD Card ที่ติดตั้ง OS เรียบร้อยแล้วนำมาใส่บริเวณด้านล่างของ Raspberry pi
จากนั้นทำการเสียบสายขั้วแบตเตอรี่และเปิดสวิตซ์ Power บน Robot HAT
ตรวจสอบการติดตั้ง Raspberry pi OS โดยทำการเสียบ เมาส์ คีย์บอร์ด และเชื่อมต่อสาย HDMI เข้ากับจอภาพ หากขึ้นหน้าต่างของระบบปฎิบัติการ Raspberry Pi OS แสดงว่าติดตั้งเสร็จสมบูรณ์
การเริ่มต้นเขียนโปรแกรมหุ่นยนต์ PiCar-X ด้วย EzBlock Studio
EzBlock Studio เป็นแพลตฟอร์มที่พัฒนาโดย SunFounder ออกแบบมาสำหรับผู้เริ่มต้นในการเริ่มต้นใช้งาน Raspberry Pi มีภาษาในการเขียนโปรแกรม 2 ภาษา คือ Blockly และ ภาษา Python และมีคำสังการใช้งานบนอุปกรณ์ประเภทต่างๆ ด้วยการรองรับการเชื่อมต่อแบบ Bluetooth และ กรเชื่อมต่อแบบ Wi-Fi สามารถดาวน์โหลดซอสโค้ดและรีโมทคอนโทรลควบคุม Raspberry Pi บน EzBlock Studio ได้
EzBlock Studio เป็นแพลตฟอร์มสำหรับการเขียนโปรแกรมและควบคุมหุ่นยนต์ SunFounder PiCar-X ซึ่งช่วยให้ผู้เริ่มต้น (นักเรียน) เริ่มต้นการเขียนโปรแกรมหุ่นยนต์ Raspberry Pi ได้อย่างรวดเร็ว
สามารถดาวน์โหลด Appilcation บนมือถือ ได้ทั้ง App Store (iOS) หรือ Play Store (Android) สามารถค้นหา EzBlock Studio และดาวน์โหลดติดตั้งได้เลยครับ
หรือสามารถใช้งานผ่าน Web Browser -> http://ezblock.cc/ezblock-studio
โดยการเริ่มต้นเขียนโปรแกรมคลิ๊กที่ -> New Project
เลือก Device หุ่นยนต์ของเราคลิ๊กที่ -> PiCar-X
จากนั้นคลิ๊กที่ -> Connect
จากนั้นโปรแกรมจะทำการแสดง IP Ardress ของหุ่นยนต์ขึ้นมาให้คลิ๊ก -> Confirm
เมื่อทำการเชื่อมต่อเรียบร้อยแล้วจะมีข้อมูลต่างๆ ของหุ่นยนต์แสดงขึ้นมา
การเริ่มต้นการติดตั้ง Modules และ ไลบารี่ แบบ(Python)
โดยเปิด Terminal ของตัว Raspberry Pi ขึ้นมาแล้วทำการ Update และ Upgrade ระบบปฎิบัติการ
1 2 |
sudo apt update sudo apt upgrade |
ทำการติดตั้งไลบารี่ SunFounder PICAR-X Robot Hat
1 2 3 4 |
cd ~/ git clone -b v2.0 https://github.com/sunfounder/robot-hat.git cd robot-hat sudo python3 setup.py install |
จากนั้นดาวน์โหลดและติดตั้งโมดูล Vilb
1 2 3 4 |
cd ~/ git clone -b picamera2 https://github.com/sunfounder/vilib.git cd vilib sudo python3 install.py |
ดาวน์โหลดและติดตั้งโมดูล Picar-X
1 2 3 4 |
cd ~/ git clone -b v2.0 https://github.com/sunfounder/picar-x.git cd picar-x sudo python3 setup.py install |
run script i2samp.sh เพื่อติดตั้งระบบสื่อสารลำโพงแบบ I2S
1 2 |
cd ~/picar-x sudo bash i2samp.sh |
พิมพ์ y เพื่อยืนยันการติดตั้ง
พิมพ์ y เพื่อยืนยันการติดตั้ง
พิมพ์ y เพื่อยืนยันการรีสตาร์ทระบบ
เปิดการทำงานการสื่อสารผ่าน I2C (Python)
พิมพ์คำสั่งเพื่อเข้าไปตั้งค่า
1 |
sudo raspi-config |
เลือก -> Interface Options
เลือก -> I2C
เลือก “yes” เพื่อยืนยันการเปิด I2C
เลือก “yes” เพื่อทำการรีสตาร์ระบบปฎิบัติการ
การตั้งค่า Servo Motor ให้เป็น 0° องศาเพื่อการประกอบที่ง่ายขึ้น
ช่วงองศาของเซอร์โวชุดหุ่นยนต์ PiCar-X คือ -90° , 90° แต่องศาที่โรงงานตั้งไว้จะเป็นแบบสุ่ม อาจจะ 0° หรืออาจจะ 45° ก็ได้ถ้าเราประกอบมันด้วยมุมดังกล่าวไปเลย จะทำให้องศาของเซอร์โวผิดเพี้ยนไป อาจจะทำให้เซอร์โวเสียหายได้ ดังนั้นจึงจำเป็นต้องตั้งค่าองศาของเซอร์โวทั้งหมดเป็น 0° ก่อน แล้วจึงทำการติดตั้งกับตัวหุ่นยนต์ เพื่อให้องศาเซอร์โวอยู่ตรงกลางไม่ว่าจะหมุนไปในทิศทางใดก็ตาม โดยรันคำสั่ง
1 2 |
cd ~/picar-x/example sudo python3 servo_zeroing.py |
จากนั้น เสียบสายเซอร์โวเข้ากับพอร์ต P11 ในขณะเดียวกันจะเห็นแขนเซอร์โวหมุนไปที่ตำแหน่ง (นี่คือตำแหน่ง 0°) ต่อไปให้ใส่แขนเซอร์โว โดยสามารถดูได้ตามคู่มือการประกอบ
การ Calibration หุ่นยนต์ PICAR-X (Python)
มุมเซอร์โวบางมุมอาจเอียงเล็กน้อยเนื่องจากการเบี่ยงเบนที่เป็นไปได้ระหว่างการติดตั้ง PiCar-X หรือมีข้อจำกัดของเซอร์โว
Run the calibration.py
.
1 2 |
cd /home/pi/picar-x/example/calibration sudo python3 calibration.py |
หลังจากรันโค้ดแล้ว คุณจะเห็นอินเทอร์เฟซต่อไปนี้แสดงในเทอร์มินัล
ปุ่ม R ใช้เพื่อทดสอบว่าเซอร์โวที่ควบคุมทิศทางของล้อหน้าสามารถทำงานได้ตามปกติและไม่เสียหายหรือไม่
กดปุ่มตัวเลข 1 เพื่อเลือกเซอร์โวล้อหน้า จากนั้นกดปุ่ม W/S เพื่อให้ล้อหน้ามองไปข้างหน้ามากที่สุดโดยไม่เอียงไปทางซ้ายและขวา
กดปุ่มตัวเลข 2 เพื่อเลือก Pan servo จากนั้นกดปุ่ม W/S เพื่อให้แท่นแพน/เอียงมองตรงไปข้างหน้า และไม่เอียงไปทางซ้ายหรือขวา
กดปุ่มตัวเลข 3 เพื่อเลือกเซอร์โวการเอียง จากนั้นกดปุ่ม W/S เพื่อให้แท่นแพน/เอียงมองตรงไปข้างหน้าและไม่เอียงขึ้นและลง
เนื่องจากการเดินสายไฟของมอเตอร์อาจกลับด้านระหว่างการติดตั้ง คุณสามารถกด E เพื่อทดสอบว่ารถสามารถเคลื่อนที่ไปข้างหน้าได้ตามปกติหรือไม่ ถ้าไม่เช่นนั้น ให้ใช้ปุ่มตัวเลข 4 และ 5 เพื่อเลือกมอเตอร์ด้านซ้ายและขวา จากนั้นกดปุ่ม Q เพื่อปรับเทียบทิศทางการหมุน
เมื่อการสอบเทียบเสร็จสิ้น ให้กด Spacebar เพื่อบันทึกพารามิเตอร์การสอบเทียบ จะมีข้อความให้ป้อน y เพื่อยืนยัน จากนั้นกด esc เพื่อออกจากโปรแกรมเพื่อทำการปรับเทียบให้เสร็จสิ้น
การ Calibrate หุ่นยนต์ PICAR-X (EzBlock Studio)
หลังจากประกอบหุ่นยนต์เรียบร้อยแล้วอาจจะมีการไม่ตรงกลางของเซอร์โวมอเตอร์ตอนเวลาติดตั้ง ขั้นตอนนี้เป็นการ Calibrate ทำให้มุมองศาของเซอร์โวมอเตอร์ตรงมากขึ้น โดยสามารถทำได้ตามขั้นตอนต่อไปนี้
เข้าโปรแกรม EzBlock Studio หลังจากเชื่อมต่อกับหุ่นยนต์ PiCar-X แล้ว จากนั้นคลิ๊กที่ -> Setting
จากนั้นจะมีหน้าต่างข้อมูลของหุ่นยนต์ PiCar-X ขึ้นมา จากนั้นคลิ๊ก -> Calibrate
สามารถเลือกเซอร์โวมอเตอร์ในการ Calibration ได้ โดยมี 2 จุดให้เลือกคือ จุด Pan-Tilt ของกล้อง กับ ชุดเลี้ยวของล้อแบบ Streering
หน้าต่างของการ Calibration เซอร์โวมอเตอร์ Pan-Tilt ของ PiCar-X (ส่วนของกล้อง) ใช้ปุ่มสองชุดทางด้านขวา หากปรับขึ้น-ลง จะเป็นมุมก้ม-เงย หากปรับซ้ายกับขวาจะเป็นการแพนของกล้องอย่างช้าๆ เมื่อปรับแต่งเสร็จแล้ว จากนั้นคลิ๊ก -> Confirm เสร็จสิ้นการ Calibration
หน้าต่างของการ Calibration เซอร์โวมอเตอร์ มุมของล้อ ใช้ปุ่มลูกศรซ้าย – ขวา จะเป็นการปรับมุมล้ออย่างช้าๆ เมื่อปรับแต่งเสร็จแล้ว จากนั้นคลิ๊ก -> Confirm เสร็จสิ้นการ Calibration
ทดสอบการเคลื่อนที่ของหุ่นยนต์ PICAR-X
การทดสอบเคลื่อนที่ไปข้างหน้าของหุ่นยนต์ PiCar-X เป็นรูปตัว S จากนั้นให้หุ่นยนต์หยุด โดยทำการทดสอบเขียนโปรแกรมทั้ง 2 ภาษาดังนี้
Code: Python
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 |
from picarx import Picarx import time if __name__ == "__main__": try: px = Picarx() px.forward(30) time.sleep(0.5) for angle in range(0,35): px.set_dir_servo_angle(angle) time.sleep(0.01) for angle in range(35,-35,-1): px.set_dir_servo_angle(angle) time.sleep(0.01) for angle in range(-35,0): px.set_dir_servo_angle(angle) time.sleep(0.01) px.forward(0) time.sleep(1) for angle in range(0,35): px.set_camera_servo1_angle(angle) time.sleep(0.01) for angle in range(35,-35,-1): px.set_camera_servo1_angle(angle) time.sleep(0.01) for angle in range(-35,0): px.set_camera_servo1_angle(angle) time.sleep(0.01) for angle in range(0,35): px.set_camera_servo2_angle(angle) time.sleep(0.01) for angle in range(35,-35,-1): px.set_camera_servo2_angle(angle) time.sleep(0.01) for angle in range(-35,0): px.set_camera_servo2_angle(angle) time.sleep(0.01) finally: px.forward(0) |
Code: EzBlock Studio
ทดสอบการหลบหลีกสิ่งกีดขวางของหุ่นยนต์ PICAR-X
หุ่นยนต์ PiCar-X ใช้เซนเซอร์ Ultrasonic HC-SR04 ในการตรวจจับวัตถุที่มีระยะ 0-400 cm ในการทดสอบเขียนโปรแกรม ถ้าระยะในการตรวจจับวัตถุมากกว่า 0 เซนติเมตร และ น้อยกว่า 300 เซนติเมตร จากนั้นถ้าระยะในการตรวจจับน้อยกว่า 25 เซนติเมตร ให้เซอร์โวมอเตอร์หมุนเพื่อเลี้ยวล้อของหุ่นยนต์ -35 องศา หากไม่สามารถตรวจจับวัตถุใดๆได้ให้เดินหน้าและปรับล้อที่ 0 องศา โดยเราทำการทดสอบเขียนโปรแกรมทั้ง 2 ภาษาดังนี้
Code: Python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
from picarx import Picarx def main(): try: px = Picarx() # px = Picarx(ultrasonic_pins=['D2','D3']) # tring, echo px.forward(30) while True: distance = px.ultrasonic.read() print("distance: ",distance) if distance > 0 and distance < 300: if distance < 25: px.set_dir_servo_angle(-35) else: px.set_dir_servo_angle(0) finally: px.forward(0) if __name__ == "__main__": main() |
Code: EzBlock Studio
ทดสอบการเดินตามเส้นของหุ่นยนต์ PICAR-X
หุ่นยนต์ PiCar-X ใช้เซนเซอร์ SunFounder 3-ch Gray Scale Sensor ในการตรวจจับเส้น โดยให้ค่า Output ออกมาแยกแต่ละตัว เป็นค่าแบบ Analog
การทดสอบเขียนโปรแกรมสร้างเงื่อนไข 3 กรณีในการตรวจจับเส้น โดยแบ่งเป็นดังนี้
- วิ่งเดินหน้าด้วยความเร็ว 10%
- หากเซนเซอร์ ซ้าย ตรวจจับเจอเส้นสีดำให้หมุนเซอร์โวควบคุมล้อเลี้ยว 12 องศา
- หากเซนเซอร์ ขวา ตรวจจับเจอเส้นสีดำให้หมุนเซอร์โวควบคุมล้อเลี้ยว -12 องศา
- หากไม่เข้างั้นไขอะไรเลยให้หมุนเซอร์โวควบคุมล้อเลี้ยว 0 องศา
โดยทำการทดสอบเขียนโปรแกรมทั้ง 2 ภาษาดังนี้
Code: Python
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 |
from picarx import Picarx if __name__=='__main__': try: px = Picarx() # px = Picarx(grayscale_pins=['A0', 'A1', 'A2']) px_power = 10 while True: gm_val_list = px.get_grayscale_data() print("gm_val_list:",gm_val_list) gm_status = px.get_line_status(gm_val_list) print("gm_status:",gm_status) if gm_status == 'forward': print(1) px.forward(px_power) elif gm_status == 'left': px.set_dir_servo_angle(12) px.forward(px_power) elif gm_status == 'right': px.set_dir_servo_angle(-12) px.forward(px_power) else: px.set_dir_servo_angle(0) px.stop() finally: px.stop() |
Code: EzBlock Studio
ทดสอบหุ่นยนต์ PICAR-X พูดทักทายผ่านลำโพง
ขั้นตอนแรกจะต้องเรียกฟังก์ชั่น Text-to-Speech(TTS) ก่อน โดยเรียก script i2samp.sh ใน picar-x โฟลเดอร์ก่อน
1 2 |
cd /home/pi/picar-x sudo bash i2samp.sh |
จากนั้นจะมีข้อความเพื่อยืนยันเปิดการทำงานให้พิมพ์ “y” และกด Enter
ในการทดสอบการเขียนโปรแกรมเราให้หุ่นยนต์ PiCar-X พูดทักทาย”Hello”, “Hi”, “Good bye”, “Nice to meet you”.
โดยทำการทดสอบเขียนโปรแกรมทั้ง 2 ภาษาดังนี้
Code: Python
1 2 3 4 5 6 7 8 9 |
from robot_hat import TTS if __name__ == "__main__": words = ["Hello", "Hi", "Good bye", "Nice to meet you"] tts_robot = TTS() for i in words: print(i) tts_robot.say(i) |
Code: EzBlock Studio
ทดสอบการทำงานเกี่ยวกับ Computer Vision
ในชุดหุ่นยนต์ PiCar-X ใช้กล้อง SunFounder ความละเอียด 5 ล้านพิกเซล พร้อมโมดูลกล้อง OV5647 สามารถถ่ายวิดีโอและภาพนิ่ง 1080p ที่เชื่อมต่อโดยตรงกับ Raspberry Pi
ทดสอบการตรวจจับสีผ่านกล้อง
การทดสอบสามารถปริ้นแผ่นวงกลมสี เพื่อทดสอบการเรียนรู้เกี่ยวกับการตรวจจับสีสามารถดาวน์โหลดได้ที่นี่ -> Link
ในการทดสอบเป็นการตรวจจับสีของแผ่นป้ายวงกลมโดยให้แสดงข้อความสีที่ตรวจจับได้และตีกรอบสี่เหลี่ยมตรงสีที่ตรวจจับได้ตามโค้ดตัวอย่างทั้ง 2 ภาษาดังนี้
Code: Python
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 63 64 65 66 67 68 69 70 71 72 |
import cv2 from picamera.array import PiRGBArray from picamera import PiCamera import numpy as np import time color_dict = {'red':[0,4],'orange':[5,18],'yellow':[22,37],'green':[42,85],'blue':[92,110],'purple':[115,165],'red_2':[165,180]} #Here is the range of H in the HSV color space represented by the color kernel_5 = np.ones((5,5),np.uint8) #Define a 5×5 convolution kernel with element values of all 1. def color_detect(img,color_name): # The blue range will be different under different lighting conditions and can be adjusted flexibly. H: chroma, S: saturation v: lightness resize_img = cv2.resize(img, (160,120), interpolation=cv2.INTER_LINEAR) # In order to reduce the amount of calculation, the size of the picture is reduced to (160,120) hsv = cv2.cvtColor(resize_img, cv2.COLOR_BGR2HSV) # Convert from BGR to HSV color_type = color_name mask = cv2.inRange(hsv,np.array([min(color_dict[color_type]), 60, 60]), np.array([max(color_dict[color_type]), 255, 255]) ) # inRange():Make the ones between lower/upper white, and the rest black if color_type == 'red': mask_2 = cv2.inRange(hsv, (color_dict['red_2'][0],0,0), (color_dict['red_2'][1],255,255)) mask = cv2.bitwise_or(mask, mask_2) morphologyEx_img = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel_5,iterations=1) # Perform an open operation on the image # Find the contour in morphologyEx_img, and the contours are arranged according to the area from small to large. _tuple = cv2.findContours(morphologyEx_img,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) # compatible with opencv3.x and openc4.x if len(_tuple) == 3: _, contours, hierarchy = _tuple else: contours, hierarchy = _tuple color_area_num = len(contours) # Count the number of contours if color_area_num > 0: for i in contours: # Traverse all contours x,y,w,h = cv2.boundingRect(i) # Decompose the contour into the coordinates of the upper left corner and the width and height of the recognition object # Draw a rectangle on the image (picture, upper left corner coordinate, lower right corner coordinate, color, line width) if w >= 8 and h >= 8: # Because the picture is reduced to a quarter of the original size, if you want to draw a rectangle on the original picture to circle the target, you have to multiply x, y, w, h by 4. x = x * 4 y = y * 4 w = w * 4 h = h * 4 cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2) # Draw a rectangular frame cv2.putText(img,color_type,(x,y), cv2.FONT_HERSHEY_SIMPLEX, 1,(0,0,255),2)# Add character description return img,mask,morphologyEx_img with PiCamera() as camera: print("start color detect") camera.resolution = (640,480) camera.framerate = 24 rawCapture = PiRGBArray(camera, size=camera.resolution) time.sleep(2) for frame in camera.capture_continuous(rawCapture, format="bgr",use_video_port=True):# use_video_port=True img = frame.array img,img_2,img_3 = color_detect(img,'red') # Color detection function cv2.imshow("video", img) # OpenCV image show cv2.imshow("mask", img_2) # OpenCV image show cv2.imshow("morphologyEx_img", img_3) # OpenCV image show rawCapture.truncate(0) # Release cache k = cv2.waitKey(1) & 0xFF # 27 is the ESC key, which means that if you press the ESC key to exit if k == 27: break print('quit ...') cv2.destroyAllWindows() camera.close() |
Code: EzBlock Studio
ทดสอบการใช้ฟังก์ชั่นตรวจจับใบหน้า
การตรวจจับวัตถุโดยใช้ตัวแยกประเภทแบบ Haar Cascade Classifiers เป็นวิธีการตรวจจับวัตถุที่มีประสิทธิภาพ โดย Paul Viola และ Michael Jones ได้ทำการวิจัยเกี่ยวกับ “Rapid Object Detection using a Boosted Cascade of Simple Features” ในปี 2544 นี่จึงเป็นแนวทางการเรียนรู้ของระบบที่นิยมใช้อยู่ในปัจจุบัน
การทดสอบนี้เราจะทดสอบด้วยการวิเคราะห์ภาพจากกล้อง ใช้ Model Haar Cascade Classifiers อันดับแรกแปลงรูปภาพเป็นโทนสีเทาก่อน จากนั้นตรวจจับใบหน้ามนุษย์บนภาพระดับสีเทาจากนั้นวาดกรอบสี่เหลี่ยมใบหน้าบนจอภาพ สามารถดูโค้ดตัวอย่างทั้ง 2 ภาษาดังนี้
Code: Python
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 |
import cv2 from picamera.array import PiRGBArray from picamera import PiCamera import time def human_face_detect(img): resize_img = cv2.resize(img, (320,240), interpolation=cv2.INTER_LINEAR) # In order to reduce the amount of calculation, resize the image to 320 x 240 size gray = cv2.cvtColor(resize_img, cv2.COLOR_BGR2GRAY) # Convert to grayscale faces = face_cascade.detectMultiScale(gray, 1.3, 2) # Detect faces on grayscale images face_num = len(faces) # Number of detected faces if face_num > 0: for (x,y,w,h) in faces: x = x*2 # Because the image is reduced to one-half of the original size, the x, y, w, and h must be multiplied by 2. y = y*2 w = w*2 h = h*2 cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) # Draw a rectangle on the face return img with PiCamera() as camera: print("start human face detect") camera.resolution = (640,480) camera.framerate = 24 rawCapture = PiRGBArray(camera, size=camera.resolution) time.sleep(2) for frame in camera.capture_continuous(rawCapture, format="bgr",use_video_port=True): # use_video_port=True img = frame.array img = human_face_detect(img) cv2.imshow("video", img) #OpenCV image show rawCapture.truncate(0) # Release cache k = cv2.waitKey(1) & 0xFF # 27 is the ESC key, which means that if you press the ESC key to exit if k == 27: break print('quit ...') cv2.destroyAllWindows() camera.close() |
Code: EzBlock Studio
วิดีโอการทดสอบ
สรุป
PiCar-X เป็นรถหุ่นยนต์ขับเคลื่อนอัตโนมัติที่ขับเคลื่อนด้วย AI ที่เหมาะสำหรับผู้ที่สนใจเรียนรู้เกี่ยวกับบอร์ด Raspberry Pi ที่สามารถอยากจะทดลองเขียนโปรแกรมสั่งงานควบคุมหุ่นยนต์ในสามารถหลบหลีกสิ่งกีดขวางได้ ให้สามารถเดินตามเส้นได้ หรือแม้กระทั้งการเดินแบบอัตโนมัติแบบ AI Self Driving Car ได้ รวมถึงการเรียนรู้ด้วย Computer Vision ไม่ว่าจะเป็นการตรวจจับใบหน้า การตรวจจับสี ชุดหุ่นยนต์ชุดนี้เหมาะกับโรงเรียน หรือสถานบันการศึกษา และผู้ที่สนใจในด้านหุ่นยนต์และเทคโนโลยี ซึ่งในบทความนี้ยังไม่ได้พูดถึงการเรียนรู้ในฟังก์ชั่นอื่นๆ อีกมากมาย ผู้ที่สนใจสามารถดูรายละเอียดของหุ่นยนต์ PiCar-X เพิ่มเติมได้บนเว็ปไซด์
ผมต้องขอขอบคุณบริษัท SunFounder ที่ส่งชุดหุ่นยนต์ PiCar-x มาทดสอบ ผู้ที่สนใจสามารถหาซื้อชุดหุ่นยนต์ PiCar-X มีแบตเตอรี่และที่ชาร์ทด้วยในราคา $81.99 (~2,900฿) และถ้ารวม Pi 4 ด้วยราคา 154.99(~5,400฿) บนร้านค้าออนไลน์ของบริษัท และ Amazon มีคูปองส่วนลด $15 คงเหลือราคา $74.99 (~2,600฿) และถ้ารวม Pi 4 ด้วยราคา $145.10 (~5,000฿)
กรรมการผู้จัดการของโรงเรียนเกี่ยวกับหุ่นยนต์ในจ.เชียงใหม่, ชนะเลิศการแข่งขันหุ่นยนต์ต่างๆ ทั้งในและต่างประเทศ ได้แก่ Robocon และ Makerthon