Class Project : Lidar bot for maze solving (3rd Group)

Class Project : Lidar bot for maze solving (3rd Group)

ผู้จัดทำ

กิตติพันธ์ เชษฐ์รัมย์
65340700401 (Mek)
คมกริช ตระหง่านไพบูลย์
65340700402 (Kom)
ณรงค์รัชช์ อู่สิริมณีชัย
65340700403 (Art)
ณัฐกร บัณฑิตขจร
65340700404 (Sun)
อาทิตย์ ศักดิ์สิทธิพิทักษ์
65340700407 (Pia)
วุฒิชัย พิพัฒน์มโนมัย
65340700410 (Vim)

ขอบเขตงาน :

1.ออกแบบโปรแกรมสำหรับหุ่นยนต์สี่ล้อที่มีความสามารถสร้างแผนที่โดยใช้ Lidar

2.ตัวหุ่นยนต์ต้องสามารถหาทางออกจากเขาวงกตที่สั้นที่สุด

3.จะต้องมีการส่งข้อมูลระหว่างหุ่นยนต์(Lidar bot)และคอมพิวเตอร์(PC)

ก่อนที่จะเข้าเนื้อหาของโปรเจคนี้ เพื่อให้เข้าใจภาพรวม จะต้องเข้าใจการใช้ Protocol ในการสื่อสารชนิด MQTT

Picture Ref: https://mqtt.org/assets/img/mqtt-publish-subscribe.png

หลักการทำงานของ MQTT จะประกอบไปด้วย 3 ส่วน

  1. MQTT Broker  ทำหน้าที่เป็นคนกลาง โดยรับข้อมูลว่าใครจะเป็น Publisher เพื่อส่งข้อมูลใดๆ หรือรับข้อมูลว่าใครจะเป็น Subscriber เพื่อสมัครรับข้อมูลใดๆ โดยตัว Broker จะ forward ข้อมูลไปให้อุปกรณ์ต่างๆ โดยตัว Broker สามารถเป็นได้ทั้ง Windows server, Linux server หรือ Raspberry Pi เป็นต้น
  2. Publisher เป็น Node ที่ส่งข้อมูล โดยหลักการจะมีการประกาศ Topic และแนบ Data ไปด้วย โดยข้อมูลชุดนี้จะส่งไปให้กับ Broker ในตัวอย่างนี้ Publisher ได้ส่งข้อมูลที่ Topic คือ temperature และได้แนบ 24 ํC ที่เป็น Data ไปด้วย ซึ่งการส่งข้อมูลมาที่ Broker นั้น สามารถเกิดจากการตั้งเวลา เหตุการณ์ หรือ User กดปุ่ม เป็นต้น
  3. Subscriber เป็น Node ที่รับข้อมูล โดยหลักการจะมีการ Subscribe Topic ที่สนใจเพื่อจะรับข้อมูล โดย Node นี้จะส่งความต้องการที่เป็น Subscribe นั้นมาที่ Broker หลังจากนั้น Broker จะเช็คว่า มีใคร Subscribe หัวข้อที่ตรงกันบ้าง ถ้ามีตรงกันก็จะส่งข้อมูลกลับไปให้กับ Node ที่เรียกร้องข้อมูลมา ซึ่งจากตัวอย่างจะเห็นว่า Subscribe topic temperature ที่ตรงกับ Publisher ดังนั้น ก็จะได้รับ Data คือ 24 ํC มา

ภาพรวมการทำงานร่วมกันระหว่างLow level (Lidar bot) และ High Level (PC) โดยใช้ MQTTเป็นตัวกลางในการสื่อสารในโปรเจคนี้

1. ส่วน Low level ใช้ภาษา c ในการเขียน
2. ส่วน High level ใช้ภาษา phyton และภาษา c [ในSamba server] ในการเขียน โดยมีไฟล์ CSV เป็นฐานข้อมูลในการใช้งานร่วมกัน

