Gostai บริษัทหุ่นยนต์ผู้ท้าชนไมโครซอฟต์

ไปหน้าแรก | สารบัญ | Laploy.comระเบียนบทความ | บทความจากลาภลอย

Gostai บริษัทหุ่นยนต์ผู้ท้าชนไมโครซอฟต์

บริษัทเล็กๆ ที่เพิ่งก่อตั้งได้ปีเดียว มีพนักงานไม่ถึงสิบคน มีไม้ตายอะไรจึงกล้าท้าชนยักษ์ใหญ่?

บทความโดย : ลาภลอย วานิชอังกูร (laploy.com)  จากนิตยสาร WinMag ฉบับ 167

บิล เกสต์ เขียนบทความ “หุ่นยนต์ในทุกครัวเรือน” ตีพิมพ์ในวารสาร Scientific American ฉบับเดือนมกราคม ค.ศ. 2007 แสดงวิสัยทัศน์ว่าตลาดหุ่นยนต์เป็นสนามรบที่บริษัทต่างๆ จะช่วงชิงความเป็นใหญ่ในทศวรรษหน้า และพูดถึงงานที่ทีมงาน Microsoft Robotics Studio กำลังทำ คล้ายส่งสัญญาณให้รู้ว่าไมโครซอฟท์จริงจังกับตลาดซอฟท์แวร์หุ่นยนต์มากเพียงใด

 

หุ่นยนต์ที่ใช้งานได้จริงจังในปัจจุบันมีอยู่เพียงสองแห่ง แห่งแรกคือในโรงงานอุตสาหกรรม แห่งที่สองคือในยานอวกาศของวายร้ายที่มุ่งไปถล่มพวกเจไดในภาพยนตร์เรื่องสตาร์วอร์ส เราไม่มีหุ่นยนต์รับใช้ที่ทำงานได้สารพัดอย่าง R2-D2 หรือ C3-PO ส่วนหุ่นยนต์ “อซิโม” ของบริษัทฮอนด้า อาจดูใกล้เคียง แต่อันที่จริงต้องใช้มนุษย์บังคับเหมือนของเล่นบังคับด้วยวิทยุ ก่อนความฝันเรื่องหุ่นยนต์รับใช้จะกลายเป็นความจริงได้ เราต้องแก้ปัญหาเรื่องสติปัญญาของหุ่นยนต์ให้ได้เสียก่อน หุ่นยนต์รับใช้ในบ้านจำเป็นต้องมีสติปัญญาเหนือกว่าหุ่นอุตสาหกรรม เพราะงานอุตสาหกรรมเป็นงานซ้ำซาก ดำเนินเป็นจังหวะที่แน่นอน แต่งานจุกจิกในครัวเรือนต้องการหุ่นยนต์ที่มีเชาว์ดีกว่านั้น

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

บริษัทไมโครซอฟท์เข้าใจในสิ่งที่เกิดขึ้น จึงจัดตั้งหน่วยงานด้านซอฟท์แวร์หุ่นยนต์ นำทัพโดย Tandy Trower พนักงานระดับมันสมองที่ทำงานกับไมโครซอฟท์มาตั้งแต่ปี ค.ศ. 1981 เป้าหมายคือจัดระเบียบการพัฒนาซอฟท์แวร์หุ่นยนต์โดยการกำหนด platform มาตรฐานให้แก่นักสร้างซอฟท์แวร์หุ่นยนต์ โดยนำเสนอเครื่องมือชื่อ Microsoft Robotics Studio (MRS) ซึ่งทำงานร่วมกับเทคโนโลยี Windows, .NET Framework, และภาษาที่ใช้ CLR เช่น VB.NET และ C#

