กลับไปหน้ารวมไฟล์
robot-for-supercool-indoor-navigation-cc949b.md

เรื่องราวของเรา:

โปรเจคนี้คือการทำให้หุ่นยนต์เคลื่อนที่ตามเส้นทางที่เรากำหนดไว้ล่วงหน้าได้อย่างแม่นยำ โดยไม่ใช้ GPS, WiFi หรือ Bluetooth ในการระบุตำแหน่ง แม้แต่แผนที่หรือแปลนอาคารก็ไม่ต้อง แล้ววาดเส้นทางการเคลื่อนที่จริง (ตามสเกล) แบบเรียลไทม์เลย ส่วน Bluetooth นี่เอาไว้ใช้แทนสายไฟ ในการส่งข้อมูลตำแหน่งแบบเรียลไทม์นั่นเอง

เบื้องหลังความมัน:

ตอนนั้นเรากำลังหาวิธีเจ๋งๆ ในการนำทางภายในอาคารสำหรับหุ่นยนต์ที่ใช้ Arduino ของเรา พอจะเลือกเซ็นเซอร์ตรวจจับการเคลื่อนไหว (Motion Sensing) ที่ใช่สำหรับงานนี้ เราก็ไปสะดุดกับเจ้า Oblu (IMU แบบโอเพ่นซอร์ส) ราคาถูกและเป็นโอเพ่นซอร์สเลยดูน่าสนใจมาก แต่ปัญหาคือ โค้ดโอเพ่นซอร์สของ oblu นี่มันออกแบบมาสำหรับการนำทางคนเดินเท้าในอาคาร (Pedestrian Dead Reckoning หรือ PDR) น่ะสิ ง่ายๆ ก็คือมันติดไว้ที่รองเท้าแล้วคำนวณการเดินของคน oblu นี่ทำ PDR ในอาคารได้ดีมากเลยนะ แถมมีแอป Android ฟรี (Xoblu) ไว้ติดตามตำแหน่งแบบเรียลไทม์อีก แต่เราก็งงว่า แล้วเราจะเอา Algorithm การนำทางคนเดินเท้าที่อิงจากโมเดลการเดินของมนุษย์มาใช้กับหุ่นยนต์ได้ยังไงหว่า

ช่วงสำคัญของการก้าว เมื่อฝ่าเท้าสัมผัสพื้นและหยุดนิ่งสนิท

การคำนวณภายในของ Oblu นั้นอิงจากการเดินของมนุษย์ มันจะส่งค่าการกระจัดระหว่างก้าวสองก้าวที่ติดกัน และการเปลี่ยนแปลงของทิศทาง (Heading) ออกมา เวลาเท้าสัมผัสพื้น ความเร็วของฝ่าเท้าจะเป็นศูนย์ หรือก็คือฝ่าเท้าหยุดนิ่งสนิท <ดูวิดีโอด้านบน> Oblu ก็เลยตรวจจับ 'ก้าว' ได้และใช้จังหวะนี้ในการแก้ไขข้อผิดพลาดภายในบ้าง การแก้ไขข้อผิดพลาดบ่อยๆ แบบนี้แหละที่ทำให้มันติดตามตำแหน่งได้แม่นยำมาก งั้นคำถามก็คือ... แล้วถ้าหุ่นยนต์เราก็เดินแบบเดียวกันล่ะ? คือ ขยับ, หยุด, ขยับ, หยุด...

เราก็เลยเลือกใช้ Oblu และไม่นานก็ประกอบหุ่นยนต์กับระบบติดตามตำแหน่งเสร็จ เรื่องที่เหลือ ไปดูในวิดีโอต่อไปนี้เลย...

หุ่นยนต์เคลื่อนที่ตามเส้นทางที่โปรแกรมไว้ และถูกติดตามตำแหน่งไปพร้อมกัน

มันทำงานยังไง:

