ผู้จัดทำ

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

2. ส่วน High level ใช้ภาษา phyton และภาษา c [ในSamba server] ในการเขียน โดยมีไฟล์ CSV เป็นฐานข้อมูลในการใช้งานร่วมกัน
ตารางแสดง Task list ในการร่วมกันพัฒนา
No. | System level | Category | Task | PIC | Support |
1 | High | รับข้อมูลจาก Low level มาทำ csv file | รับข้อมูลจาก HiveMQ | Mek | |
2 | High | รับข้อมูลจาก Low level มาทำ csv file | นำข้อมูลไปสร้าง CSV file for “visual map display” | Mek | |
3 | High | รับข้อมูลจาก Low level มาทำ csv file | นำข้อมูลไปสร้าง CSV file for “map solving” | Mek | |
4 | High | ส่งข้อมูลไปแสดงผลใน visual map display | อ่านข้อมูลจาก CSV file (Pandas library) | Sun | Mek |
5 | High | ส่งข้อมูลไปแสดงผลใน visual map display | สร้างหน้าต่างแสดงผล | Sun | Mek |
6 | High | ส่งข้อมูลไปแสดงผลใน visual map display | นำข้อมูลมาสร้างบล๊อคแรกในหน้าต่างแสดงผล | Sun | Pia |
7 | High | ส่งข้อมูลไปแสดงผลใน visual map display | นำชุดข้อมูลถัดไปมาอัพเดทบล๊อคในหน้าต่างแสดงผล | Sun | Pia |
8 | High | ส่งข้อมูลไปแสดงผลใน visual map display | กำหนดเส้นชัย | Sun | |
9 | High | ส่งข้อมูลไปแสดงผลใน visual map display | กำหนดจุดเริ่มต้น | Sun | |
10 | High | ส่งข้อมูลไปแสดงผลใน visual map display | ทำตัวหุ่นที่วิ่งในแมพ | Sun | |
11 | High | นำข้อมูลจาก csv file ที่ผ่านการอัพเดทข้อมูลแล้ว ส่งไปที่ HiveMQ | รับข้อมูลจาก Samba server | Kom,Mek | Sun |
12 | High | นำข้อมูลจาก csv file ที่ผ่านการอัพเดทข้อมูลแล้ว ส่งไปที่ HiveMQ | ส่งข้อมูลไป HiveMQ | Mek | Pia |
13 | High | สำรวจแมพและหาเส้นทางที่สั้นที่สุด | สร้างเข็มทิศ | Kom | |
14 | High | สำรวจแมพและหาเส้นทางที่สั้นที่สุด | ออกแบบอัลกอริทึ่ม เดินทางเพื่อเก็บแม็พ | Kom | |
15 | High | สำรวจแมพและหาเส้นทางที่สั้นที่สุด | หาเส้นทางที่สั้นที่สุด | Kom | |
16 | Low | calibrate ตำแหน่งตัวหุ่นให้อยู่ตรงกลางตัวบล๊อค | ตรวจค่าระยะทางรอบตัวหุ่น | Vim,Art | |
17 | Low | calibrate ตำแหน่งตัวหุ่นให้อยู่ตรงกลางตัวบล๊อค | เคลื่อนที่ไปตำแหน่งตรงกลางของตัวบล๊อค | Vim,Art | |
18 | Low | ส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Level | เตรียมข้อมูล ตำแหน่งของบล๊อค | Pia | Pia |
19 | Low | ส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Level | เตรียมข้อมูล ตำแหน่งของด้านในบล๊อคนั้นๆ | Pia | Pia |
20 | Low | ส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Level | ส่งข้อมูลไป HiveMQ | Pia | Vim |
21 | Low | รับคำสั่งการเคลื่อนที่จาก High Level | รับข้อมูลจาก HiveMQ | Pia | Vim |
22 | Low | การเคลื่อนที่ | เดินหน้าโดยรับคำสั่งจาก HiveMQ | Vim,Pia | Art |
23 | Low | การเคลื่อนที่ | หันซ้ายโดยรับคำสั่งจาก HiveMQ | Vim,Pia | Art |
24 | Low | การเคลื่อนที่ | หันขวาโดยรับคำสั่งจาก HiveMQ | Vim,Pia | Art |
25 | Low | การเคลื่อนที่ | U_turnโดยรับคำสั่งจาก HiveMQ | Vim,Pia | Art |
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
- สร้างเข็มทิศบน Software
- กำหนดด้านบนของเขาวงกตเป็นทิศเหนือเสมอ
- เริ่มต้นเราจะให้ใส่ค่าทิศรอบตัวหุ่นยนต์และตำแหน่งของตัวหุ่นยนต์
- เมื่อมีการเลี้ยวซ้ายหรือเลี้ยวขวาจะถูกทำการทดเลขของทิศไปเรื่อยๆ
- ฟังก์ชันในการที่จะทดเลขของเข็มทิศจะมี 3 ฟังก์ชันคือ เลี้ยวซ้าย,เลี้ยวขวา,กลับตัว
สำรวจเขาวงกต
2. สำรวจเขาวงกต
- กำหนดลำดับความสำคัญของทิศที่หุ่นยนต์จะทำการสำรวจตามลำดับดังนี้ North>East>South>West
- นำ Data ที่ได้จากไฟล์ csv มาประมวลผล โดยที่เมื่อหุ่นยนต์ทำการ Scan ด้านซ้าย ด้านหน้า และ ด้านข้าง ถ้ามีทางที่ไปได้กำหนดให้เป็น 1 และทางที่ตัน เป็น 0
- เมื่อเจอทางที่เป็น 1 จะทำการเปรียบเทียบเพื่อหาทิศทางที่มีลำดับคความสำคัญสูงที่สุด
- เมื่อพบเส้นทางแล้วจะสั่งบันทึกลงไฟล์ csv ส่งกลับไปเพื่อให้หุ่นยนต์ทำตามคำสั่ง
- บันทึกค่าลง stack และ vector (dynamic array) ทุกการสั่งการ หากเจอทางตันจะหยิบ stack ตัวล่าสุดเพื่อให้หุ่นยนต์ย้อนกลับไปทางเดิม
- วน loop แบบนี้จนสำรวจทั้วเขาวงกต โดยหลักการที่ใช้นี้เรียกว่า Depth First Search





สำรวจเขาวงกตและหาเส้นทางที่สั้นที่สุด
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)














ส่งตำแหน่งของบล๊อคและด้านของกำแพงในบล๊อคนั้นๆไป High Level
ส่วนการเชื่อมต่อกับ MQTT

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

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


**(เป็นตัวอย่างในการนำไปประยุกต์เพื่อส่งข้อมูล)