การใช้ MRS เพื่อพัฒนาหุ่นยนต์แม้จะสะดวกสบาย และมีมาตรฐานดีกว่าการเขียนโปรแกรมด้วยวิธีเดิมๆ แต่ดอกเตอร์หนุ่มชาวฝรั่งเศสคนหนึ่งบอกว่ายังยากเกินไปและไม่เปิดกว้างพอ เขามีวิธีที่ดีกว่านั้น เป็นวิธีที่จะเปลี่ยนแปลงโฉมหน้าของการพัฒนาซอฟท์แวร์หุ่นยนต์ไปโดยสิ้นเชิง

 

เขาชื่อชอง

ชายหนุ่มที่ว่าคือ Jean-Christophe Baillie เคยเป็นนักศึกษาที่สถาบันโพลีเทคนิค Ecole ได้รับปริญญาเอกจากมหาวิทยาลัยปารีส VI ในปีค.ศ. 2002 เคยทำงานวิจัยด้านการมองเห็นของหุ่นยนต์ที่สถาบันวิทยาการคอมพิวเตอร์ Sony ในกรุงปารีสช่วงระหว่าง ค.ศ. 2002 ถึง 2003 เข้ารับตำแหน่งผู้ช่วยศาสตราจารย์ในห้องทดลองด้านอิเลคโทรนิคและคอมพิวเตอร์ที่สถาบัน ENSTA ในปีค.ศ. 2003 หัวข้อที่ Baillie สนใจเป็นพิเศษคือ จิตใจ การเรียนรู้ และความสัมพันธ์ระหว่างการออกแบบกับสถาปัตยกรรม ปัจจุบัน Baillie ก่อตั้งบริษัท Gostai ซึ่งมีจุดมุ่งหมายเพื่อครองตลาด framework ของซอฟท์แวร์หุ่นยนต์

 

 

บริษัท Gostai

บริษัท Gostai เป็นบริษัทที่ทุ่มเทให้กับงานปัญญาประดิษฐ์เพื่อการสร้างหุ่นยนต์โดยเฉพาะ จุดมุ่งหมายหลักคือสร้าง platform อันเป็นมาตรฐานกลาง สำหรับผู้สร้างหุ่นยนต์เชิงพาณิชย์ สถาบันศึกษา และนักสมัครเล่น นอกจากนั้นยังทำซอฟท์แวร์ปัญญาประดิษฐ์สำหรับระบบงานที่ซับซ้อน เช่นงานควบคุมในอุตสาหกรรม ระบบบ้านอัจฉริยะ โดยมุ่งที่ระดับโครงสร้าง และต้องการให้ทำงานข้ามระบบปฏิบัติการได้

บริษัท Gostai เน้นสร้างภาษาเพื่อพัฒนาปัญญาประดิษฐ์ (ภาษา UBRI) ที่เชื่อมกับภาษาอื่นๆ ได้ เช่นภาษา C++, Java, Matlap และมีแผนที่จะพัฒนาไลบราลีของ UBRI เป็นภาษาอื่นๆ เช่น Java, Lips และ C# เพื่อให้ทำงานได้ในหลายๆ สภาพแวดล้อม

สินค้าของบริษัท Gostai มีดังนี้

  • URBI Pack for Robot Manufacturers : เป็นซอฟท์แวร์ engine สำหรับให้ผู้ผลิตหุ่นยนต์นำไปใช้กับหุ่นยนต์ที่จะผลิต
  • URBI for your robot : ซอฟท์แวร์ engine สำรับเจ้าของหุ่นยนต์ที่ต้องการเขียนโปรแกรมควบคุมหุ่นยนต์ของตนด้วยภาษา UBRI
  • Plug & Play Components : ชิ้นส่วนสำเร็จรูปที่นำไปประกอบเป็นซอฟท์แวร์สำหรับหุ่นยนต์ได้ อาทิ โปรแกรมจำได้หมายรู้ใบหน้า เสียง และโปรแกรมสังเคราะห์เสียงเป็นต้น
  • URBI Development Studio : เครื่องมือสำหรับผู้สร้างหุ่นยนต์เชิงพาณิชย์ สถาบันศึกษา และนักสมัครเล่น ช่วยให้พัฒนาพฤติกรรมของหุ่นยนต์ได้ง่าย มีการใช้งานเป็น graphic 
  • URBI Motion Editor : โปรแกรมสำหรับช่วยสร้างอากัปกริยาของหุ่นยนต์ที่ซับซ้อน เช่นการฟ้อนรำและกริยาท่าทางอื่นๆ 
  • URBI Remote Pro : ซอฟท์แวร์สำหรับสร้างการควบคุมจากระยะทางไกล

 