หุ่นยนต์เคลื่อนที่ตามเส้นทางที่โปรแกรมไว้ล่วงหน้า และส่งข้อมูลการเคลื่อนที่จริง (ผ่าน Bluetooth) ไปยังโทรศัพท์เพื่อติดตามตำแหน่งแบบเรียลไทม์

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

แผนภาพบล็อกการทำงานของชุดประกอบ

เส้นทางของหุ่นยนต์ถูกโปรแกรมให้เป็นชุดของส่วนเส้นตรงนะน้อง แต่ละส่วนเส้นตรงถูกกำหนดด้วยความยาวและทิศทางเทียบกับส่วนก่อนหน้า การเคลื่อนที่ของหุ่นยนต์จะถูกแบ่งเป็นช่วงย่อยๆ (เรียกง่ายๆ ว่า 'ก้าว' หรือ stride) พอจบแต่ละก้าว ตัว Oblu ก็จะส่งข้อมูลความยาวก้าวและความเบี่ยงเบน (การเปลี่ยนแปลงทิศทาง) จากเส้นตรงไปให้ Arduino จากนั้น Arduino ก็จะทำการปรับทิศทางหุ่นยนต์ใหม่ในทุกๆ ก้าวที่ได้รับข้อมูล ถ้ามันพบว่าหุ่นยนต์เบี่ยงออกจากเส้นตรงที่กำหนดไว้

ตามโปรแกรมแล้ว หุ่นยนต์ควรจะเคลื่อนที่เป็นเส้นตรงตลอดเวลา แต่มันอาจจะเบี่ยงออกไปได้นะ เนื่องจากปัจจัยไม่สมบูรณ์แบบต่างๆ เช่น พื้นผิวไม่เรียบ, น้ำหนักของชุดประกอบไม่สมดุล, ความไม่สมดุลทางโครงสร้างหรือไฟฟ้าในมอเตอร์ DC, หรือการวางตัวของล้อหน้าอิสระที่เปลี่ยนไป สรุปง่ายๆ คือ "ก้าวหนึ่งก้าว... ปรับทิศทาง... แล้วเดินหน้าไป" นอกจากนี้ หุ่นยนต์ยังจะถอยหลังด้วยถ้ามันเคลื่อนที่เกินความยาวที่โปรแกรมไว้สำหรับส่วนเส้นตรงนั้นๆ

ความยาวของ 'ก้าว' ถัดไปขึ้นอยู่กับระยะทางที่เหลือในส่วนเส้นตรงนั้นๆ น้องจะเห็นว่าหุ่นยนต์จะก้าวยาวๆ ตอนที่เหลือระยะทางอีกเยอะ และจะก้าวสั้นลงเรื่อยๆ เมื่อใกล้ถึงจุดหมายปลายทาง (ซึ่งก็คือจุดสิ้นสุดของแต่ละส่วนเส้นตรง)

IMU Oblu จะส่งข้อมูลไปให้ Arduino และมือถือ (ผ่านบลูทูธ) พร้อมกันเลย แอป Xoblu (บน Android) จะทำการคำนวณง่ายๆ เพื่อสร้างเส้นทางจากข้อมูลการเคลื่อนที่ที่ได้รับจากหุ่นยนต์ ซึ่งใช้สำหรับการติดตามแบบเรียลไทม์บนมือถือ (การสร้างเส้นทางด้วย Xoblu แสดงไว้ด้านล่าง)

การสร้างเส้นทางบนมือถือด้วย Xoblu

สรุปสั้นๆ ก็คือ Oblu ตรวจจับการเคลื่อนไหวและสื่อสารข้อมูลการเคลื่อนที่ไปยัง Arduino กับมือถือเป็นช่วงๆ ตามระยะ จากนั้น Arduino ก็จะควบคุมการเคลื่อนที่ของล้อตามเส้นทางที่โปรแกรมไว้และข้อมูลการเคลื่อนที่ (ที่ส่งมาจาก oblu) การเคลื่อนที่ของหุ่นยนต์นี้ **ไม่ได้** ถูกควบคุมจากระยะไกลนะเว้ย ยกเว้นแค่คำสั่งเริ่ม/หยุด เท่านั้น

