30 เมษายน 2553

Coordinate Transformation ใน OpenGL

Coordinate Transformation ใน OpenGL
ใน OpenGl มี Transformation 5 แบบคือ
Transformation
การใช้งาน
Viewing
ใช้เซ็ตตำแหน่งกล้องหรือตา
Modeling
ใช้กับตำแหน่งของวัตถุ
ModelView
อธิบายความสัมพันธ์ระหว่า View กับ Model
Projection
กำหนด Viewing Volume
Viewport
Scales ภาพบนก่อนฉายบนจอ

สามารถแสดงเป็นขั้นตอนดังนี้

Eye Coordinate คือ ไม่ใช่ Coordinateจริงๆ แต่เอาไว้อ้างอิงเพื่อสร้างภาพขึ้นมา โดยการเคลื่อนย้ายวัตถุแต่ละอย่างก็เช่นจะทำการหมุน ก็จะใช้ Eye Coordinate ตัวนี้แหละเป็นตัวอ้างอิง

ภาพการหมุน 45องศาโดยอ้างอิงจากeye coordinate

Viewing Transformation คือ Transformation แรกของ OpenGl ทำหน้าที่ย้ายจุดจาก Coordinate ที่ใช้อยู่ อ้างอิงกับแกนของ Eye Coordinate

Modeling Transformations ใช้สร้าง Model ทำการย่อขยาย เลื่อน หมุน

Projection Transformations ใช้สร้างภาพบนจอจาก Model หรือการแปลงจาก 3 มิติ ให้เหลือ 2 มิติ มีแบบ Orthographic และแบบ Perspective ซึ่งใน Thesis จะใช้แบบ Perspective เท่านั้น คือภาพจะใหญ่เมื่อใกล้ตา และจะเล็กเมื่ออยู่ไกลตา เราควบคุมเมตริซ์นี้โดยการกำหนด Viewing Volume

Viewport Transformations
ใช้ย่อขยายปรับ aspect ratio ของภาพ 2 มิติ ให้เหมาะสมกับขนาดของ Windows ที่แสดงผล จะmap ระหว่าง logical กับจอภาพที่เป็น Physical


เยี่ยมชมศูนย์ศึกษาการพัฒนาอ่าวคุ้งกระเบนอันเนื่องมาจากพระราชดำริจังหวัด จันทบุรี

เยี่ยมชมศูนย์ศึกษาการพัฒนาอ่าวคุ้งกระเบนอันเนื่องมาจากพระราชดำริจังหวัดจันทบุรี

ภาพอ่าวคุ้งกระเบนจาก google maps

สภาพชายหาดได้รับการอนุรักษ์ไว้อย่างดี สังเกตุได้จาก

ปูลมบริเวณชายหาดมีจำนวนมาก จับเล่นได้สบายๆ

เราได้เดินเที่ยวอควอเรี่ยม แม้จะไม่ใหญ่แต่ทางเจ้าหน้าที่บอกว่าพันธ์สัตว์น้ำที่จัดแสดงมีความหลากหลายมากกว่าที่บึงฉวากอีก

ปลาเยอะมากแต่ดันชอบหอยที่เกาะตู้ปลาอยู่

ปลากระเบนตัวนี้เป็นสีสันของงานเลยก็ว่าได้

การให้อาหารกระเบน ค่อนข้างยุ่งยากเพราะมันมีตาอยู่บ้านบน แต่ปลาอยู่ด้านล่าง เค้าเลยต้องเอามาป้อนให้ถึงที่อย่างนี้


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

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










29 เมษายน 2553

ลำดับการทำ Transformation ของ Vertex หรือจุด ที่เราสร้างขึ้นใน Op

ลำดับการทำ Transformation ของ Vertex หรือจุด ที่เราสร้างขึ้นใน OpenGL

ซึ่งในการ Set Matrix ในแต่ละขึ้นตอนมีคำสั่งที่เกี่ยวข้องดังนี้
glMatrixMode ใช้เปลี่ยนโหมดเมทริกซ์ทั้ง 4 Mode
glLoadIdentity หลังจากใช้ glMatrixMode สามารถรีเซ็ตค่าเมทริกซ์ให้เป็น Identity ซึ่งจะทำให้ไม่มีผลต่อ Vertex ในโหมดนั้นๆ

เมื่อใช้ 2 คำสั่งก่อนหน้าแล้ว เราสามารถกำหนดค่าในเมตริกซ์โดยใช้คำสั่ง
glLoadMatrix ใช้โหลดเมทริกซ์ที่เราคำนวณเองทั้งหมดลงไปได้เลย
glMultMatrix คูณเมตริซ์ที่ใช้อยู่กับเมตริกซ์ที่ให้ไป เหมาะกับการเอาไปใช้ในการแบ่งหลายๆ ขั้นตอน เช่นเอา Scale คูณ Rotate คูณ Translate ทำให้อ่านง่ายด้วย
 