URBI Development Studio

บริษัท Gostai เป็นบริษัทที่เพิ่งก่อตั้งได้เพียงปีเดียว ตั้งอยู่ภายใน Ensta สถาบันวิศวกรรมและเทคโนโลยีชั้นสูงในกรุงปารีส เป็นศูนย์วิจัยด้านปัญญาประดิษฐ์ที่มีชื่อเสียงแห่งหนึ่งของประเทศฝรั่งเศส

 

ผู้กำหนดความประพฤติของหุ่นยนต์
Universal Real-time Behavior Interface หรือ URBI เป็นเทคโนโลยีหลักของบริษัท Gostai เป็น platform สำหรับการสร้างซอฟท์แวร์ในหุ่นยนต์ เทียบได้กับ .NET Framework เป็น platform สำหรับการสร้างซอฟท์แวร์ในระบบปฏิบัติการ Windows

URBI ถูกออกแบบให้ทำงานบนตัวหุ่นยนต์เพียงตัวเดียวก็ได้ หรือจะทำงานในสถาปัตยกรรม client/server โดยวิ่งโปรแกรมในคอมพิวเตอร์หลายๆ เครื่องที่ต่อเชื่อมกันเป็นเครือข่าย มีความอ่อนตัว ทำงานกับภาษา และระบบปฏิบัติการต่างๆ ได้หลายแบบ

 

ภาษาใน URBI
นอกจากจะเป็น platform แล้ว URBI ยังมีภาษาสคริปต์ที่เหมาะสำหรับใช้ในการเขียนโปรแกรมควบคุมหุ่นยนต์ด้วย ภาษา URBI จัดว่าเป็นนวัตกรรมเพราะมีคุณสมบัติใหม่ๆ ที่ไม่พบในภาษาทั่วไป

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

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

ความที่ URBI เป็นภาษาคู่ขนานอย่างแท้จริง คำสั่งควบคุมหุ่นยนต์บางอย่างที่เขียนด้วยภาษาทั่วไปได้ยาก หากใช้ภาษาสคริปต์ของ URBI จะทำได้ง่ายมาก

จุดเด่นของภาษา URBI มีดังนี้

  •  การประมวลผลแบบคู่ขนาน
  •  การจัดระยะเวลาของคำสั่ง
  •  การกำหนด Tag
  •  การใช้ทรัพยากรร่วมกัน
  •  การจัดการเหตุการณ์
  •  สถาปัตยกรรม UObject

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

การเขียนโปรแกรมให้ทำงานคู่ขนานใน URBI จึงทำได้ง่ายมาก ยกตัวอย่างเช่น คำสั่ง whenever และ at ที่จะทำงานเมื่อมีเหตุการณ์เกิดขึ้น แทนที่จะใส่เครื่องหมาย semicolon ในท้ายคำสั่ง เราสามารถใส่สัญลักษณ์ & แทนได้ หากเราเขียนคำสั่งว่า A&B จะหมายถึงสั่งให้หุ่นยนต์ทำงาน A และงาน B ไปพร้อมๆ กัน

 