เจาะลึกเทคนิค (Technical Deep-Dive)

โปรเจกต์นี้คือคลาสมาสเตอร์ในเรื่อง **Inertial Navigation Forensics** และ **Autonomous Path-Orchestration** เลยนะตัว มันทำได้ไง? มันทำการระบุตำแหน่งภายในอาคารด้วยความแม่นยำสูงโดยไม่ต้องพึ่งโครงสร้างภายนอก ด้วยการดึงความสามารถ Pedestrian Dead-Reckoning (PDR) ของ IMU Oblu มาใช้

  • IMU Dead-Reckoning Forensics:
    • The Zero-Velocity Update (ZUPT) Analytics: หัวใจของความแม่นยำของระบบอยู่ที่อัลกอริทึม ZUPT นี้แหละ ด้วยการโปรแกรมให้หุ่นยนต์เคลื่อนที่แบบ "ก้าว" เป็นช่วงๆ (รูปแบบ เดิน-หยุด-เดิน) มันจะสร้างสถานะ "หยุดนิ่งชั่วขณะ" ในทุกๆ ก้าว ในช่วงหยุดนิ่งระดับมิลลิวินาทีนี้เอง IMU จะทำการวินิจฉัยเพื่อแก้ไขค่า bias โดยรีเซ็ตตัวรวมความเร็ว (velocity integrators) กลับเป็นศูนย์ ซึ่งเท่ากับ "ล้าง" ความคลาดเคลื่อน (drift) ที่สะสมมาตอนเคลื่อนที่ออกไป
    • Heading-Drift Harmonics: เซนเซอร์ Oblu ทำการรวมข้อมูลภายใน 6 แกน (Accelerometer + Gyroscope) เพื่อรักษาเวกเตอร์ทิศทางให้คงที่ จากนั้นระบบจะแปลข้อมูลการกระจัดจาก IMU ไปเป็นพิกัดคาร์ทีเซียน 2 มิติ (X, Y) เทียบกับจุดเริ่มต้น ทำให้สามารถสร้างเส้นทางใหม่ได้แบบเรียลไทม์
  • Sensor-Fusion Orchestration:
    • Loop-Closure Diagnostics: Arduino Mega ทำหน้าที่เป็นโหนดกลาง รับข้อมูลเมตาดาต้าของความยาวก้าวและความเบี่ยงเบนทิศทางจาก Oblu ผ่าน **Xoblu Protocol** ถ้าเซนเซอร์ตรวจจับได้ว่ามีการเบี่ยงออกจากเส้นทางที่โปรแกรมไว้ Mega จะสั่งการแก้ไขแบบ differential-drive (ให้ความเร็วล้อซ้ายขวาไม่เท่ากัน หรือ v_L ≠ v_R) เพื่อปรับแนวตัวถังให้กลับมาสู่เวกเตอร์ที่ตั้งใจไว้

การสร้างแบบจำลองเส้นทาง (Path modeling):

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

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