ตารางแสดง Task list ในการร่วมกันพัฒนา

No.System levelCategoryTaskPICSupport
1Highรับข้อมูลจาก Low level มาทำ csv fileรับข้อมูลจาก HiveMQMek
2Highรับข้อมูลจาก Low level มาทำ csv fileนำข้อมูลไปสร้าง CSV file for “visual map display”Mek
3Highรับข้อมูลจาก Low level มาทำ csv fileนำข้อมูลไปสร้าง CSV file for “map solving”Mek
4Highส่งข้อมูลไปแสดงผลใน visual map displayอ่านข้อมูลจาก CSV file (Pandas library)SunMek
5Highส่งข้อมูลไปแสดงผลใน visual map displayสร้างหน้าต่างแสดงผลSunMek
6Highส่งข้อมูลไปแสดงผลใน visual map displayนำข้อมูลมาสร้างบล๊อคแรกในหน้าต่างแสดงผลSunPia
7Highส่งข้อมูลไปแสดงผลใน visual map displayนำชุดข้อมูลถัดไปมาอัพเดทบล๊อคในหน้าต่างแสดงผลSunPia
8Highส่งข้อมูลไปแสดงผลใน visual map displayกำหนดเส้นชัยSun
9Highส่งข้อมูลไปแสดงผลใน visual map displayกำหนดจุดเริ่มต้นSun
10Highส่งข้อมูลไปแสดงผลใน visual map displayทำตัวหุ่นที่วิ่งในแมพSun
11Highนำข้อมูลจาก csv file ที่ผ่านการอัพเดทข้อมูลแล้ว
ส่งไปที่ HiveMQ
รับข้อมูลจาก Samba serverKom,MekSun
12Highนำข้อมูลจาก csv file ที่ผ่านการอัพเดทข้อมูลแล้ว
ส่งไปที่ HiveMQ
ส่งข้อมูลไป HiveMQMekPia
13Highสำรวจแมพและหาเส้นทางที่สั้นที่สุดสร้างเข็มทิศKom
14Highสำรวจแมพและหาเส้นทางที่สั้นที่สุดออกแบบอัลกอริทึ่ม เดินทางเพื่อเก็บแม็พKom
15Highสำรวจแมพและหาเส้นทางที่สั้นที่สุดหาเส้นทางที่สั้นที่สุดKom
16Lowcalibrate ตำแหน่งตัวหุ่นให้อยู่ตรงกลางตัวบล๊อคตรวจค่าระยะทางรอบตัวหุ่นVim,Art
17Lowcalibrate ตำแหน่งตัวหุ่นให้อยู่ตรงกลางตัวบล๊อคเคลื่อนที่ไปตำแหน่งตรงกลางของตัวบล๊อคVim,Art
18Lowส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Levelเตรียมข้อมูล ตำแหน่งของบล๊อคPiaPia
19Lowส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Levelเตรียมข้อมูล ตำแหน่งของด้านในบล๊อคนั้นๆPiaPia
20Lowส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Levelส่งข้อมูลไป HiveMQPiaVim
21Lowรับคำสั่งการเคลื่อนที่จาก High Levelรับข้อมูลจาก HiveMQPiaVim
22Lowการเคลื่อนที่เดินหน้าโดยรับคำสั่งจาก HiveMQVim,PiaArt
23Lowการเคลื่อนที่หันซ้ายโดยรับคำสั่งจาก HiveMQVim,PiaArt
24Lowการเคลื่อนที่หันขวาโดยรับคำสั่งจาก HiveMQVim,PiaArt
25Lowการเคลื่อนที่U_turnโดยรับคำสั่งจาก HiveMQVim,PiaArt

High-level (PC)

รับข้อมูลจาก Low level มาทำ csv file

ส่วนของการสื่อสารระหว่าง Low level กับ High level

รับข้อมูลจาก Low level ผ่าน HiveMQl