นอกจากนี้ OpenGL ยังมีคำสั่งเฉพาะของแต่ละโหมด เพื่อปรับค่าเมตริกซ์ เพื่อให้เราไม่ต้องมาคิดคำนวณเอง

glViewport ปรับเมตริกซ์ในโหมด Viewport ปรับ aspect ratio เป็นส่วนใหญ่

glFrustum ปรับเมตริกซ์ในโหมด Perspective ใช้ปรับ Volumn การฉายภาพปรับแทนเลนส์ wide หรือ tele ได้

นอกจากนี้ยังใช้เมตริกซ์คล้าย stack เราสามารถ save Transformation Matrix ที่เราใช้งานอยู่ไว้ได้โดยการ Push เก็บไว้ใน Stack และ Pop Matrix ที่ไม่ใช้ออกไป
glPushMatrix ใช้ save ค่าเก็บไว้ใน matrix
glPopMatrix ใช้ ดึงค่า matrix ที่ save ไว้ก่อนหน้ากลับมาใช้



10 เมษายน 2553

แปลงไฟล์ Fasta ให้อยู่ในรูปแบบ Genbank

แปลงไฟล์ Fasta ให้อยู่ในรูปแบบ Genbank
เขียนโดยใช้ Python นะครับ

ก่อนจะนำไปรัน ให้แก้ตัวแปร 2 ตัวคือ
path คือ Directory ที่ไฟล์อยู่
filename คือ ชื่อไฟล์ ไม่ต้องใส่ .fa
path = "C:\Users\Naymin Suksen\Desktop\\"
filename = "chr15"
f = open(path + filename + ".fa", "r")
g = open(path + filename + ".txt", "w")
f.readline()
text = f.read(10)
count = 1
while text != "" :
    g.write(str(count))
    g.write('\t')
    for i in range(0,6):
        for i in range (0,10):
            text = f.read(1)
            while text == '\n':
                text = f.read(1)
            g.write(text)
        g.write(' ')
    g.write('\n')
    count += 60
    print "count: " + str(count)
f.close()
g.close()
print "Done!!!"



30 มีนาคม 2553

การออกแบบฉากโปรเจ็คเตอร์ในโครงการต้นส้ม

การออกแบบฉากโปรเจ็คเตอร์ในโครงการต้นส้ม

แบ่งออกเป็นฉาก และกระจกสะท้อน




อุปกรณ์ที่ใช้ทำฉาก

โปรไฟล์อลูมิเนียม ขนาด  20 x 20 mm ขนาดต่างๆดังนี้
PS2020-6 200 cm  2 ชิ้น
PS2020-6 170 cm  2 ชิ้น
PS2020-6 100 cm  2 ชิ้น
PS2020-6 เส้นในยาว28.28 cm เส้นนอกยาว 30.28 cm ปลายเฉียง 45 องศา 4 ชิ้น
PS2020-6 20 cm 2 ชิ้น

End CAP ACC-EC2020-6  6 ชิ้น


JE-AB 100X100-10  8 ชิัน



ตัวฐานรองน๊อต ตัวเมีย
JE-RN3(or 4)-6  40 ตัว

น็อต 40 ตัว



ตัว Bracket 135 องศา 6 ตัว




ขาตั้ง 4 ตัว




ฉากกระจก

โปรไฟล์อลูมิเนียม ขนาด  45X45 mm ขนาดต่างๆดังนี้
PS24545L-10  110 cm  4 ชิ้น
PS24545L-10  100 cm  6 ชิ้น
PS24545L-10  80 cm  2 ชิ้น
PS24545L-10 เส้นในยาว28.28 cm เส้นนอกยาว 30.28 cm ปลายเฉียง 45 องศา 4 ชิ้น


JE-AB4343-10 4 ตัว



End CAP ACC-EC4545-10  10 ชิ้น


ตัวฐานรองน๊อต ตัวเมีย
JE-RN3(or 4)-6  40 ตัว

น็อตตัวผู้ 40 ตัว



ขาตั้ง 4 ตัว


โครงการต้นส้ม Interacetive Wall

โครงการต้นส้ม Interacetive Wall

ประชุมเรื่องต้นส้มโดยวางองค์ประกอบที่สำคัญด้านการเขียน software ดังนี้


เราลองแบ่งการเขียนโปรแกรมออกเป็นคลาสและหน้าที่ของสมาชิกในทีมดังนี้


ปัจจุบันเราได้ทำการออกแบบขาตั้งฉากใหม่ขนาด 200 x 150 cm
สูงจากพื้น 20 cm
วาง Projectorr ขึ้นในมุม 45 องศา
วางกระจกห่่างจากฉาก 118 cm ทำมุม 112.5 องศาเทียบกับพื้น