โค้ดที่เห็นข้างบนคือคำสั่งให้หุ่นยนต์เครื่องไหวหัวไป-มา ตามตำแหน่งของลูกบอล เป็นตัวอย่างการทำงานคู่ขนานเพราะ headPan คือการเคลื่อนหัวในแนวนอน ขณะที่ heapTilt คือการเคลื่อนหัวในแนวตั้ง จะเห็นว่างานทั้งสองอย่างนี้เกิดขึ้นพร้อมๆ กัน และการเขียนโค้ดก็ทำได้ง่ายมาก เพียงแค่ใช้สัญลักษณ์ & เชื่อมคำสั่งสองบรรทัดคำสั่งเข้าด้วยกัน

ภาษา URBI จัดให้มีสัญลักษณ์หรือเครื่องหมาย (operator) สี่แบบเพื่อให้คั่นระหว่างประโยคคำสั่ง สัญลักษณ์เหล่านี้ทำหน้าที่เป็นเครื่องกำหนดว่าจะให้เกิดการทำงานแบบคู่ขนานในลักษณะใด เหมือน semicolon ทำหน้าที่คั่นระหว่างประโยคคำสั่งสองคำสั่ง ที่ทำงานตามลำดับก่อนหลังซึ่งกันและกัน แต่สัญลักษณ์ของ URBI อย่าง & ทำหน้าที่เชื่อมประโยคคำสั่งสองคำสั่งและกำหนดให้ทั้งสองคำสั่งเริ่มต้นและทำงานไปพร้อมๆ กัน โปรดพิจารณาแผนภูมิต่อไปนี้


จากแผนภูมิข้างบนจะเห็นว่าสัญลักษณ์ ; ทำหน้าที่เหมือนโปรแกรมภาษาซี คือกำหนดให้คำสั่ง A ทำงานก่อน เมื่อทำจบแล้วจะมีช่วงเว้นว่างเล็กน้อย จากนั้นคำสั่ง B จึงเริ่มทำงาน สัญลักษณ์ A|B หมายถึงคำสั่ง A ทำงานจบแล้วคำสั่ง B จะเริ่มต้นทันที สัญลักษณ์ , ทำหน้าที่ระบุว่าคำสั่ง A เริ่มทำงานก่อน เมื่อทำไปได้ครึ่งหนึ่ง คำสั่ง B จะเริ่มทำงาน และสุดท้าย สัญลักษณ์ & กำหนดให้คำสั่ง A และ B เริ่มทำงานพร้อมๆ กัน

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

ตัวอย่างเช่นคำสั่งต่อไปนี้ A และ B เริ่มทำงานพร้อมๆ กัน และ C จะเริ่มทันทีที่ A และ B ทำงานเสร็จ

(A & B) | C

 

ระยะเวลาของคำสั่ง

เราสามารถสั่งให้ตัวแปรใดๆ มีค่าตามต้องการได้ภายในช่วงเวลาหรือความเร็วที่กำหนด หรือจะให้เปลี่ยนแปลงกลับไปกลับมาก็ได้ โดยทั้งหมดสามารถดำเนินไปได้อย่างคู่ขนาน ในโค้ดตัวอย่างเป็นโปรแกรมหุ่นยนต์สุนัข บรรทัดแรกกำหนดให้ผงกหัวภายใน 450ms (1,000ms เท่ากับหนึ่งวินาที) ให้ขาอยู่ในตำแหน่ง -45 หน่วย ด้วยความเร็ว 7.5 หน่วย และแกว่งหางไปมาเป็นคลื่น (เป็น sine wave) 4 วินาที ความความแรงในการแกว่ง 45 หน่วย



