วันจันทร์ที่ 20 พฤษภาคม พ.ศ. 2556

Human Computer Interface : Mirror Robot Control with Kinect

Standard

o Objectives
เป็นการประยุกต์ใช้ความรู้เกี่ยวกับการเขียนโปรแกรม Human-Computer Interface
o Design
          · System Overview



                    ใช้หุ่นยนต์ RoboBuilder เป็น Hardware โดยหุ่น RoboBuilder ที่นำมาใช้ ใช้ motor wCK ทั้งหมด 16 ตัว แบ่งเป็น Motor ขาข้างละ 5 ตัว และ motor แขนข้างละ 3 ตัว และ motor ของ RoboBuilder จะมี id กำกับอยู่ ตามรูปภาพที่ 1


รูปภาพที่ 1 การวางตำแหน่ง motor 


                    การกำหนด 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 2 ขยับหาได้จากการคำนวณ position ของ สะโพกซ้าย หัวเข่าซ้าย และข้อเท้าซ้าย (HIP_LEFT, KNEE_LEFT, ANKLE_LEFT )

                                       มุมของข้อเท้าข้างซ้าย เพื่อสั่งให้ Motor id 3 ขยับหาได้จากการคำนวณ position ของ หัวเข่าซ้าย ข้อเท้าซ้าย และเท้าซ้าย (KNEE_LEFT, ANKLE_LEFT, FOOT_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

          Flow การทำงานหลักๆ ของโปรแกรม จะแบ่งเป็น 4 ส่วน

  1. Main Process : ส่วนการเชื่อมต่อกัน kinect sensor ส่วนนี้จะเชื่อมต่อกับ kinect, serial prot แล้วจะเป็นส่วนที่รับข้อมูล joint จาก kinect และเมื่อได้ข้อมูล joint จาก kinect แล้วกระบวนการนี้จะแยกข้อมูลในส่วนของขาและแขน ส่งให้ thread ที่มีหน้าที่ในการประมวลผล
  2. Arm Process : ส่วนการประมวลผลข้อมูลของแขน ส่วนนี้ เมื่อได้ข้อมูลจากส่วนที่ 1 แล้วจะคำนวณมุมของแขนจาก joint position ที่ได้ จากนั้นจะแปลงเป็น มุมของมอเตอร์แล้วส่งเข้า queue ในการส่ง serial
  3. Leg Process : ส่วนการประมวณผลการเดิน ส่วนนี้จะตรวจสอบว่า คนที่ kinect จับได้อยู่ มีการเดินหรือยัง โดยการเดินคือ ต้องมีการก้าวเท้าทั้งสองข้าง จากนั้น ส่วนนี้จะ ส่งคำสั่งการเดิน เข้าไปใน queue
  4. Thread Send Serial : ส่วนของการส่ง serial ให้หุ่น โดยส่วนนี้จะคอยตรวจสอบว่ามีคำสั่งอยู่ใน queue รึเปล่า ถ้ามีให้ส่งคำสั่งออกไปทาง serial




o Video of Operation




วีดีโอ 1 : ทดสอบ Kinect Motion Sensor กับ Skeleton Example Code




            วีดีโอ 2 : ทดสอบการขยับช่วงบนของหุ่นยนต์โดยอ่านค่ามุมของแขนจาก Kinect Motion Sensor




 วีดีโอ 2 : ทดสอบการขยับช่วงขาของหุ่นยนต์




 


o Problem & Solution Procedures
          ปัญหา : ค่าองศาที่มนุษย์ขยับได้กับหุ่นยนต์ขยับได้ไม่เท่ากัน เลยต้องมีการเทียบค่าขึ้น หรือเทียบค่าลง ทำให้เกิดความคลาดเคลื่อน
           แนวทางการแก้ปัญหา :  กำหนดองศาในการบังคับหุ่นยนต์ว่าจะใช้ช่วงเท่าไหร่

          ปัญหา : การหามุมในมุมมอง (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





8 ความคิดเห็น:

  1. please share with me the source code to my email a2cs99@hotmail.es

    ตอบลบ
    คำตอบ
    1. Sorry for slow response, Now I not have Source Code because my Hard Drive crash.

      ลบ
  2. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
  3. please share the source code - full(arm and leg) robobuilder kinect control to my email muzafferyildirim57@gmail.com.com

    ตอบลบ
  4. ความคิดเห็นนี้ถูกผู้เขียนลบ

    ตอบลบ
    คำตอบ
    1. 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

      ลบ
    2. 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.

      ลบ
  5. ติดต่อกลับด้วยครับ 081-339-3345(ไพโรจน์) ผมสนใจ project นี้ อยากซื้อมาใช้ในงานผมครับ

    ตอบลบ