top of page
  • Writer's pictureBall Phuthanet

Project: สื่อการสอน Dobot ด้วย AR

Updated: Aug 6, 2019

เริ่มทำ 27/6/62 ถึง 23/7/62

 

Overview



What: สื่อการสอน Dobot ผ่านระบบ AR

Who: บุคคลทั่วไปที่สนใจเริ่มศึกษาเกี่ยวกับแขนกล

Why: การศึกษาแบบเดิมอาจจะเป็นสิ่งที่น่าเบื่อและเข้าถึงผู้สนใจได้ยากเลยทำระบบที่สามารถให้ผู้สนใจได้มีปฏิสัมพันธ์กับสื่อการสอนเพื่อดึงดูดใจทำให้ผู้สนใจไม่เบื่อและได้ความรู้

Where: โดยเริ่มจากการทดสอบบริเวณมหาวิทยาลัยพระจอมเกล้า ธนบุรี

When: ช่วงเวลาการทดสอบภายในช่วงเวลาการฝึกงาน

How: สร้าง Object ที่เอาไว้ควบคุมหรือการสอนไว้บน Marker โดยใช้ Mobile ในการส่อง Marker เพื่อให้เห็นส่วนควบคุมแล้วสั่งการ Dobot ผ่าน Socket





ผลการเก็บข้อมูล

สีส้ม-pre test

สีฟ้า-post test


โค๊ดทุกอย่างอยู่ใน Github ด้านล่าง

 

ฝึกงานวันที่ 18 (27/6/62)

-ทำ UI ใน Unity

-ศึกษาการทำ Raycast


อันดับแรกสร้าง Project ใน Unity แล้วก็จะเจอหน้าตาแบบนี้

ให้เราไป Setting project เป็น Android ก่อน เพราะเราจะทำลงโทรศัพท์ Android


ให้ตั้งค่าตามแล้วกด Switch Platform


ต่อไปจะเริ่มในส่วนการทำ AR อันดับแรกให้ลบ Main Camera ออกก่อน แล้วคลิกขวาเพิ่ม Vuforia AR Camera มาแทนเสร็จแล้วมันจะขึ้นให้ Import Vuforia Engine ให้กด Import


ต่อไปจะต้องไปตั้งค่าใน Project Setting


และไปตั้งใน XR Setting ให้เลือก Vuforia


กด Ctrl+Shift+V จะขึ้นแถบด้านขวาขึ้นมาต่อไปเราต้องไปเข้าเว็บ Vuforia

เว็บ https://developer.vuforia.com/ เลือก Develop ปล.สมัคร account ก่อน

เสร็จให้กด Get Development Key สร้างชื่ออะไรก็ได้ กด Confirm

ต่อไปให้คลิกไปที่ชื่อที่เราสร้างมันจะมี Key ให้เรา Copy ไปใส่ในกรอบแดง



ต่อไปเราจะทำ marker โดยการไปที่ Target Manager แล้ว Add Database และตั้งชื่อ


คลิกเข้าไปที่ชื่อนั้นแล้วกด Add Target แล้วเลือกรูป และใส่ความกว้างจริงหน่วยเป็น เมตร เราก็จะได้รูปมาโดยที่ดาวจะบอกคุณภาพในการ track

กด Download Database เลือก Unity Editor

กลับไป Import Package ที่ Unity


คลิกขวาแล้วกดตามรูป

แล้วก็เลือกรูปจาก Database

marker อันนี้ถ้าเราอยากส่องไปแล้วให้เกิด object ขึ้นมาให้ สร้าง object ที่เป็น child ตัวนั้นเช่นวันนี้เราจะสร้าง UI เราก็สร้าง UI Button ใน ImageTarget


ที่ Canvas ให้ ปรับเป็น World Speace และลาก AR Camera มาใส่

ต่อไปปุ่มเราก็จะไปตั้งค่าปุ่มกันถ้าเป็นคลิกแล้วทำให้ไปเพิ่มที่ On Click แต่อยากให้กดทำ ปล่อยแล้วหยุดทำให้ไปเพิ่ม Coponent ตัว Event Trigger โดยเพิ่ม Pointer Down กับ Pointer Up


ต่อไปก็จะไปสร้าง Script หลักกัน



ถ้าเราอยากจะไปแก้ไข Code โดยเลือก Editor เองให้เข้าไปตั้งที่ External Tools

ต่อไปเป็นส่วนการเขียน code c# เมื่อเราสร้าง script แล้วให้คลิกเข้าไปแก้ script โดยมันจะแก้ผ่าน editor ที่ตั้งค่าไว้โดยการที่เราจะเขียนโค๊ดให้มันทำงานเวลากดทำได้โดยสร้าง ฟังก์ชั่นขึ้นมาแล้วทำการลาก script ไปอยู่ใน Folder Script และเราก็ ทำการตั้งค่าของปุ่มให้มันทำงานฟังก์ชั่นนั้น เช่น