ในภาษาคอมพิวเตอร์ทั่วไป (ในทางทฤษฏี) คำสั่งต่างๆ ถูกมองว่าไม่กินเวลาในการทำงานเลย คือเมื่อสั่งให้ทำแล้วก็ถือว่าสำเร็จเดี๋ยวนั้น แต่ในภาษา URBI เราสามารถกำหนดระยะเวลาทำงานของคำสั่งได้ซึ่งเป็นสิ่งจำเป็นในการทำงานแบบคู่ขนาน (เป็นสองหัวข้อที่มีความเชื่อมโยงกัน) ยกตัวอย่างเช่นใน URBI คำสั่งบางคำอาจใช้เวลาทำงานหนึ่งวินาที ภาษา URBI มีคำสั่งง่ายๆ ให้ตัวแปรเพิ่มค่าขึ้นไปจนถึงค่าที่กำหนดภายในระยะเวลาที่กำหนด หรือให้เพิ่มแล้วลดค่าซ้ำๆ การกำหนดค่าไม่ถูกมองว่าไม่กินเวลาในการทำงานอีกต่อไปและอาจทำงานไปพร้อมๆ กับงานอื่นๆ ก็ได้


neck.val = 10 time:450ms
& leg.val = -45 speed:7.5
& tail.val = 14 sin:4s ampli:45;


โค้ดที่เห็นข้างบน คำสั่ง time, speed, sin และ ampli เรียกว่า modifier เพราะพวกมันทำหน้าที่เปลี่ยนแปลงวิธีที่เรากำหนดค่าให้แก่ตัวแปร สมมุติว่าตอนแรกตัวแปร neck.val มีค่าเท่ากับสอง เมื่อสคริปต์บรรทัดแรกทำงานค่าของ neck.val จะเพิ่มขึ้นเรื่อยๆ จนถึง 10 ภายในเวลา 450ms

 

การกำหนด Tag
เราสามารถกำหนด tag หรือป้ายชื่อให้กับโค้ดส่วนใดๆ ก็ได้ เมื่อมี tag แล้วภายหลังเราสามารถสั่งให้โค้ดส่วนนั้นหยุดทำงาน หรือหยุดชั่วคราวแล้วกลับมาทำงานต่อก็ได้

ภาษา URBI สามารถวิ่งคำสั่งหลายร้อยหรือหลายพันคำสั่งพร้อมๆ กันได้ และสามารถสั่งให้คำสั่งเหล่านั้นหยุดการทำงานชั่วคราว หรือจบการทำงานไปเลยด้วยการใช้ tag หรือป้ายชื่อที่สามารถนำไปใส่ไว้หน้าบรรทัดคำสั่ง หรือกลุ่มของคำสั่งก็ได้ เมื่อใส่ tag แล้วโปรแกรมส่วนอื่นสามารถสั่งให้โปรแกรมใน tag หยุดการทำงานชั่วคราว หรือจบการทำงานไปเลยได้อย่างง่ายดาย ซึ่งเป็นวิธีที่มีประสิทธิภาพดีในการควบคุมงานที่วิ่งอยู่พร้อมๆ กันจำนวนมาก


mytag: { some code };
stop mytag;
freeze mytag;
unfreeze mytag;


เราอาจนำ tag มาซ้อนกันเป็นลำดับชั้นได้ ซึ่งมีประโยชน์ในการแยกแยะงานออกเป็นหมวดหมู่ และช่วยในการบำรุงรักษาและดีบักโปรแกรม

 

การใช้ทรัพยากรร่วมกัน

ในภาษาอื่นๆ ตัวแปรหรือ object ตัวหนึ่งจะถูกเปลี่ยนแปลงจากหลายๆ thread พร้อมกันไม่ได้ ตามหลักการ mutex แต่ภาษา URBI ขยายแนวคิดนี้ออกไปโดยสร้างให้ตัวแปรทุกตัวมี property ชื่อ blend ทำหน้าที่กำหนดว่าหากตัวแปรถูกกำหนดค่าจาก thread หลาย thread พร้อมๆ กันจะเกิดอะไรขึ้น


x->blend = add;
x = 1 & x = 3;
// now x equals 4


ในตัวอย่างโค้ดข้างบน บรรทัดแรกเป็นการกำหนด property blend ของตัวแปร x ให้อยู่ในโหมด add (บวกหรือนำมารวมกัน) บรรทัดต่อมาเป็นงานสองงานที่เกิดขึ้นขนานกัน (คือสอง thread) แต่ละงานกำหนดค่าให้ตัวแปร x ทั้งคู่ ผลลัพธ์คือ x จะกลายเป็นสี่

