ตัวอย่าง AI ง่ายๆโปรแกรมหุ่นยนต์อัตโนมัติงานแข่งขัน RMUTP Robocon 2017
จากการแข่งขันหุ่นยนต์ RMUTP Robocon 2017 ที่ผ่านมาเมื่อวันที่ 19-20 มกราคม 2560 ทีม iGenius Robot #49 ของเราได้ป้องกันแชมป์ได้สำเร็จถึงแม้ว่าหุ่นจะช้ากว่า แต่ด้วยการเขียนโปรแกรมที่ใส่วิธีการคิดให้หุ่นสามารถเปลี่ยนแปลงการทำงานตามสถานะการณ์ต่างๆ ได้จึงทำให้ได้เปรียบในการแข่งขันเพราะไม่ต้องขอ retry ออกมาเพื่อเปลี่ยนโปรแกรมในการทำงานในกรณีที่แท่นวางชิ้นงานไม่ว่าง หุ่นยนต์จะบันทึกข้อมูลและหาเส้นทางในการวางชิ้นงานใหม่เองและเป็นเส้นทางที่ใกล้ๆ ที่สุดเพื่อไปหยิบชิ้นงานชิ้นต่อไปด้วย นอกจากนี้หุนยนต์ยังสามารถรู้ได้ทันทีเมื่อในฝั่งของตัวเองวางชิ้นงานเรียงติดกัน 3 ชนิดเพื่อไปหยิบชิ้นบิงโกไปวางเพื่อจบเกมส์ได้เอง ระหว่างแข่งขันหุ่นยนต์คิดเองทั้งหมดจึงทำให้คู่ต่อสู้ยากที่จะดักทางได้ ต่างจากการเขียนโปรแกรมที่ใส่ขั้นตอนลงไปในหุ่นที่ทำให้เห็นการทำงานที่เป็นรูปแบบที่ผู้เขียนใส่ลงเองเพื่อให้หุ่นทำงานตามต้องการ ถือว่าเป็นจุดเริ่มต้นของการเขียนโปรแกรมหุ่นยนต์แบบ AI ที่อยากให้เพื่อนๆ ในวงการหุ่นยนต์เพื่อการศึกษาให้ความสนในมาเขียนโปรแกรมหุ่นยนต์อัตโนมัติแนวนี้กันบ้าง วันนี้จึงนำ Code ในส่วนที่เช็คว่า ฝั่งของตัวเองวางชิ้นงานเรียงติดกัน 3 ชนิดแล้วหรือยัง มาเป็นแนวทางเบื้องต้นให้ผู้สนใจครับ
รูปแบบการแข่งขัน
เพื่อความเข้าใจจึงขออธิบายรูปแบบการแข่งขันคร่าวๆ กันก่อนจากภาพสนามด้านล่าง แต่ละทีมจะมีหุ่นยนต์ 2 ตัวคือหุ่นบังคับมือและหุ่นอัตโนมัติ โดยที่หุ่นบังคับมือจะต้องหยิบชิ้นงานจากพื้นที่สีเหลืองมาวางบนพื้นที่สีแดงให้ตรงตามลักษณะคือ สามเหลี่ยม สี่เหลี่ยม และทรงกระบอก เพื่อให้หุ่นยนต์อัตโนมัติมารับชิ้นงานไปวางบนแท่นสีดำตรงกลางที่มีจำนวน 12 แท่น โดยทีมที่วางชิ้นงาน 3 แบบเรียงติดกัน 3 แท่นได้ จะมีสิทธิ์ที่จะไปหยิบชิ้นงานหกเหลี่ยมไปวางบนแท่นสีม่วงเพื่อทำบิงโกและจบเกมส์
รูปแบบการคิดของหุ่นยนต์อัตโนมัติ
หุ่นยนต์อัตโนมัติจะถูกโปรแกรมให้มองแท่นวางชิ้นงานสีดำเป็นตัวแปร array 1 มิติ
byte dropStatus[12]; โดยจะมีการแทนค่าต่างๆดังนี้
0 -- คือแท่นวางที่ว่าง
1 -- คือแท่นวางที่ถูกวางโดยฝั่งตรงข้าม
2 -- คือแท่นวางที่เราวางชิ้นงานสามเหลี่ยม
3 -- คือแท่นวางที่เราวางชิ้นงานสี่เหลี่ยม
4 -- คือแท่นวางที่เราวางชิ้นงานทรงกระบอก
ก็จะสามารถเขียนโปรแกรมให้อ่านค่าจากตัวแปรออกมาทีละ 3 ตัวแล้วนำมาบวกกัน ซึ่งถ้าหากผลรวมได้เท่ากับ 9 และไม่มีสมาชิกตัวใดซ้ำกัน และไม่มีสมาชิกตัวใดมีค่าเท่ากับ 0 หรือ 1 ก็จะเท่ากับว่ามีการวางชิ้นงานทั้ง 3 แบบเรียงกันได้ก็สั่งให้หุ่นยนต์ไปหยิบชิ้นงานหกเหลี่ยมมาทำบิงโกได้
ตัวอย่าง Code
boolean bingoChk(){
boolean foundBingo = false;
for (int readGroup = 0; readGroup <= 9; readGroup++){
int chkSum = 0;
boolean dataOK = false;
if ((dropStatus[readGroup] != dropStatus[readGroup]+1]) ||
(dropStatus[readGroup] != dropStatus[readGroup]+2]) ||
(dropStatus[readGroup+1] != dropStatus[readGroup]+2]))
{
for (int readValve = readGroup; readValve <= readGroup+2; readValve++){
if (dropStatus[readValve] == 0 || dropStatus[readValve] == 1){
break;
}
else {
chkSum = chkSum + dropStatus[readValve];
if (readValve == (readGroup+2)) dataOK = true;
}
}
if (chkSum == 9 && dataOK){
foundBingo = ture;
break;
}
}
}
return foundBingo;
}
เท่านี้ก็สามารถทำให้หุ่นยนต์อัตโนมัติสามารถรู้ได้เองว่าสามารถทำบิงโกได้ และไปหยิบชิ้ยงานหกเหลี่ยมไปทำบิงโกเองโดยอัตโนมัติ การสร้าง AI นั้นไม่ยากนี่เป็นอีกหนึ่งตัวอย่างแบบง่ายๆ ในการใส่วิธีคิดให้หุ่นยนต์ให้หุ่นยนต์คิดเอง แทนที่เราจะคอยคิดแทนหุ่นยต์แล้วไปสั่งหุ่นยนต์ จริงๆแล้วในหุ่นที่ใช้แข่งขันรายการนี้ยังมีอีกหลายส่วนที่ใช้การใส่วิธีคิดลงไปในหุ่นยนต์ที่ทำให้หุ่นยนต์สามารถแก้เกมส์ได้เองตลอดการแข่งขันแต่ต้องขอเก็บไว้เป็นความลับของทีม สุดท้ายนี้อยากให้เพื่อนๆ น้องๆ ที่สนใจด้านหุ่นยนต์ฝึกคิดและเขียนโปรแกรมหุ่นยนต์อัตโนมัติในแบบที่อัตโนมัติจริงๆ กันเพิ่มขึ้นเพื่อเป็นการพัฒนาวงการหุ่นยนต์ไทยต่อไป ไว้เจอกันใหม่บทความหน้าครับ
ความคิดเห็น
แสดงความคิดเห็น