เยี่ยมชมโรงงานประกอบรถยนต์โตโยต้า เก...

เยี่ยมชมโรงงานประกอบรถยนต์โตโยต้า  เกตุเวย์

โรงงานได้รับมาตรฐานต่างๆมากมาย เป็นเวอร์ชั่นใหม่ๆด้วย


ป้ายกำหนดการเยี่ยมชม

แต่งตัวเต็มยศ ความปลอดถัยเต็มร้อย

สมาชิกในการเดินทาง มีหลายคนไม่คุ้นหน้า เค้าเป็นน้องๆฝึกงานที่ FIBO นี้เองครับ

ในสายการผลิต 1 Unit ใช้เวลา 1:40 นาที มีการทำงานสองกะ คือกะเช้า กับกะกลางคืน
1 สายการผลิต ผลิตได้แตกต่างกัน 3 รุ่น คือ Camary Vios Yaris
ที่สำคัญอย่าลืมชี้นิ้วตามทางแยก

23 มีนาคม 2553

Robot Vision Version 2

Robot Vision Version 2
ในเวอร์ชันนี้เราได้ตรวจหาสี โดยใช้สีแบบRGB คือสีแดง เขียว และน้ำเงิน
โดยการอ่านค่าสี จาก Rubik แล้ว เก็บค่า RGB ไว้ 9 ช่อง ต่อหนึ่งสี
เพื่อป้องกันแสงที่ไม่เหมือนกัน แล้วจัดเก็บไว้ในไฟล์ xml ดังนี้


โดยมีทั้งหมด 6 ไฟล์ สำหรับ 6 สีดังนี้
clbRed.xml    
clbWhite.xml
clbGreen.xml
clbOrange.xml
clbYellow.xml
clbBlue.xml

ค้นหาสีด้วยหลักการ  Euclidean distance
โดย plot แกนของสีทั้งสามด้วยบนจุดใน3 มิติ (R, G, B)
แล้วคำนวนระยะห่างของสีจากสูตร

โดยเราจะหาระยะห่างที่น้อยที่สุด ระหว่างจุดที่รับเข้ามาใหม่ กับจุดที่ทราบสีอยู่แล้ว


เมื่อพบว่าจุดที่รับเข้ามาใหม่ใกล้กับจุดที่ทราบสีอยู่แล้วจุดใด ก็แสดงว่าจุดที่รับเข้ามาใหม่ควรมีสีเดียวกัน
แล้วแสดงสีที่ใกล้เคียงที่สุดลงบนภาพ






การหมุน Rubik ให้ Texture ด้านที่ต้อง...

การหมุน Rubik ให้ Texture ด้านที่ต้องการ อยู่ที่ด้าน Active Side A หรือ B โดยใช้การหมุนน้อยที่สุด
ซึ่งตำแหน่งเรานี้จะไม่มีการเปลี่ยนแปลง เมื่อเราคลี่ภาพออกมาใน 2 มิติจะได้ภาพดังนี้


E


D
A
B
C

F



เมื่อ Texture ที่เราต้องการไม่ได้อยู่ที่ด้าน Active Side เราต้องหมุน Rubik แสดงในตารางดังนี้

ด้านของแขนกล ที่มี Texture ที่ต้องการ
ขั้นตอนการหมุน
A
ไม่ต้องหมุน
-> Active Side: A
B
ไม่ต้องหมุน
-> Active Side: B
E
ถ้าแขนกล อยู่ด้าน A
RubikACw
-> Active Side: B

ถ้าแขนกลอยู่ด้าน B
RubikBCcw
-> Acitive Side: A
F
ถ้าแขนกล อยู่ด้าน A
RubikACcw
-> Active Side: B

ถ้าแขนกล อยู่ด้าน B
RubikBCw
-> Active Side: A
D
แขนกลต้องอยู่ด้าน A
RubikACw
RubikACw
-> Active Side: B
C
แขนกลต้องอยู่ด้าน B
RubikBCw
RubikBCw
-> Active Side: A


Texture Mapping เมื่อมีการหมุน Rubik

Texture Mapping เมื่อมีการหมุน Rubik

ตำแหน่งอ้างตั้งต้น ของ Rubik ระหว่างด้านซ้าย ตำแหน่ง Rubik ที่แขนกลสามารถทำงานได้ และขวาม ตำแหน่ง Texture ของ Rubik



E





T


D
A
B
C


L
F
R
B

F





D



ตำแหน่ง Rubik ที่แขนกล สามารถทำงานได้ คือด้าน A และ B ด้านอื่นๆมีไว้เพื่ออ้างอิง ใช้ตัวอักษร C D E F ตามลำดับ เมื่อมีการหมุน Rubik

