o Objectives
เป็นการประยุกต์ใช้ความรู้เกี่ยวกับการเขียนโปรแกรม Human-Computer Interfaceo Design
· System Overview
รูปภาพที่ 1 การวางตำแหน่ง motor
Motor id 0 : ควมคุมมุมขาหนีบของขาซ้าย ในทิศทางซ้าย-ขวา
Motor id 1 : ควมคุมมุมขาหนีบของขาซ้าย ในทิศทางขึ้น-ลง
Motor id 2 : ควมคุมมุมของหัวเข่าซ้าย
Motor id 3 : ควมคุมมุมของข้อเท้าซ้าย ในทิศทางขึ้น-ลง
Motor id 4 : ควมคุมมุมของข้อเท้าซ้าย ในทิศทางซ้าย-ขวา
Motor id 5 : ควมคุมมุมขาหนีบของขาขวา ในทิศทางซ้าย-ขวา
Motor id 6 : ควมคุมมุมขาหนีบของขาขวา ในทิศทางหน้า-หลัง
Motor id 7 : ควมคุมมุมของหัวเข่าขวา
Motor id 8 : ควมคุมมุมของข้อเท้าขวา ในทิศทางขึ้น-ลง
Motor id 9 : ควมคุมมุมของข้อเท้าขวา ในทิศทางซ้าย-ขวา
Motor id 10 : ควมคุมมุมของหัวไหล่ข้างซ้าย ในทิศหน้า-หลัง
Motor id 11 : ควมคุมมุมของหัวไหล่ข้างซ้าย ในทิศขึ้น-ลง
Motor id 12 : ควมคุมมุมของข้อศอกข้างซ้าย
Motor id 13 : ควมคุมมุมของหัวไหล่ข้างขวา ในทิศหน้า-หลัง
Motor id 14 : ควมคุมมุมของหัวไหล่ข้างขวา ในทิศขึ้น-ลง
Motor id 15 : ควมคุมมุมของข้อศอกข้างขวา
ทฤษฎีการหามุมจากจุด
เนื่องจาก output ของ Kinect ได้มาเป็น joint position ดังนั้นจึงต้องนำจุดมาคำนวณหามุมของข้อพับต่างๆ เพื่อนำมาใช้สั่งมุม motor ของหุ่นยนต์
รูปภาพที่ 2 แสดงการคำนวณมุมของหัวเข่า
Kinect Joint Position
รูปภาพที่ 3 แสดง joint ที่สามรถอ่านได้จาก Kinect
หากให้ Kinect SDK ของ Microsoft (สามารถดู Review ของ Kinect SDK ได้ที่นี่ http://miiniq.blogspot.com/2013/04/kinect-software-review.html) สามารถจะอ่าน Position ต่างของมนุษย์มาได้ โดยที่
มุมของข้อหัวไหล่ข้างซ้าย เพื่อสั่งให้ Motor id 11 ขยับหาได้จากการคำนวณ position ของ ข้อศอกซ้าย หัวไหล่ซ้าย และหัวไหล่ขวา (ELBOW_LEFT, SHOULDER_LEFT, SHOULDER_RIGHT)
มุมของ Motor id 10 ตั้งเป็นค่าคงที่ให้แขนชี้ลง (85 องศา) [*]
มุมของข้อศอกข้างซ้าย เพื่อสั่งให้ Motor id 12 ขยับหาได้จากการคำนวณ position ของ ข้อมือซ้าย ข้อศอกซ้าย และหัวไหล่ซ้าย (WRIST_LEFT, ELBOW_LEFT, SHOULDER_LEFT)
มุมของข้อขาหนีบข้างซ้าย เพื่อสั่งให้ Motor id 1 ขยับหาได้จากการคำนวณ position ของ หัวไหล่ซ้าย สะโพกซ้าย และหัวเข่าซ้าย (SHOULDER_LEFT,HIP_LEFT, KNEE_LEFT )
มุมของข้อหัวไหล่ข้างขวา เพื่อสั่งให้ Motor id 14 ขยับหาได้จากการคำนวณ position ของ ข้อศอกขวา หัวไหล่ขวา และหัวไหล่ซ้าย (ELBOW_RIGHT, SHOULDER_RIGHT, SHOULDER_LEFT)
มุมของ Motor id 13 ตั้งเป็นค่าคงที่ให้แขนชี้ลง (165 องศา) [*]
มุมของข้อศอกข้างขวา เพื่อสั่งให้ Motor id 15 ขยับหาได้จากการคำนวณ position ของ ข้อมือขวา ข้อศอกขวา และหัวไหล่ขวา (WRIST_RIGHT, ELBOW_RIGHT, SHOULDER_RIGHT)
มุมของข้อขาหนีบข้างขวา เพื่อสั่งให้ Motor id 6 ขยับหาได้จากการคำนวณ position ของ หัวไหล่ขวา สะโพกขวา และหัวเข่าขวา และ (SHOULDER_RIGHT,HIP_RIGHT, KNEE_RIGHT )
มุมของหัวเข่าข้างขวา เพื่อสั่งให้ Motor id 7 ขยับหาได้จากการคำนวณ position ของ สะโพกขวา หัวเข่าขวา และข้อเท้าขวา (HIP_RIGHT, KNEE_RIGHT, ANKLE_RIGHT )
มุมของข้อเท้าข้างขวา เพื่อสั่งให้ Motor id 8 ขยับหาได้จากการคำนวณ position ของ หัวเข่าขวา ข้อเท้าขวา และเท้าขวา (KNEE_RIGHT, ANKLE_RIGHT, FOOT_RIGHT )
หมายเหตุ
[*] เนื่องจากการอ่านมุมจาก plane ด้านข้างมีข้อผิดพลาดมาก มุมนี้เลยต้องกำหนดจุดคงที่ไว้
***หลังจากการคุมขาของหุ่นยนต์จาก มุมของข้อต่างๆ ของมนุษย์มีความคลาดเคลื่อนค่อนข้างมาก ทำให้การเดินเปลี่ยนมาใช้การจับท่าทางการเดินของมนุษย์แล้วไปสั่งให้หุ่นยนต์เดิน
wCK Motor Control Package
· Programming
- Main Process : ส่วนการเชื่อมต่อกัน kinect sensor ส่วนนี้จะเชื่อมต่อกับ kinect, serial prot แล้วจะเป็นส่วนที่รับข้อมูล joint จาก kinect และเมื่อได้ข้อมูล joint จาก kinect แล้วกระบวนการนี้จะแยกข้อมูลในส่วนของขาและแขน ส่งให้ thread ที่มีหน้าที่ในการประมวลผล
- Arm Process : ส่วนการประมวลผลข้อมูลของแขน ส่วนนี้ เมื่อได้ข้อมูลจากส่วนที่ 1 แล้วจะคำนวณมุมของแขนจาก joint position ที่ได้ จากนั้นจะแปลงเป็น มุมของมอเตอร์แล้วส่งเข้า queue ในการส่ง serial
- Leg Process : ส่วนการประมวณผลการเดิน ส่วนนี้จะตรวจสอบว่า คนที่ kinect จับได้อยู่ มีการเดินหรือยัง โดยการเดินคือ ต้องมีการก้าวเท้าทั้งสองข้าง จากนั้น ส่วนนี้จะ ส่งคำสั่งการเดิน เข้าไปใน queue
- Thread Send Serial : ส่วนของการส่ง serial ให้หุ่น โดยส่วนนี้จะคอยตรวจสอบว่ามีคำสั่งอยู่ใน queue รึเปล่า ถ้ามีให้ส่งคำสั่งออกไปทาง serial
o Video of Operation
วีดีโอ 1 : ทดสอบ Kinect Motion Sensor กับ Skeleton Example Code
วีดีโอ 2 : ทดสอบการขยับช่วงบนของหุ่นยนต์โดยอ่านค่ามุมของแขนจาก Kinect Motion Sensor
วีดีโอ 2 : ทดสอบการขยับช่วงขาของหุ่นยนต์
ปัญหา : ค่าองศาที่มนุษย์ขยับได้กับหุ่นยนต์ขยับได้ไม่เท่ากัน เลยต้องมีการเทียบค่าขึ้น หรือเทียบค่าลง ทำให้เกิดความคลาดเคลื่อน
แนวทางการแก้ปัญหา : กำหนดองศาในการบังคับหุ่นยนต์ว่าจะใช้ช่วงเท่าไหร่
ปัญหา : การหามุมในมุมมอง (plane) ข้างลำตัวของ Kinect ค่อนค่างมีความคลาดเคลื่อนมาก ทำให้มุมที่สั่งให้ขาของหุ่นขยับเขยื้อนนั้นมี ความคลาดเคลื่อนมากตามไปด้วยมุมของขาหุ่นจึงไม่ได้ตาม มุมของมนุษย์ที่สั่ง ส่งผลให้ หุ่นไม่สามารถทรงตัวได้ เวลาเดินแล้วจึงจะล้ม
แนวทางการแก้ปัญหา : มีแนวทางที่สามารถแก้ปัญหาได้ 1.เพิ่ม gyro sensor เพื่อช่วยในการรักษาสมดุลของหุ่น หรือ 2. ใช้ Kineck หา orenttion ในช่วงของขาแทน แล้วไปส่งให้หุ่นยนต์เดิน
ปัญหา : ถ้า process ที่ใช้คำนวณมุมของข้อต่อและ process ของการส่ง serial เป็น process เดียวกัน ใช้แยก process ที่ส่ง serial ออกเป็น thread เพราะว่าถ้าหากมีการ callback โดย kinect driver เยอะจะทำให้เกิดการส่ง serial เยอะๆ และจะทำให้โปรแกรมค้าง
o Team Member
MaIII
FRA'10 FIBO KMUTT
please share with me the source code to my email a2cs99@hotmail.es
ตอบลบSorry for slow response, Now I not have Source Code because my Hard Drive crash.
ลบความคิดเห็นนี้ถูกผู้เขียนลบ
ตอบลบplease share the source code - full(arm and leg) robobuilder kinect control to my email muzafferyildirim57@gmail.com.com
ตอบลบความคิดเห็นนี้ถูกผู้เขียนลบ
ตอบลบPlease can you send me your project ... i can't understand how to do for the legs of my robobuilder. Please : luis_8899@hotmail.com
ลบSorry for slow response, Now I not have Source Code because my Hard Drive crash. I not use control angle of legs because I have problem with balancing robot (CM & CG not same human). In this project I store Robobuilder Walk Pattern in the Progrem when Kinect detect Human Walk The Program will send Walk Command to Robobuilder.
ลบติดต่อกลับด้วยครับ 081-339-3345(ไพโรจน์) ผมสนใจ project นี้ อยากซื้อมาใช้ในงานผมครับ
ตอบลบ