นำข้อมูลไปสร้าง CSV file for “map solving”และ”visual map display” ผ่าน Samba server

ส่งข้อมูลกลับไป HiveMQ เพื่อบอกหุ่นยนต์

ส่งข้อมูลไปแสดงผลใน visual map display

ขั้นตอนการทำงานของโปรแกรม

  • สร้างไฟล์ .csv Map 10×10 (Map เริ่มต้น ยังไม่มีกำแพง)
  • เข้าไปอ่านไฟล์ .csv ที่มีการอัพเดทตำแหน่งและกำแพง (ผ่าน Server IP Address)
  • เก็บค่าตัวแปล ตำแหน่ง (x,y) และกำแพง (E,W,N,S) และบันทึกในรูปแบบ Format ที่กำหนด
  • นำค่าที่บันทึก มาตรวจสอบตำแหน่งแล้วทำการบันทึกลงในไฟล์ Map เริ่มต้น
  • นำไฟล์ .csv Map เริ่มต้น ไปสร้างเป็น visual map display 
  • Update เมื่อได้จุด start  end และ shortest route 

สร้างไฟล์ .csv Map 10×10 (Map เริ่มต้น ยังไม่มีกำแพง)

เข้าไปอ่านไฟล์ .csv ที่มีการอัพเดทตำแหน่งและกำแพง (ผ่าน Server IP Address)

นำค่าที่บันทึก มาตรวจสอบตำแหน่งแล้วทำการบันทึกลงในไฟล์ Map เริ่มต้น

นำไฟล์ .csv Map เริ่มต้น ไปสร้างเป็น visual map display 

Update เมื่อได้จุด start  end และ shortest route 

Video แสดงการทำงานของ Visual map display

สำรวจแมพและหาเส้นทางที่สั้นที่สุด

Samba Serverคือ การแชร์ทรัพยากรบนเครื่องระบบปฏิบัติการลินุกซ์ (Linux) ในระบบเครือข่ายให้กับระบบปฏิบัติการวินโดว์ (Windows) ใช้งาน  ซึ่งเราได้นำมาประยุกต์ใช้เป็นสื่อกลางในการสื่อสารระหว่าง High Level เนื่องจากมีการใช้ภาษาในการเขียนโปรแกรมที่แตกต่างกันอีกทั้งเราได้แบ่งหน้าที่กันทำงานเป็น Module จึงได้นำ samba server มาประยุกต์ใช้

**เนื่องด้วยความถนัดในการใช้ภาษาในการเขียนโปรแกรมที่แตกต่างกัน ส่งผลให้ระหว่างการพัฒนาตัวโปรแกรมทางทีมงานไม่ได้ใช้ภาษาเดียวกัน ดังนั้นจึงไม่สามารถรวมโปรแกรมทั้งหมดใน high level ให้อยู่ด้วยกันได้ ดังนั้นทางทีมงานจึงแก้ปัญหานี้โดยการ แยกโปรแกรมใครโปรแกรมมัน และใช้ Samba Server ในการติดต่อสื่อสารกัน

การสร้างเข็มทิศบน Software

  1. สร้างเข็มทิศบน Software
  • กำหนดด้านบนของเขาวงกตเป็นทิศเหนือเสมอ
  • เริ่มต้นเราจะให้ใส่ค่าทิศรอบตัวหุ่นยนต์และตำแหน่งของตัวหุ่นยนต์
  • เมื่อมีการเลี้ยวซ้ายหรือเลี้ยวขวาจะถูกทำการทดเลขของทิศไปเรื่อยๆ
  • ฟังก์ชันในการที่จะทดเลขของเข็มทิศจะมี 3 ฟังก์ชันคือ เลี้ยวซ้าย,เลี้ยวขวา,กลับตัว
Video แสดงเข็มทิศบน Software

สำรวจเขาวงกต