เราสร้างฟังก์ชั่นชื่อ connect เวลาเราจะให้มันำฟังก์ชั่นนี้ตอนกดก็คือ

ลาก Client ไปที่ Script เวลาเราเรียกใช้ก็ก็ไปที่ Button แล้วกด + เสร็จแล้วให้ลาก Script ไปตามรูป

แล้วฟังก์ชั่นที่เขียนไว้ทีนี้เราก็จะทำได้แล้ว

แต่พอเราทดลองรันโปรแกรมปรากฏว่ามันจะยังไม่สามารถกดได้คราวนี้ก็ต้องไปศึกษาการทำ Raycast ดู ซึ่งไอวิธีนี้มันเป็นเหมือนเกมยิงปืนแหละที่พอยิงไปมันไปโดน object ไหนมันก็ไปทำอันนั้นเปรียบเหมือนกับนิ้วเราที่จิ้มไปบนหน้าจอมันก็จะยิงไปโดนปุ่มไหนมันก็ำงานปุ่มนั้น


แล้วให้ลาก Script อันนี้ไปอยู่ใน AR Camera โดย code ทุกอย่างจะอยู่ในลิงค์ Github นะ

โดยที่หน้าตาที่ทำจะทำออกมาแบบนี้



 

ฝึกงานวันที่ 19 (28/6/62)

-ส่งข้อมูลจาก Unity ไปหา Socket (Server)


ตอนนี้เราใช้การสื่อสารผ่าน Protocol TCP/IP โดยอันดับแรกเราจะต้อง Register ชื่อของ Client ก่อนด้วยการส่งข้อความไปว่า [Unity:REG] ต่อไปก็จะเป็นการส่ง Data ด้วยการส่งข้อความรูปแบบนี้ [Dobot:Data] โดยที่ Dobot เป็นชื่ออีก client นึงี่เราต้องการส่งหา ส่วน Data เป็นข้อมูลที่ต้องการส่งไป โดยการส่งข้อมูลไป Server ด้วย TCP/IP ใน C# โดยใช้คำสั่ง SendMessage("[Dobot:Data]"); โดยในคลิป Client ที่ชื่อ Dobot จะใช้ Putty ทดลองก่อน โดยส่วนของโค๊ด จะอธิบายทีเดียวข้างล่างสุด



 

ฝึกงานวันที่ 20 (2/7/62)

-การประกาศ global Variable ใน python

-เขียน Python ใน Dobot เพื่อติดต่อ Socket (Server)


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



ต่อไปจะเป็นการส่งข้อมูลจาก Dobot ไปยัง socket โดยจะใช้คำสั่ง sendall(bytes((Data).encode("utf-8"))); โดยคำสั่งนี้จะใช้ ร่วมกับ socket ใน Dobot ซึ่งจะต้อง encode เป็น utf-8 และส่งทีละ byte ส่วนการเขียนจะอธิบายข้างล่าง โดยอีกตัวที่ใช้ทดสอบก็เป็น putty เหมือนเดิม

 

ฝึกงานวันที่ 22 (4/7/62)

-ออกแบบโปรแกรมว่าต้องส่งค่า/รับค่าอะไรบ้าง

-เขียน Code ร่วมกับการทำ Threading


วันนี้ก็ลองมาเขียนดูว่าควรรับส่งค่าอะไรบ้าง จาก Dobot ไป Unity และต้องส่งอะไรจาก Unity ไป Dobot บ้างพอมานั่งเขียนดู


และพอทำไปเรื่อยๆจึงข้อสรุปว่าสิ่งที่ควรส่งค่ารับค่าจริงๆเป็นไปตามนี้

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

อันแรบเป็นตัวที่รับค่ามาจาก Sensor แล้วมาแสดงที่หน้าจอ ส่วนอีกฟังก์ชั่นหนึ่งทำการส่งค่าไปแสดงที่เว็บ จะเห็นได้ว่าถ้าเราเขียนแบบปกติ เราจะเขียนฟังก์ชั่นที่รับค่าจาก Sensor ก่อนแล้วมันจะแสดงบนหน้าจอส่งข้อมูลไปที่เว็บ แต่การแบบนี้เวลามันส่งค่าขึ้นเว็บช้ามันจะรอการส่งให้สำเร็จเสร็จแล้วค่อยวนมารับค่าอีกที ค่าที่แสดงที่หน้าจอมันก็จะ Delay ตามความไวแต่ถ้าเราทำ Threading เราจะสามารถทำ 2 ฟังก์ชั่นนี้พร้อมๆกันได้ โดยที่ ทำ Thread ตามจำนวนฟังก์ชั่น อย่างตัวอย่างก็ Thread แรก จะเป็นตัวี่รับค่าจาก Sensor และส่งค่าไปแสดงที่หน้าจอ ส่วนอีก Thread เก็บข้อมูลไว้และทยอยส่งขึ้นเว็บ จะเห็นได้ว่าเราก็จะได้ทั้งค่าขึ้นเว็บและค่าที่ไม่มีการ Delay ที่หน้าจอ