เมื่อพูดถึงการทำงานคู่ขนานแล้ว จะต้องพูดถึงการใช้ทรัพยากรร่วมกันด้วย เพราะงานหลายๆ งานวิ่งอยู่อาจเรียกหา object หรือทรัพยากรตัวเดียวกันเมื่อใดก็ได้ ภาษาทั่วไปๆ เมื่อ thread ใดเรียกใช้ object มันจะกันไม่ให้ thread อื่นเข้าถึง object ได้จนกว่ามันจะทำงานเสร็จ (วิธีทำงานลักษณะนี้เรียกว่า mutex)

เนื่องจาก URBI เป็นภาษาคู่ขนานมันจึงรับรู้ว่ากำลังเกิดอะไรขึ้นขนานกันบ้าง เนื่องจากกลไกคู่ขนานถูกบูรณการไว้ในตัวภาษา เราจึงเขียนโปรแกรมได้ยืดหยุ่นกว่าการเขียนแบบ mutex ลองพิจารณาโค้ดต่อไปนี้


x = 1 & x = 3;


ตัวแปร x ถูกกำหนดค่าให้เป็นทั้ง 1 และ 3 ไปพร้อมๆ กันซึ่งเป็นสภาพการณ์ที่ขัดแย้งกัน แต่ตัวแปรในภาษา UBRI มีproperty ทำหน้าที่กำหนดวิธีตัดสินว่าความขัดแย้งนี้จะได้รับการแก้ไขอย่างไร หากเราเซต property blend ให้เป็น add ผลลัพธ์คือ x จะมีค่าเท่ากับสี่ หากเราเซต property blend ให้เป็น mix ผลลัพธ์คือ x จะมีค่าเท่ากับค่าเฉลี่ยของทั้งสองคำสั่ง และหากเราเซต property blend ให้เป็น queue ผลลัพธ์คือ x จะมีค่าเท่ากับ 1 ก่อนและเปลี่ยนเป็นสองในเวลาถัดมา (เหมือน mutex)

 

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

วิธีที่ที่งายที่สุดในทางปฏิบัติที่จะจัดการกับเหตุการณ์ด้วยภาษา URBI คือใช้คำสั่ง at คำสั่งนี้มีรูปแบบวิธีใช้เหมือนคำสั่ง if ในภาษาซี แปลกกันเพียงแค่คำสั่ง if ทำแล้วจบไป แต่คำสั่ง at เมื่อเริ่มแล้วจะไม่จบการทำงาน แต่จะเฝ้าตรวจสอบเงื่อนไขอยู่ในฉากหลังไปตลอด และจะทำงานอีกครั้งโดยอัตโนมัติเมื่อเงื่อนไขเป็นจริง


เครื่องมืออีกอย่างหนึ่งของ URBI ที่ช่วยให้เราจัดการเหตุการณ์ได้ง่ายคือคำสั่ง whenever ซึ่งคล้ายๆ คำสั่ง while ในภาษาซี คือจะวนซ้ำการทำงานไปเรื่อยตราบเท่าที่เงื่อนไขเป็นจริง แตกต่างกันเพียงแค่คำสั่ง whenever เมื่อทำงานจบแล้ว จะไม่สิ้นสุดการทำงาน แต่จะเฝ้าตรวจสอบเงื่อนไขอยู่ในฉากหลังไปตลอด และจะทำงานอีกครั้งโดยอัตโนมัติเมื่อเงื่อนไขเป็นจริง


 

ตัวอย่างโปรแกรม
ตัวอย่างโค้ดต่อไปนี้สาทิตการทำงานของคำสั่ง at

 

at (sensorFront.val < threshold && safemode)
{
robot.stop();
if (sensorR.val > min_dist)
robot.turn(right)
else
robot.turn(left);
};

 

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