วิศวกรรมและการลงมือทำ (Engineering & Implementation)

  • การวินิจฉัยระบบบัสจ่ายไฟ (Kinetic Bus Diagnostics):
    • ความสมบูรณ์ของกำลังใน H-Bridge: การขับมอเตอร์ DC มันสร้างแรงดันย้อนกลับ (back-EMF) และสัญญาณรบกวนบนสายไฟลอจิกไม่เบาเลย เราเลยต้องใส่ตัวเก็บประจุ (Capacitor) ขนาด 1000µF แบบ ESR ต่ำเพื่อกรองและรักษาแรงดัน 5V บนบัสให้นิ่ง ป้องกันอาการ "ไฟตก (Voltage-Brownout)" ตอนที่มอเตอร์ต้องการแรงบิดสูงสุด ห้ามช็อตนะตัวนี้
    • เทคนิคการสร้างแบบจำลองเส้นทาง (Path-Modeling Heuristics): ตรรกะการนำทางของหุ่นยนต์ถูกออกแบบให้เป็นชุดของอาร์เรย์ `{ความยาว, ทิศทาง}` ตามที่เห็นในรูปด้านบน วิธีนี้ทำให้หุ่นยนต์สามารถทำการเคลื่อนที่ซับซ้อนได้ โดยการแยกรูปทรงออกเป็นส่วนของเส้นตรงและจุดหมุนที่แน่นอน สู้งานนะน้อง
  • หน้าจอแสดงผลข้อมูลระยะไกล (Visual Telemetry HMI):
    • การวินิจฉัยด้วยสตรีมข้อมูลบลูทูธ (Bluetooth Data-Stream Diagnostics): ระบบจะส่งเฟรมข้อมูลการนำทางที่ประมวลผลแล้วไปยังแอป Xoblu บน Android ทำให้เราสามารถเห็นภาพการเคลื่อนที่ของหุ่นยนต์แบบเรียลไทม์บนมือถือ เส้นทางการเคลื่อนที่จริงจะถูกวาดซ้อนเป็นดิจิทัลที่มีความแม่นยำสูง ช่วยให้เราสามารถตรวจสอบได้แม้หุ่นยนต์อยู่นอกสายตา (BVLOS) เลยทีเดียว

การประกอบวงจร (Circuit Assembly):

ดูส่วนฮาร์ดแวร์ (H/W) สำหรับการเชื่อมต่อสายไฟระหว่าง Arduino, oblu, ไดรเวอร์มอเตอร์ และแบตเตอรี่นะ

  • โพรโทคอลการสื่อสาร (Communication Protocol) :

ขั้นตอนที่ 1: Xoblu ส่งคำสั่ง START ไปหา oblu

ขั้นตอนที่ 2: oblu ตอบรับว่าได้รับคำสั่งแล้ว โดยส่งสัญญาณ ACK กลับไปหา Xoblu

ขั้นตอนที่ 3: oblu ส่งแพ็กเก็ต DATA ที่มีข้อมูลการกระจัดและทิศทางในแต่ละก้าว ไปหา Xoblu ทุกครั้งที่ตรวจพบว่าหยุดนิ่ง (step = เมื่อตรวจจับได้ว่าหยุดเคลื่อนที่)

ขั้นตอนที่ 4: Xoblu ตอบรับว่าได้รับแพ็กเก็ต DATA ล่าสุดแล้ว โดยส่งสัญญาณ ACK กลับไปหา oblu (วนลูปขั้นตอนที่ 3 และ 4 ไปเรื่อยๆ จนกว่า Xoblu จะส่งคำสั่ง STOP มา เมื่อ oblu ได้รับ STOP ก็จะไปทำขั้นตอนที่ 5)

ขั้นตอนที่ 5: STOP - (i) หยุดการประมวลผลใน oblu (ii) หยุดเอาต์พุตทั้งหมดใน oblu

รายละเอียดของ START, ACK, DATA และ STOP สามารถดูได้จากเอกสาร Application Note ของ oblu

Oblu IMU ทำงานยังไง (อ่านเพิ่มเติม) :

มา เอาเอกสารอ้างอิงเกี่ยวกับภาพรวมของ Oblu และหลักการทำงานพื้นฐานของเซ็นเซอร์ PDR แบบติดเท้ามาให้ดูกัน:

-->> ซอร์สโค้ดของ oblu ที่มีอยู่ ออกแบบมาสำหรับการนำทางแบบติดเท้าโดยเฉพาะ และถูกปรับให้เหมาะสมที่สุดสำหรับจุดประสงค์นั้น วิดีโอด้านล่างอธิบายหลักการทำงานพื้นฐานของมัน:

Pedestrian Dead Reckoning (PDR) with foot-mounted motion sensors

-->> และนี่คือบทความง่ายๆ สองสามบทความเกี่ยวกับเซ็นเซอร์ PDR แบบติดเท้า:

1. Track my steps

2. Continue tracking my steps

--> ถ้าอยากรู้ลึกขึ้นเรื่องการนำทางแบบ Pedestrian Dead Reckoning ด้วยเซ็นเซอร์ที่เท้า ไปหาอ่านเอกสารเพิ่มเติมได้นะ (มันค่อนข้างวิชาการหน่อย)

--> ส่วนใครอยากเห็นภาพรวมของ Oblu จัดไปวัยรุ่น ดูคลิปนี้เลย:

ภาพรวมของ Oblu

สรุปสั้นๆ ให้เข้าใจ

โปรเจคนี้ถือเป็นสุดยอดของแนวคิด **Infrastructure-Free Positioning** เลยนะพวกเรา ด้วยการเชี่ยวชาญ **ZUPT Forensics** และ **IMU Diagnostics** มันได้สร้างแพลตฟอร์มนำทางระดับโปร ที่พิสูจน์แล้วว่าแบบจำลองการเคลื่อนไหวของมนุษย์ นำมาใช้ในงานหุ่นยนต์ความแม่นยำสูงได้จริง! ห้ามช็อตนะตัวนี้

----------------

ถ้าใครมีคำติชม หรือไอเดียเจ๋งๆ มาแชร์กันได้นะ สู้งานนะน้อง!

----------------

ข้อมูล Frontmatter ดั้งเดิม

apps:
  - "1x Arduino IDE"
  - "1x Xoblu"
author: "subhojyoti"
category: "Installations"
components:
  - "1x Smart Motor Robot Car Battery Box Chassis Kit DIY Speed Encoder for Arduino"
  - "1x Soldering iron (generic)"
  - "2x Capacitor 1000 µF"
  - "1x Arduino Mega 2560"
  - "1x oblu - an opensource IMU for indoor pedestrian navigation"
  - "1x Male/Female Jumper Wires"
  - "1x Dual H-Bridge motor drivers L293D"
  - "1x Solderless Breadboard Half Size"
  - "1x AA 2800 Ni-MH Rechargeable"
description: "ตัวนี้มันจะวิ่งตามเส้นทางที่เราตั้งไว้แบบแม่นยำสุดๆ แล้วเรายังส่องดูตำแหน่งแบบเรียลไทม์ผ่านมือถือได้ด้วย! ข้อดีคือไม่ต้องพึ่ง GPS, ไม่ต้องใช้ WiFi, ไม่ต้องมีแผนที่... งานง่ายแต่หล่อ!"
difficulty: "Intermediate"
documentationLinks: []
downloadableFiles:
  - "https://github.com/vijkumsha/oblu_Robot"
encryptedPayload: "U2FsdGVkX18VMyGZrYuKsTHfKYjxZrykf4rbml9sDnpw8u1nVRgs3fOSB9a2tRGT7UbIqt3Og+EcOm3uzXMfoPLtZRtPyFj45iiXNjfgv7I="
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/robot-for-supercool-indoor-navigation-cc949b_cover.gif"
lang: "en"
likes: 41
passwordHash: "8916cf5b293b8067b50913e11b52d581975d00127db2c027740a5accb43906ce"
price: 1499
seoDescription: "High-accuracy indoor navigation Robot with real-time tracking on phone. No GPS, WiFi, or Map required."
tags:
  - "robot"
  - "tracking"
  - "robotics"
  - "communication"
title: "หุ่นยนต์วัยรุ่นสายช่าง วิ่งในร่มตึงๆ ไม่หลงทาง!"
tools: []
videoLinks:
  - "https://www.youtube.com/embed/Qi6bLV_Hnf0"
  - "https://www.youtube.com/embed/c1bYfUYlVSo"
  - "https://www.youtube.com/embed/s7cpwuVO58U"
  - "https://www.youtube.com/embed/SeIxKxKSN3w"
views: 48200