การที่เราจะทำ Threading ได้ดังนี้


1.เราต้อง import Thread ก่อน

2.สร้างฟังก์ชั่นที่จะให้เป็น Thread

3.ระบุว่าฟังก์ชั่นนั้นเป็น Thread

4.เริ่ม Thread


โดยถ้าฟังก์ชั่นนั้นเป็น loop infinity จะำการให้ทุก Thread ออก loop ได้ด้วยการนำตัวแปร Global มาเป็นเงื่อนไขหลุด loop

 

ฝึกงานวันที่ 23 (5/7/62)

-ดูการใช้ Contains , Substring ใน C#

-ดูการใช้ List ใน Python


วันนี้จะเป็นการดูเกี่ยวกับ Sting ที่ส่งมาจาก Server เพราะมันเกิดปัญหาว่า Server ได้ส่งข้อมูลมาเป็น Steaming โดยที่ไม่ได้ส่งทีละข้อมูล บางทีการส่งข้อมูล 1 ครั้ง ไม่ได้แปลว่าจะมีการสั่งการแค่ 1 คำสั่งเช่น มันจะส่งมาเป็น [Unity:A][Unity:B][Unity:C][Unity:D] จะเห็นได้ว่าส่งทีหลายคำสั่งเลยโดยวันนี้จะเป็นการแยกให้มันตัดคำสั่งให้มันทำทีละคำสั่ง


ถ้าใน C# ที่ใช้กับ Unity จะใช้ Substing กับ Contains

-Substring ตัวนี้จะเป็นการตัดข้อความโดยจะต้องใส่ตำแหน่งเริ่มกับตำแหน่งจบ โดย IndexOf เป็นการหาตำแหน่งของคำซึ่งให้หาตัว '[' ที่เป็นแรกและ ']' ที่เป็นตัวแหน่งสุดท้าย แล้วตัดมาเก็บในตัวแปรและเช็คคำสั่ง เราก็จะวัน loop เช็คแบบนี้เรื่อยๆจนว่าจะครบทุกคำสั่งใน การ Steam ค่า 1 ครั้ง


-Contain เป็นการเช็ค ว่ามีคำนั้นในประโยคหรือเปล่าเช่นในตัวอย่างจะเช็คว่ามีการส่งข้อมูลแกน x มาไหมถ้าใช่จะ Trim ตัดอักษรที่ไม่เกี่ยวข้องออก



ต่อไปใน Python มันก็เหมือนกันคือมันจะส่งข้อมูลมาเป็น Stream เราจะต้องตัดข้อมูลออกให้เหลือแค่คำสั่งเดียวก่อน โดย Python จะสามารตัดข้อความได้เลยโดยเขียนคล้ายๆ Array แต่ใน Python จะชื่อ List


เช่นตัวแปรชื่อ Data จะตัดข้อมูลก็เขียนว่า Data[ตำแหน่งเริ่ม:ตำแหน่งจบ] โดยตำแหน่งจะหาได้จาก find

ส่วน Contains ใน Python จะใช้ in




 

ฝึกงานวันที่ 24 (8/7/62)

-ปรับปรุง Code Dobot


วันนี้ก็เขียนโค๊ด ฝั่ง Dobot ที่เป็น Python โดยเอาแต่ละส่วนมารวมๆกัน ทำให้ Code ฝั่ง Dobot สมบูรณ์ มากขึ้น เดียวจะแปะ โค๊ดไว้ล่างสุด

 

ฝึกงานวันที่ 25 (9/7/62) และ ฝึกงานวันที่ 26 (10/7/62)

-ส่งข้อมูลจาก Unity ไป Dobot ผ่าน Socket


จากที่เราสามารถรับ/ส่งข้อมูล Dobot และ Unity ไป Server ได้แล้วและสามารถรับการ Streaming ข้อมูลได้แล้ว เลยนำมาเขียนคำสั่งเงื่อนไขในฝั่ง Dobot และ Unity




 

ฝึกงานวันที่ 28 (12/7/62)

-ทำ Marker ของแต่ละ Joint


วันนี้ก็มาทำ Marker ของ AR โดยการที่จะอัพขึ้น Vuforia Database แล้วเอามาใช้ดีเนี่ยมันจะต้องมีรายระเอียดที่ต่างกันซึ่งส่วนใหญ่เราจะใช้เป็น QR Code โดยทำจากแอปนี้ ใช้ง่ายมากฟรีด้วยแนะนำๆ


