Posts Tagged ‘Thaithon’

โปรเจคนี้เป็นการนำ Kinect Sensor มาใช้เป็น Motion Capture ครับ
โดยหลักการก็คือ นำอุปกรณ์ Kinect ซึ่งเป็นกล้องที่มี Depth sensor มาจับภาพของเรา จากนั้น ก็ detect ในส่วนที่คาดว่าเป็นตัวคน(ตัวแบบของเรา) แล้วก็บันทึกจุดข้อต่อต่าง ๆ นำมาเก็บไว้ใช้งาน

เพียงเท่านี้ก็ได้ Motion Capture ราคาไม่แพงแถมใช้สะดวกนำมาใช้งานกันแล้วครับ :)

จาก Video ตัวอย่างจะเห็นว่ายังมีจุดที่ Error อยู่บ้าง แต่ถ้านำโปรแกรมมาปรับปรุงอะไรอีกเล็กน้อย น่าจะนำไปใช้งานได้จริงครับ

หมายเหตุ: พึ่งรู้ว่าปริมาณ Data stream ที่ใช้ใน motion capture นี่เยอะเอาการเลยทีเดียว

download โค้ดโปรแกรมที่ใช้ Render ได้ที่นี่ครับ (Run บนภาษา Thaithon)

เนื่องจากสุดสัปดาห์ที่ผ่านมามีวันหยุดติดกันถึงสามวัน เลยมีเวลามาแก้ไข/เพิ่มเติมส่วนต่าง ๆ ให้กับไทยธอน
โดยฟีเจอร์เ่ด่นในเวอร์ชั่นนี้ ได้แก่ GPU Computing หรือการใช้ การ์ดจอของเรามาประมวลผลแทน CPU ซึ่งการประมวลผลแบบพร้อม ๆ กับหลาย ๆ Thread นั้น จะให้ผลเร็วกว่า CPU อย่างมหาศาล

การคำนวนด้วย GPU นี้เป็นเทคโนโลยีในยุคใหม่ที่เหมาะสำหรับการคำนวนข้อมูลจำนวนมาก ๆ ที่ต้องการความเร็วสูงในการประมวลผล
โดยระบบจะรองรับการ์ดจอที่ผลิตออกมาตั้งแต่ปี 2008 เป็นต้นไป (ซึ่งผมได้พัฒนาและทดสอบกับ nvidia ยังไม่แน่ใจว่าจะรองรับการ์ดของ ATI ได้หรือไม่)

ในบทความนี้ผมขอยกเอา การคำนวนค่าไพแบบมอลติคาร์โลที่เคยได้เสนอไปแล้วในบทความก่อน ๆ
มาคำนวนใหม่บน GPU เพื่อเปรียบเทียบให้เห็นความแตกต่าง

#โค้ดคำสั่งโปรแกรมภาษาไทยธอน
แสดงผล("เริ่มโปรแกรม")
หน่วยประมวลผล = จีพียู(2000000) #จำนวนรอบ(การย้ำ)คำนวน 2000000 รอบ

แหล่งข้อมูล1 = หน่วยประมวลผล.สร้างอาเรย์แบบสุ่มค่า() # สำหรับค่า x ในพิกัด(x,y)
หน่วยประมวลผล.ตั้งค่าบัฟเฟอร์(0,แหล่งข้อมูล1)#บันทึกบัฟเฟอร์ไว้ในตัวเอนจิ้น
แหล่งข้อมูล2 = หน่วยประมวลผล.สร้างอาเรย์แบบสุ่มค่า() # สำหรับค่า y ในพิกัด(x,y)
หน่วยประมวลผล.ตั้งค่าบัฟเฟอร์(1,แหล่งข้อมูล2)

โปรแกรมบนจีพียู = """
//#//pragma OPENCL EXTENSION cl_khr_fp64 : enable
 __kernel void montePI (__global float* a, __global float* b, __global float* c, int iNumElements)
{
    // find position in global arrays
    int iGID = get_global_id(0);
    if (iGID >= iNumElements)
    {
        return;
    }
	float dist;
	dist = sqrt(pow(a[iGID], 2.0f) + pow(b[iGID], 2.0f));
	if (dist <= 1.0)
		c[iGID] = 1.0;
	else
		c[iGID] = 0.0;
}

"""

 อ่านต่อ...