Texture ของ Rubik แต่ละด้านมีความหมายดังนี้
T = Top ด้านบน
L = Left ด้านซ้าย
F = Front ด้านหน้า
R = Right ด้านขวา
B = Back ด้านหลัง
D = ด้านล่าง

เมื่อแขนกลหมุน Rubik ในท่าต่างๆตามรูปด้านล่าง
จะทำให้ Texture หมุนเทียบกับ ตำแหน่งแขนกลแสดงในตารางดังนี้

ท่าทาง
ตำแหน่งการหมุน Texture เทียบกับ ตำแหน่งแขนกล
rubikACw
D -> E -> B -> F
rubikACcw
D -> F -> B -> E
rubikBCw
A -> E -> C -> F
rubikBCcw
A -> F -> C -> E



ภาพรวมโปรแกรมฝั่ง High Level

ภาพรวมโปรแกรมฝั่ง High Level

ได้ทำการพัฒนาต่อยอดจาก โปรแกรมโอเพ่นซอร์สที่ชื่อว่า Rubik Cube ซึ่งมีจุดเด่นที่ GUI ทั้งแบบ 3 มิติ



และแบบ Texture



โดยนำมาปรับปรุงเพิ่มเติมดัง Class Diagram


โดยการสร้าง class CTCuvbeSlover เพื่อทำการเพื่มในส่วนของ
  1. Texture Mapping ความสัมพันธ์ระหว่าง ด้านของ Rubik กับด้านของแขนกล
  2. Task Planning การหมุนและบิด Rubik ตั้งแต่เริ่มต้นจนเสร็จสิ้น
  3. Serial Port การติดต่อสื่อสารระหว่าง Low Level ผ่านทาง Port: COM1


และสร้าง class CTCubeWnd เพื่อทำการเพิ่มในส่วนของ
  1. Vision อ่านหน้าของ Rubik ทั้ง 6 ด้าน
  2. GUI เพิ่มปุ่มที่จำเป็นสำหรับส่งงานแขนกล

โปรแกรมที่ได้ทำการเพิ่มเติม


Joint Space Trajectory Generation จากจุด q0 ไปจุด q1 ด้วย Robotics Toolbox

Joint Space Trajectory Generation จากจุด q0 ไปจุด q1 ด้วย Robotics Toolbox
โดยใช้หลักการ ให้ ความเร็วต้นและความเร็วปลายเป็นศูนย์ เพื่อให้การเคลื่อนที่ Smooth จากจุด q0, ไปที่ จุด q1
  1. แขนกลแบบ RRR ที q0 มีตำแหน่งมุม 46 195 180 และ q1 มีตำแหน่งมุม 61 194 158
    q0 = deg2rad([46 195 180])
    q1 = deg2rad([61 194 158])

  2. ใช้ step ในการหมุนทั้งหมด 10 step
    step =10
    t = [1:1:step];
    j0t = rad2deg(jtraj(q0(1), q1(1), t))
    j1t = rad2deg(jtraj(q0(2), q1(2), t))
    j2t = rad2deg(jtraj(q0(3), q1(3), t))
    jt = round([j0t j1t j2t])

  3. จะได้ Trajectory ออกมาดังรูป






  4. ซึ่งการทำ Joint Space Trajectory Generation จะช่วยให้การเคลื่อนที่ของ RRR Robot เคลื่อนที่ได้ Smooth ไม่กระตุก

จำลอง Terminator Rubik' Cube Slover ด...

จำลอง Terminator Rubik' Cube Slover ด้วย Robotics Toolbox for Matlab
  1. สร้าง link ทั้งหมดของแขนกล ซึ่งประกอบด้วย 3 link คือ L1 L2 L3
    %% make Robot
    L1 = link([0 12.78 0 0 0],'standard');
    L2 = link([0 12.78 0 0 0],'standard');
    L3 = link([0 14.7 0 0 0],'standard');

  2.  นำ Link ทั้งสามเชื่อมต่อกันเป็นแขนกล
    rbArm = robot({L1 L2 L3});

  3. ตรวจสอบโดยการ Plot
    plot(rbArm, [0 0 0])

  4. ทดสอบ Drive Motor
    q = [0 0 pi/2];
    drivebot(rbArm, q)

  5. ทำ forward kenematic จำได้ Transformation Matrix มา 1 อัน
    T = fkine(rbArm,q)


  6. Robotics Toolbox สามารถหา invert kenematics ได้ แต่ที่ได้ทำการทดสอบจะเกิด Error ขึ้นซึ่งอาจมีสาเหตุมาจากการใช้งาน Matlab ไม่ตรงรุ่นกัน