ทำออกมาก็ตามนี้



 

ฝึกงานวันที่ 29 (15/7/62)

-บังคับ Joint ผ่าน Marker ที่อยู่บน Joint


จากวันที่ผ่านมาได้ทำ Joint เป็น QR Code แล้วไปแปะตาม Joint


และเราก็เพิ่ม Object ที่บอกทิศหมุน Joint และทำ UI สามารถสั่งการที่ Joint ได้


 

ฝึกงานวันที่ 30 (18/7/62)

-ทำ เปิด/ปิด หัวดูดของ Dobot


ตรงนี้ก็จะทำ UI ที่เป็นปุ่ม Toggle (ติ๊ก)

แล้วข้างล่างก็จะเป็นส่วนของ Python กับ C# ที่อยู่ใน Dobot และ Unity ตามลำดับ

โดย isOn คือ ดูว่าตอนนั้นติ๊กอยู่หรือไม่


 

ฝึกงานวันที่ 31 (19/7/62)

-ทำ Pretest , Posttest ใน google form


วันนี้ก็จะเป็นการทำ Google Form เพื่อเก็บผลโดยที่ลิงค์ใน Googleform


โดยจะทำทั้งก่อนและหลังเพื่อประเมินผลโดยก่อนจะให้ผู้ประเมินดูคะแนนได้อย่างเดียวพอหลังจะทำให้ผู้ประเมินสามารถดูข้อที่ถูกต้องได้ โดยพอทำ google form เสร็จก็ไปใส่ใน QR Code ที่แอปเดิม




 

ฝึกงานวันที่ 32 (22/7/62)

-เพิ่ม Content สอน โปรแกรม

-ออกแบบ แบบฝึก

-การ Build ลง Android


ที่วางไว้คือที่ Operator panel สามารถควบคุม ได้ 2 แบบคือแบบ x,y,z และแบบ Joint และมันจะสามารถเคลื่อนที่ได้มีแบบ MOV กับ JUMP เลย ออกแบบให้สอนเรื่อง

MOV,JUMP,การเคลื่อนที่โดยเป็น Cartesian (x,y,z) และ Joint


ส่วน MOV กับ JUMP จะมีตำแหน่งให้ให้คนเล่นลองเคลื่อนย้ายบล็อกดูความแตกต่างของการเคลื่อนที่ทั้ง 2 แบบ เป็นการนำค่าตำแหน่ง x,y,z ไปใส่ใน InputField และส่งค่าไปให้ Dobot เปลี่ยนตำแหน่ง สามารถขยับได้ 2 แบบ นั้นคือแบบ MOV กับ JUMP นั้นเอง



ต่อไปจะเป็นการ Build ลงโทรศัพทร์ Android ก่อนอื่นต้องไปโหลด SDK มาก่อน

ถ้าใครยังไม่เลือก platform เป็น Android ให้กลับไปดูข้างบนนะ เสร็จแล้วก็กด Build ได้เลย เราจะได้ ไฟล์ apk ไปติดตั้ง จบบบ ปล.ถ้าใครใช้ Unity Version เก่า ต้องโหลด JDK ด้วยนะยุ่งยาก 55

 

ฝึกงานวันที่ 33 (23/7/62)

-Camera Focus Controller

-Build File ลง Mobile และทดสอบ


พอทดสอบไปปรากฏว่า กล้องไม่โฟกัส ก็เลยหาวิธี Auto Focus กล้องเลยไปเจอ Script อันนึงชื่อ Camera Focus Controller ก็เลยลองใช้ดูสรุป ดีเยี่ยม อยู่ใน Github นะลงไว้ให้แล้วให้ลาก Script นี้ไปใส่ใน AR Camera



เสร็จแล้วก็ Build ลง Android เหมือนเดิม จบบ

 

Source Code

โค๊ดที่อยู่ข้างล่างนี้เป็นของ Unity และ Dobot เท่านั้นส่วนโค๊ดที่ต้องใช้ใน Unity ที่เหลือจะอยู่ใน Github


Unity



Dobot



Server


Protocol : TCP/IP

Port : 1150


1. Client แต่ละตัวให้ Register ชื่อโดยให้ส่งข้อความไปหา Server ด้วยคำว่า [A:REG] โดยที่ A สามารถเปลี่ยนเป็นชื่ออื่นๆตามที่อยากตั้งได้ตามชื่อ Client

2.ถ้าเราเป็น A และอยากส่งข้อมูลไปหา Client ที่ชื่อว่า B ให้ส่งข้อความไปหา Server ว่า [B:Data] โดยที่ Data คือข้อมูลที่เราอยากจะส่งไป

70 views0 comments
bottom of page