จากตัวอย่างในการทำ Graphic Simulation คราวที่แล้ว เราพบว่าการที่ต้องมาไล่คำนวนและวาดเม็ดกระสุนใหม่หมดตั้งแต่แรก ในทุก ๆ เฟรมที่แสดงผล(Render)ออกมาจะเกิดปัญหาคอขวดขึ้น โดยภาระส่วนใหญ่จะไปตกอยู่ที่การคำนวนอย่างหนักของ CPU ทำให้โปรแกรมของเราทำงานช้าลงเรื่อย ๆ
มาคราวนี้เราจะแก้ป้ญหานี้โดยเรียกใช้การแคช ซึ่งจะเก็บรายละเอียดที่วาดเสร็จแล้วไว้ใน บ่อพักข้อมูล(Buffer) เพื่อเรียกใช้งานได้อย่างรวดเร็วทันทีทันใด โดยในตัวอย่างนี้เราจะทำการแคชทุก ๆ 350 เฟรม
ทำได้โดยการดัดแปลงโค้ดดังนี้

#คำสั่งโปรแกรมภาษาไทยธอน
กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
ระยะแคช = 350

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(ตน.x,ตน.y)
		glEnd()


 อ่านต่อ...

ตามที่สัญญาเอาไว้่ ลองมาดู Simulation ของการหาค่า PI ด้วย วิธีการแบบ Monte Carlo โดยเป็น Visual Simulation กันครับ
(โปรแกรมที่ใช้ในการทำ Simulation นี้ ต้องเป็น Thaithon version 1.09 ขึ้นไป ดาวน์โหลดได้ ที่นี่ https://peacedev.wordpress.com/download/ เลยครับ)

#คำสั่งโปรแกรมภาษาไทยธอน

กล่องของฉัน = วัตถุสองมิติ.กล่องสองมิติ(1,1)
กล่องของฉัน.โหมดการวาด = GL_LINE_LOOP
กล่องของฉัน.ใช้พื้นผิว = เท็จ
วงกลมของฉัน = วัตถุสองมิติ.วงกลมสองมิติ(1)
รายการกระสุน = []

คลาส กระสุน:
	นิยาม __เริ่ม__(ตน,x,y,เข้าเป้า):
		ตน.x = x
		ตน.y = y
		ตน.เข้าเป้า = เข้าเป้า

	นิยาม วาด(ตน):
		glBegin(GL_POINTS)
		ถ้า ตน.เข้าเป้า:
			glColor3f(1.0,0.2,0.2)
		นอกจากนั้น:
			glColor3f(0.2,1.0,0.2)
		glVertex2f(self.x,self.y)
		glEnd()

 อ่านต่อ...

ในคราวที่แล้วที่ผมได้กล่าวถึง สูตรเคลลี่ ซึ่งหลาย ๆ คนอาจเริ่มสงสัยกันบ้างแล้วเกี่ยวกับที่มาที่ไปของสูตร รวมถึงการประยุกต์ใช้ เพราะสูตรเคลลี่ ดูไม่ค่อยจะเหมือนสูตรที่จะเอามาใช้ในการลงทุนทั่ว ๆ ไปสักเท่าใดนัก

ที่จริงแล้วสูตรของเคลลี่หากจะให้พูดกันตรง ๆ แล้วคือ คิดขึ้นมาสำหรับใช้ bet กับการพนันนั่นแหละครับ ส่วนคนที่เอาไปทดลองจนโด่งดังขึ้นมาก็เอาไปทดลองกับ poker จนร่ำรวย
(แต่ผมไม่สนันสนุนการพนันนะครับ)

ที่ต่างกับตลาดหุ้นหรือการลงทุนทั่วไปก็คือ
1. การ bet ของเคลลี่ไม่ขึ้นกับเวลา ก็คือการ bet แต่ละครั้งสามารถวัดผลได้เกือบจะทันที ส่วนในตลาดจะมีเรื่องของจังหวะเวลาเข้ามาเกี่ยวข้องอยู่ตลอดเวลา ซึ่งถ้าเราต้องการตัดข้อจำกัดนี้ก็ทำได้โดยการกำหนดเวลาวัดผลตายตัว
เช่น 1วัน, 1 ไตรมาส,  1 ปี ฯลฯ
2. การ bet ในการพนัน ส่วนใหญ่สามารถหาค่าความน่าจะเป็นที่แม่่นยำได้อย่างตายตัว แต่ตลาดหุ้นมีปัจจัยแวดล้อมมากมายที่เข้ามาเกี่ยวข้อง ซึ่งอันนี้คงต้องบอกว่าเป็นศิลปะของแต่ละตัวบุคคล

อ่านต่อ…

หลังจากที่อมไว้นาน
ตอนนี้ผมได้ลองเพิ่มระบบการวาด กับ ระบบฟิสิกส์ 2 มิติ เข้าไปในThaithon ดูแล้วครับ

ThaiThonPhysics2d

Download ได้ที่นี่เลยครับ
https://peacedev.wordpress.com/download/

What’s new

– add read file
– add write file
– add database system
– add SynthLab Module for sound synthesis
– change look and feel

get it form Here