2. สำรวจเขาวงกต

  • กำหนดลำดับความสำคัญของทิศที่หุ่นยนต์จะทำการสำรวจตามลำดับดังนี้ North>East>South>West
  • นำ Data ที่ได้จากไฟล์ csv มาประมวลผล โดยที่เมื่อหุ่นยนต์ทำการ Scan ด้านซ้าย ด้านหน้า และ ด้านข้าง ถ้ามีทางที่ไปได้กำหนดให้เป็น 1 และทางที่ตัน เป็น 0
  • เมื่อเจอทางที่เป็น 1 จะทำการเปรียบเทียบเพื่อหาทิศทางที่มีลำดับคความสำคัญสูงที่สุด
  • เมื่อพบเส้นทางแล้วจะสั่งบันทึกลงไฟล์ csv ส่งกลับไปเพื่อให้หุ่นยนต์ทำตามคำสั่ง
  • บันทึกค่าลง stack และ vector (dynamic array) ทุกการสั่งการ หากเจอทางตันจะหยิบ stack ตัวล่าสุดเพื่อให้หุ่นยนต์ย้อนกลับไปทางเดิม
  • วน loop แบบนี้จนสำรวจทั้วเขาวงกต โดยหลักการที่ใช้นี้เรียกว่า Depth First Search
Flowchart สำรวจเขาวงกต
turnRight Function
go straight Function
U-turn Function
Concept Video สำหรับสำรวจแมพและหาเส้นทางที่สั้นที่สุด

สำรวจเขาวงกตและหาเส้นทางที่สั้นที่สุด

3. หาเส้นทางที่สั้นที่สุด

  • เนื่องจากยังติดปัญหาด้านการสำรวจเขาวงกตยังจึงไม่สามารถบอกได้ว่าทำอย่างไรจึงจะหาเส้นทางที่สั้นที่สุด
  • โดย algorithm ที่คิดว่าจะนำมาใช้นั้นเป็นของ Dijkstra’s algorithm ซึ่งเป็น กระบวนการหาเส้นทางที่สั้นที่สุดในการหาทางออกโดยสิ่งที่จะใช้ในการนำมาคิดคือค่า vector(dynamic array) ที่เราเก็บรวบรวมมาจากตอนสำรวจเขาวงกตจะเปรียบเสมือน Node ที่ถูกเชื่อมต่อกันแล้วจะถูกนำมาประมวลผลหาเส้นทางที่สั้นที่สุด

4. Data Transfer

  • directionforC.csv ถูกนำมาใช้กับการบันทึกหาเส้นทางที่ไปได้
  • directionforRobot.csv ใชกับการส่งคำสั่งเพื่อให้หุ่นยนต์เดินหรือเลี้ยว
  • updatemap.csv ใช้กับการส่งข้อมูลที่ถูกแปลงเป็นทิศโดยบอกว่ามีกำแพงทางทิศไหนเพื่อนำไปสร้างเป็นแผนที่

Low-level (Lidar bot)

Lidarbot information

รูปแบบการเคลื่อนของ LidarBot

Lidarbot programming in each state

Carside Function (main function ที่เป็นตัว run maze) 

Sample maze

ส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Level

ส่วนการเชื่อมต่อกับ MQTT

Flow Chart และโปรแกรมส่วนการเชื่อมต่อ MQTT Server 

ส่วนการรับชุดข้อมูลจาก HiveMQ

Flow Chart และโปรแกรม  ส่วนการรับค่า Subscribe Data จาก MQTT Server เพื่อสั่งงานการเคลื่อนที่ของหุ่นยนต์ 

ส่วนการส่งชุดข้อมูลไป HiveMQ

เตรียมข้อมูล ตำแหน่งของบล๊อคและตำแหน่งของด้านในบล๊อคนั้นๆ
Flow Chart และโปรแกรม  ส่วนการส่งชุดข้อมูล Publish ไปที่ MQTT Server
**(เป็นตัวอย่างในการนำไปประยุกต์เพื่อส่งข้อมูล)