คำสั่ง Emit

เราสามารถส่งสัญญาณด้วยการสร้าง event ขึ้นโดยการเขียนโค้ดกระตุ้นให้คำสั่ง at และ whenever ทำงานได้ (เพื่อการทดสอบ หรือสถานการณ์อื่นๆ) โดยใช้คำสั่ง emit คำสั่งนี้จะมีพารามิเตอร์หรือไม่ก็ได้

 

emit myevent;
at (myevent) do_something;

emit event_with_param(45,"hello");
at (event_with_param(45, x)) echo x;

 

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

เราสามารถกำหนดระยะเวลาให้คำสั่ง emit ได้เหมือนคำสั่งส่วนมากในภาษา URBI ยกตัวอย่างเช่นหากเราต้องการให้โปรแกรมส่ง event นานสองวินาทีเราสามารถเขียนคำสั่งแบบนี้ได้

 

Emit(2s) myevent;

สถาปัตยกรรม UObject

เราสามารถเขียน object ด้วยภาษา C++ แล้วนำ object นี้มาใช้งานในภาษา URBI ได้โดยตรง object แบบนี้เรียกว่า UObject เราอาจสั่งให้ UObject ทำงานโดยอิสระภายใต้ระบบปฏิบัติการ Windows, Linux หรือ Mac OSX ก็ได้ (การทำเช่นนี้เรียกว่า remote object) หรือจะให้ทำงานภายใน URBI ก็ได้ (เรียก plug-in) การสลับไปมาระหว่าง remote และ plug-in ทำได้ง่ายมาก เพราะไม่ต้องแก้ไขโปรแกรมเลย

ภาษา URBI เป็นภาษาแบบวัตถุวิธี (Object Oriented Language) โดยอาศัย prototype (คล้ายภาษาจาวาสคริปต์) เราอาจนิยาม object โดยใช้ภาษา URBI ล้วนๆ หรือจะนำคลาสที่เรานิยามไว้ด้วยภาษา C++ มาใช้ร่วมด้วยก็ได้ คลาสนี้จะถูกนำไปผนวกเข้ากับแกนหลักของ URBI ทำให้มีฐานะเท่ากับคลาสที่นิยามด้วยภาษา URBI เราอาจนำ UObject ออกจากแกนหลักของ URBI เพื่อนำไปวิ่งในคอมพิวเตอร์เครื่องอื่นๆ ที่เชื่อมต่อกันเป็นเครือข่าย แล้วใช้หมายเลข IP เป็นตัวอ้างอิงก็ได้

การสร้าง object ในภาษา URBI
การนิยามคลาสในภาษา URBI ใช้คำสั่ง class เหมือนภาษา C++ ดังนี้


class myclass
{
 var x;
 function init(var p);
 function f();
};


ในภาษา URBI เรียก constructor ว่า init การสร้าง object จากคลาสทำได้ง่าย มีรูปแบบคำสั่งเหมือนภาษา C++ ดังนี้


subclass = new myclass (42);

ในตัวอย่างโค้ดข้างบนเป็นการสร้างคลาสชื่อ subclass โดยให้ inherit จากคลาส myclass และ constructor ถูกเรียกให้ทำงานโดยอัตโนมัติ เราสามารถเปลี่ยน base class ของ subclass ขณะ runtime ได้โดยใช้คำสั่ง inherits ดังนี้


subclass inherits myotherclass;

เมื่อคำสั่งข้างบนทำงานคลาส subclass จะสามารถเข้าถึง attribute และ method ต่างๆ ของคลาส myotherclass ได้ทันที

ตัวอย่างการใช้งาน UObject
จุดสำคัญของ UObject คือเราอาจนำคลาสที่นิยามไว้ด้วยภาษา C++ มาใช้ใน URBI ได้โดยตรง สมมุตว่าเรานิยามคลาสด้วยภาษา C++ ชื่อ colormap แล้วต้องการนำมาใช้ใน URBI เราต้องประกาศให้คลาส colormap มี base class เป็นคลาส UObject ก่อนโดยใช้คำสั่งดังนี้


