Robotics 101 — SLAM คืออะไร ?
เมื่อพูดถึงเรื่องของหุ่นยนต์ที่เดินไปเดินมาแบบ Autonomous เคยสงสัยไหมครับ
ว่ามันทำงานได้ยังไง มันเดินไปๆมาๆเองได้ยังไง ?
. . . . . และมันรู้ตัวเองว่ามันอยู่ที่ไหนได้ยังไง !!
เราจะเริ่มเกริ่นกันด้วยตัวอย่างทั่วๆไปกับคนก่อน
แล้วมาดูกันว่าหุ่นยนต์มันคิดยังไงทำยังไงต่อละกันครับ :)
แล้วตอนนี้ เราอยู่ที่ไหนล่ะ ? (Localization)
เวลาเราจะรู้ว่าตัวเราอยู่ที่ไหน จะต้องมีองค์ประกอบเบื้องต้นดังนี้
- Map of Environment— การจดจำสิ่งแวดล้อมรอบๆ
- Observation — การสังเกต สิ่งแวดล้อมรอบๆตัวเรา
โดยเริ่มต้นที่ Map คือสิ่งแวดล้อมรอบๆเรา
เช่น เวลาเราไปเที่ยว เรามักจะเปิดแผนที่ถนนดูเสมอ
โดยยึดจากเส้นทางหรือสิ่งปลูกสร้างทีเรามองเห็นข้างหน้า
ในกรณีนี้ เราจะพบว่า
Map of Environment = แผนที่ถนนของบริเวณนี้
Observation = การมองเห็นถนน เห็นตึกแล้วจำอ่านชื่อตึกออก
ผลลัพธ์ก็คือ เรารู้ว่า “เราอยู่ที่ไหน”
เทียบกับ “แผนที่, จุดยึด ของบริเวณนั้น”
อีกตัวอย่างนึง เช่น เรานั่งอยู่ในห้องโล่งๆที่มีประตู 1 บาน
จะทำยังไงดี ? ให้สามารถบอกตำแหน่งตัวเองในห้องนี้ได้อย่าง . . . ฟังรู้เรื่อง
เราก็จะต้องยึดตำแหน่งหนึ่งเป็นจุดหลักของแผนที่เราใช่ไหมฮะ ในที่นี้ อาจเป็นมุมห้อง หน้าต่าง หรือ ประตู ก็ได้
แล้วเราก็ใช้ การสังเกตของสายตาเรา ในการหาตำแหน่ง
เช่น “อยู่ในห้อง ตรงข้างประตูขวามือเลย”
หรือ “อยู่ในห้อง ตรงมุมที่อยู่ลึกที่สุด ถ้าเปิดประตูเข้าไป”
จะพบว่า เราได้ Map = แผนที่ห้องโดยยึดประตูเป็นหลัก
และ Observation ก็คงจะเป็น การที่เรามองแล้วเจอของ
“เทียบตำแหน่งกับประตูบานนั้น”
เอ๋ . . แล้วยกตัวอย่างมาทำไมล่ะ !!! . . . .
ปัญหาที่เราพูดมาทั้งหมดนี้ เรียกว่า “Localization” ครับ
ใน Field ของ Robotics จะแปลเป็นไทยว่า “การระบุตำแหน่งของตัวเอง”
เป็นสิ่งที่หุ่นยนต์ใช้ในการเดินทางแบบอัตโนมัติ
แทบจะทั้งหมดทุกแบบที่เดินเองได้เลยนะ !
(เสริม : “Localization” คำๆนี้มีหลายความหมายนะครับ
อาจแปลว่า คำแปลของภาษานั้นๆ เช่น Localization of Thai language
ก็เป็นไปได้ ใน Field ของแต่ละเรื่องจะมีความหมายแตกต่างกันไป)
หุ่นยนต์รู้ว่าตัวเองอยู่ที่ไหนได้ยังไงล่ะ ? (Localization in Robot)
ถ้าเราเริ่มต้นจากการดูก่อน ว่าหุ่นยนต์ที่เราพูดถึง เป็นหุ่นยนต์ที่เกี่ยวกับอะไร และใช้ทำอะไร เพราะ หุ่นยนต์แต่ละตัวจะมีวิธีการหาตำแหน่งตัวเองที่ ทั้งคล้ายบ้าง และต่างกันบ้าง ตามประเภทการใช้งานครับ :)
ในบทความนี้ ผมอยากจะยกตัวอย่างให้เห็นหุ่นยนต์ที่เคลื่อนที่บนผิวดินที่ราบเรียบ และใช้ สิ่งที่เรียกว่า LIDAR ในการมองเห็นพื้นที่ต่างๆ รอบๆตัวหุ่นยนต์ได้
เช่นหุ่นยนต์ Security Robot (SR1) ของทางบริษัทเรานั่นเอง !
หุ่นยนต์ของเราจะใช้ 2D Lidar ระยะไกล ในการสังเกตดูสิ่งแวดล้อมรอบๆ
( ผลลัพธ์ของ 2D Lidar จากตัวอย่างนี้ได้เลยครับ )
และจะใช้ การสังเกตจาก 2D Lidar นั้นมาเทียบกับแผนที่ที่เราให้ไป
เช่น เราให้แผนที่ของตึกกับหุ่นยนต์ไป
หุ่นยนต์จะใช้ 2D Lidar มองเห็นกำแพงและผนังต่างๆ
ซึ่งความสลับซับซ้อนของกำแพง จะทำให้หุ่นสามารถเทียบเส้นต่างๆในแผนที่
และหาว่าตัวเองอยู่ตรงไหนใน Map ได้ในที่สุดครับ
แสดงว่า แผนที่ของสิ่งแวดล้อมรอบๆหุ่นยนต์เป็นสิ่งที่สำคัญมากๆเลยสินะ
ใช่ครับ เป็นที่มาของบทความนี้เลยล่ะ ! lol
การทำแผนที่ (Mapping)
ในยุคของการเริ่มทำแผนที่ จะต้องมีจุดหลักที่เริ่มต้นในการทำแผนที่ซะก่อน และก็ค่อยๆทำแผนที่รอบๆจุดนั้น ด้วยการใช้อุปกรณ์ต่างๆ ไม่ว่าจะเป็นยุคเก่าที่ใช้ดาวเหนือในการทำแผนที่เดินเรือ ไปจนถึงปัจจุบันที่มีตัวช่วยระบุตำแหน่ง เช่น GPS ในการช่วยหาตำแหน่งคร่าวๆ
หลังจากได้ตำแหน่งเริ่มต้นแล้ว ก็เริ่มการหลักสังเกตรอบๆ เพื่อที่จะวัดไปหา
เช่น ต้นไม้ใหญ่ ภูเขา
หรือตัวอย่างทั่วๆไป เช่นแผนที่ทางหลวง หรือแผนที่ ภูมิประเทศ
ก็จะมีอุปกรณ์ในการเล็งวัดแนวต่างๆ หน้าตาแบบนี้ ในการรังวัดทำแผนที่
ถ้าเราเริ่มรังวัดจากจุดที่เรารู้มาก่อน ว่าตรงนี้คือที่ไหน
เทียบกับ Latitude , Longitude ที่ 0.00 ของโลกใบนี้
หรือเทียบกับ หมุดหลักซักอันที่เป็นสากล
เราก็จะสามารถสร้างแผนที่รอบๆบริเวณของเราได้
และสามารถเอาไปต่อกับแผนที่ของคนที่อยู่รอบๆแถวๆนั้นให้เป็นแผนที่ใหญ่ขึ้นได้อีกด้วย
สมัยก่อนก็ใช้จุดเริ่มต้นเป็นหมู่บ้านนะ เลยได้แผนที่รอบๆหมู่บ้านมา แล้วก็เริ่มใหญ่ขึ้นเป็นแคว้น สะสมความรู้ต่อๆกันจากรุ่นสู่รุ่น
โดยไม่รู้หรอกว่า หมู่บ้านอยู่ Latitude , Longitude ไหนบนโลกทรงกลมใบนี้ ~
แผนที่เลยเป็นสิ่งจำเป็นสำหรับนักเดินทาง !
หุ่นยนต์ก็เป็นนักเดินทางนะ ! :|
ถ้าไปอยู่ในที่ที่เราไม่เคยไป แถมไม่คุ้นเคยด้วยจะทำแผนที่ยังไงดี ?
เหมือนตอนเวลาที่เราเมาๆ แล้วตื่นมาพบว่าเราไปโผล่ที่อื่น . . .
สิ่งแรกที่เราทำได้คือสังเกตรอบๆ และ เริ่มสร้างแผนที่ขึ้นมาในหัวไปพร้อมๆกัน
แบบ Dynamically เลย ว่า อ๋อ!
นี่เราอยู่ริมถนนหน้าเซเว่น ที่มีบ้านคนอยู่ไกลๆด้านขวา อะไรทำนองนั้น
หลังจากนี้ถ้าเราเดินมั่วไปทางอื่น แล้วกลับมาเจอเซเว่น เราจะเริ่มขยายแผนที่ในหัวเราได้ละ ว่ามีอะไรรอบๆแถวๆนี้บ้าง
สิ่งๆนี้แหละ เรียกว่า Simultaneously Localization and Mapping
หรือตัวย่อก็คือ SLAM ! นั่นเอง
หลักการทำงานคร่าวๆเริ่มจาก
- สังเกตสิ่งรอบๆ ได้ Observation รอบๆ มา (มองไปรอบๆเจอเซเว่น)
- เริ่มสร้างแผนที่ จาก Observation นั้นๆ และถือว่า จุดนี้เป็น Initial position
(เซเว่นโผล่เข้ามาในหัวเรา + เราเริ่มต้นที่หน้าเซเว่นเป็นจุดเริ่มต้น) - ลองขยายความรู้แผนที่ด้วยการเดินไปทางอื่น (เช่น เดินไปทางขวา)
- สังเกตสิ่งรอบๆ ได้ Observation อันใหม่ ที่อาจพอมองเห็นอันเก่าบ้าง (เห็นบ้านคนด้านขวา และยังเห็นเซเว่นอยู่)
- จด Observation อันใหม่ลงไปในแผนที่ (วาดบ้านคนเพิ่มมาในหัวเรา)
- วนข้อ 3–5 ไปเรื่อยๆ โดยเรียก ข้อ 1–2 ว่าเป็นรอบเริ่มต้น (initial state)
ท้ายที่สุดเราก็จะได้แผนที่บริเวณนั้นๆออกมา ซึ่งก็ยังเพิ่มเติมได้เรื่อยๆ เทียบกับตำแหน่งเริ่มต้นที่เราสมมติไว้ตอนเริ่มต้น(ข้อ1–2)
โดยเมื่อพูดถึงความเป็นจริงในทางหุ่นยนต์แล้ว
การทำ Observation นั้น อาจไม่แม่นยำเสมอไป
เหมือนเราพยายามขีดเส้นตรงโดยไม่ใช้ไม้บรรทัดนั่นแหละครับ
การวัดของหุ่นยนต์ก็เช่นกัน
Observation มันอาจมีความคลาดเคลื่อนไปเรื่อยๆ
ในตัวอย่างเซเว่นที่ยกไป จริงๆแล้ว ถนน หรือ ขาเรา อาจไม่ได้เป็นเส้นตรง , เราเมา อาจเดินเบี้ยวไป ในหัวเราเราอาจเห็นทุกๆอย่างดูเป็นระเบียบ เช่นบ้านคนอยู่ด้านขวาเซเว่นเป๊ะๆ แต่จริงๆแล้วมันอาจเบี้ยวก็ได้ แล้วเมื่อเราสำรวจรอบๆไปเรื่อย ถนนที่เราจำได้ มันก็อาจไม่ตรงเป๊ะๆ ทำให้เราเข้าใจผิดว่าเมืองนี้เป็นสี่เหลี่ยม
SLAM จะมี Algorithm ในส่วนของการชดเชยความเบี้ยวที่เกิดขึ้น และ จดจำความเบี้ยวนั้นๆมาชดเชยกับจุดที่เคยไปมา เรียกว่า Loop Closure ซึ่งเป็นของดีที่จะทำให้เราทำแผนที่พร้อมระบุตำแหน่งได้ง่ายขึ้นอีกด้วย
SLAM เป็นสิ่งที่เราอยากให้หุ่นยนต์ทุกตัวสามารถทำได้เก่งๆ เพราะมันจะดูฉลาดและมีความใกล้เคียงกับมนุษย์มากๆ ในการจดจำสถานที่เพื่อเดินเองอัตโนมัติ
ด้วยเรื่องที่เราเล่ามาก่อนหน้าที่ ถ้าหุ่นยนต์ที่เราสร้างขึ้นมา เราจับไปปล่อยที่ไหนก็ตาม แล้วมันเริ่มทำงานได้เอง รู้ตำแหน่งตัวเองได้เองด้วยนี้ จะเก่งมากๆ
ไก่กับไข่ อะไรเกิดก่อนกัน ?
เมื่อพูดถึงปัญหา SLAM ที่ทำงานแบบ Localization and Mapping พร้อมๆกันแล้ว มันก็มักจะ เกิดปัญหาไก่กับไข่อะไรเกิดก่อนกัน ตามมาเสมอเลย เพราะว่า
- การที่เราจะรู้ตำแหน่งที่แม่นยำได้ เราจะต้องรู้ว่าเรามีสิ่งแวดล้อมที่หน้าตาเป็นยังไงในภาพรวม (นั่นก็คือ จะต้องมีแผนที่)
จะได้กากบาทลงไปว่าเราอยู่ตรงนี้ในแผนที่
— จะสร้างแผนที่ ต้องระบุตำแหน่งให้ได้ก่อน - แต่การที่เราจะสร้างแผนที่ขึ้นมา
เราจะต้องรู้ว่าเราอยู่ตรงไหน (ซึ่งก็คือการระบุตำแหน่ง)
เพื่อที่จะจดสิ่งที่เรามองเห็น(เช่นผนัง) ณ ขณะนั้น ลงไปได้ว่าอยู่ตรงไหนของกระดาษไงล่ะ
— จะระบุตำแหน่งให้ได้ ต้องมีแผนที่ก่อน
มันเลยมีความงงงวยเกิดขึ้นมาในการแก้ปัญหาตรงนี้
แต่เบื้องหลังแล้ว มันมีวิธีการคิดอยู่นะ แต่อาจลงลึกไป ไว้ค่อยมาเล่าเพิ่มเติมละกัน !
SLAM มันทำงานยังไงในหุ่นยนต์ล่ะ
หลังจากสาธยายน้ำๆ ยกตัวอย่างมานาน
ขอยกตัวอย่างการใช้หุ่นยนต์ติดล้อที่มี 2D LIDAR ต่อเลยนะครับผม
- เริ่มเรื่องด้วยการอ่านสิ่งแวดล้อมรอบๆก่อน
- หุ่นยนต์จะวาดแผนที่ Top view รอบๆตัวมัน
- หลังจากนั้นเราต้องขยับหุ่นยนต์ไปสำรวจบริเวณรอบๆ โดยพยายามให้เห็นสิ่งแวดล้อมคล้ายๆจุดเริ่มต้น ไปเรื่อยๆ
- หุ่นยนต์จะค่อยๆวาดแผนที่ด้วยสิ่งที่มันสังเกตเจอออกมาเรื่อยๆ
เจ๋งไปเลย ท้ายที่สุด หุ่นยนต์สามารถสร้างแผนที่ (Mapping) พร้อมกับ
รู้ตำแหน่งตัวเองไปด้วย (Localization)
และเราก็เอาแผนที่ที่ได้จากขั้นตอนนี้ ไปทำ Localization
(ที่กินพลังประมวลผลน้อยกว่า) เพื่อที่จะทำ Autonomous Navigation ต่อได้เลย เย้ !!!!!
สุดท้ายหุ่นยนต์มีแผนที่ก็จริง แต่มันยังไม่รู้หรอกว่าจริงๆอยู่ในส่วนที่มนุษย์เรียกว่าอะไร ?
บางที การที่หุ่นยนต์เริ่มทำแผนที่ไปในทิศทางต่างๆกัน มันก็ได้แผนที่อยู่หรอก แต่แผนที่นั้น ในความเข้าใจมนุษย์(Semantics) หรือ ความเข้าใจที่ตรงกันกับทุกๆคน มันไม่เหมือนในหุ่นยนต์นะสิ
แผนที่ข้างบนนี้ หุ่นยนต์เดินได้ก็จริง
แต่มันใช้งานยังไม่ได้ในงานที่มนุษย์จะเข้ามาเกี่ยวข้องด้วย
ไม่ว่าเราจะสั่งมันไปตรงไหนก็ตาม หุ่นยนต์ก็ยังไม่รู้หรอก
ว่าตำแหน่งที่คนพูดถึง มันคือตรงไหน !!
เช่น เราบอกให้หุ่นยนต์ไปมุมขวา หุ่นยนต์ที่ใช้แผนที่แตกต่างกันทั้ง 4 แบบ
วิ่งไปคนละทางเลย 55555
ถ้าจะให้ใช้งานได้ หุ่นต้องรู้ว่าตัวเองอยู่ตรงไหน “ในโลกของคนสั่งงาน”
เราอาจช่วยมันเพิ่มเติม เช่น ไปทางทิศเหนือ แล้วใช้เข็มทิศมาช่วย อะไรทำนองนี้ แต่ก็ต้องเสีย Cost ในการสร้าง + ติดตั้งเข็มทิศในหุ่นยนต์นะ
แล้วต่อไป จะเป็นยังไงต่อ
ในความคิดเห็นส่วนตัวของผม การพัฒนาหุ่นยนต์ในศาสตร์ของ SLAM นี้ น่าจะไปในทางของการทำ Semantic Mapping และ Place Recognition เพิ่มเติมครับ
เพื่อให้หุ่นยนต์สามารถเอาแผนที่ที่ทำมาคร่าวๆ ไปบิดให้ตรงกับความเป็นจริง, Update แผนที่ใหม่
หรือ แม้กระทั่งบิดแผนที่ของมันเองที่เกิดขึ้นมาสดๆขณะนั้น ให้ตรงกับแผนที่ที่มนุษย์เข้าใจได้เช่น เอาแผนที่ไปเทียบกับพิมพ์เขียว (ที่ไม่มีการ Update ว่ามีอะไรเกิดขึ้นมาบ้าง)
ตัวอย่าง 4 แผนที่ด้านบน ถ้าหุ่นยนต์บิดแผนที่ให้หมุนตรงกันทุกๆตัวได้ เวลาสั่งงานก็จะเดินไปจุดเดียวกันได้ หรือ หาทิศเหนือให้มันก็ได้
ทั้งหมดทั้งมวลนี้จะทำให้หุ่นยนต์พร้อมที่จะทำงานได้ตามคำสั่งและความเข้าใจที่ตรงกันกับมนุษย์เลย
เช่น เราบอกว่าให้หุ่นยนต์ไป KFC หุ่นยนต์ก็จะรู้ตัวเองว่า หุ่นยนต์อยู่แถวๆไหนเทียบกับแผนที่ที่คนเข้าใจได้ และไปวางแผนเดินไป KFC ตามแผนที่ได้เลย
ถ้าทำได้เช่นนั้นแล้ว หุ่นยนต์ก็จะกลายมาเป็นสิ่งที่มนุษย์สั่งงานได้อย่างง่ายดายยิ่งขึ้น ใกล้ชิดได้มากขึ้น และช่วยเหลือมนุษย์ได้ดียิ่งขึ้นต่อๆไปครับผม
ขอบคุณที่อ่านจนจบครับผม ในบทความนี้ หากมีอะไรผิดพลาดหรืออยากเพิ่มเติมแก้ไขส่วนต่างๆ สามารถมาคุยกันได้เลยนะครับผม :)
ติวเตอร์ — เทพสิทธิ์ นิสิตสุขเจริญ
Robotics Software Engineer
Obodroid Corporation Co., Ltd