class colormap : public UObject
{
}


จากนั้นเราอาจแก้ไขดัดแปลงโค้ดด้วยการเพิ่มเติมหรือเปลี่ยนแปลงสมาชิกของคลาส เมื่อพอใจแล้วจึงคอมไพล์โปรแกรม จากนั้นเราต้องบรรจุคลาสนี้ให้เป็นส่วนหนึ่งของโค้ดแกนกลางโดยการลิงค์กับ engine ของ URBI หรือจะใช้วิธีนำเข้าอย่างมีพลวัตขณะโปรแกรมทำงานก็ได้ เมื่อลิงค์แล้วเราสามารถอ้างถึงคลาส colormap ได้เหมือนคลาสที่นิยามในภาษา URBI โปรดพิจารณาโค้ดต่อไปนี้

ball = new colormap (R,G,B);
at (ball.visible)
echo "I see the ball!"

เมื่อเทียบกับภาษา C++ แล้วการทำ OOP ในภาษา URBI ดูแปลกประหลาด เพราะเป็นการทำ OOP แบบ prototype โค้ดที่เห็นข้างบนบรรทัดแรกเป็นการนิยามคลาสลูกชื่อ ball (คือคลาส ball มี base class เป็น colormap) ในขณะเดียวกันก็สร้าง object ชื่อ ball ไปด้วย (ไม่เหมือนภาษา C++ ที่เราต้องนิยามคลาสก่อน แล้วจึงนำคลาสไปสร้าง instance เป็น object ภายหลังอีกที)

เป้าหมายคือปี 2013

หากท่านต้องการทดลองใช้ URBI เพื่อเขียนซอฟท์แวร์สร้างหุ่นยนต์เดี๋ยวนี้เลยก็ทำได้ ขั้นแรกต้องสั่งซื้อหุ่นยนต์สุนัข AIBO รุ่นล่าสุดมาก่อน จากนั้นไปดาวน์โหลด URBI SDK มาจากเว็บไซต์ http://www.urbiforge.com ติดตั้งโปรแกรม ไว้ในเครื่องคอมพิวเตอร์ของเราและใน memory stick ของ AIBO ด้วย เพียงเท่านี้ท่านก็พร้อมป้อนคำสั่ง URBI เพื่อทดสอบการทำงานได้แล้ว

บริษัทเล็กๆ อย่าง Gostai ที่กล้าท้าชนยักษ์อย่างไมโครซอฟท์ เปรียบได้กับบริษัท Apple computer ที่ท้าทายบริษัทยักษ์ใหญ่อย่าง IBM ในช่วงเริ่มต้นของอุตสาหกรรมคอมพิวเตอร์ส่วนบุคคล ใครจะประสบความสำเร็จ ใครจะล้มเหลวในการครอบงำมาตรฐานอุตสาหกรรมนี้เป็นเรื่องทำนายได้ยาก แต่ที่แน่นอนก็คือ ไม่ว่าใครจะชนะหรือแพ้ มาตรฐานที่เกิดขึ้นจะเป็นสิ่งเร่งให้ความเร็วการพัฒนาหุ่นยนต์ส่วนบุคคลเป็นไปอย่างทวีคูณ

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

Post a comment or leave a trackback: Trackback URL.

ความเห็น

  • Unknown  On กันยายน 16, 2008 at 10:55 am

    To the global wow gold the cheapest wow power leveling under the cheapest single-site! -10561595391705

  • Nattapon  On พฤศจิกายน 25, 2009 at 6:26 pm

    ไม่ทราบว่าประเทศไทยเรา มีสถาบันวิจัยแบบนี้หรือป่าวครับ น่าสนใจมาก

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s

%d bloggers like this: