Robotics 101 — SLAM คืออะไร ?

iTUTOR - Theppasith N.
iTUTOR
Published in
4 min readFeb 24, 2020
เขาวงกต สลับซับซ้อน หากเรามีแผนที่ และรู้ว่าเราอยู่ตรงไหนแล้ว ก็จะออกไปได้ไม่ยาก :)

เมื่อพูดถึงเรื่องของหุ่นยนต์ที่เดินไปเดินมาแบบ Autonomous เคยสงสัยไหมครับ
ว่ามันทำงานได้ยังไง มันเดินไปๆมาๆเองได้ยังไง ?
. . . . . และมันรู้ตัวเองว่ามันอยู่ที่ไหนได้ยังไง !!

เราจะเริ่มเกริ่นกันด้วยตัวอย่างทั่วๆไปกับคนก่อน
แล้วมาดูกันว่าหุ่นยนต์มันคิดยังไงทำยังไงต่อละกันครับ :)

แล้วตอนนี้ เราอยู่ที่ไหนล่ะ ? (Localization)

เวลาเราจะรู้ว่าตัวเราอยู่ที่ไหน จะต้องมีองค์ประกอบเบื้องต้นดังนี้

  1. Map of Environment— การจดจำสิ่งแวดล้อมรอบๆ
  2. Observation — การสังเกต สิ่งแวดล้อมรอบๆตัวเรา

โดยเริ่มต้นที่ Map คือสิ่งแวดล้อมรอบๆเรา

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

เรามีแผนที่ของบริเวณนั้นๆอยู่ เช่น แผนที่แถวๆ Siam Paragon และ Central World

ในกรณีนี้ เราจะพบว่า
Map of Environment = แผนที่ถนนของบริเวณนี้
Observation = การมองเห็นถนน เห็นตึกแล้วจำอ่านชื่อตึกออก

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

ผลลัพธ์ก็คือ เรารู้ว่า “เราอยู่ที่ไหน”
เทียบกับ “แผนที่, จุดยึด ของบริเวณนั้น”

อีกตัวอย่างนึง เช่น เรานั่งอยู่ในห้องโล่งๆที่มีประตู 1 บาน
จะทำยังไงดี ? ให้สามารถบอกตำแหน่งตัวเองในห้องนี้ได้อย่าง . . . ฟังรู้เรื่อง

ห้องโล่งๆ มีประตูกับหน้าต่างอยู่

เราก็จะต้องยึดตำแหน่งหนึ่งเป็นจุดหลักของแผนที่เราใช่ไหมฮะ ในที่นี้ อาจเป็นมุมห้อง หน้าต่าง หรือ ประตู ก็ได้

แล้วเราก็ใช้ การสังเกตของสายตาเรา ในการหาตำแหน่ง
เช่น “อยู่ในห้อง ตรงข้างประตูขวามือเลย”
หรือ “อยู่ในห้อง ตรงมุมที่อยู่ลึกที่สุด ถ้าเปิดประตูเข้าไป

จะพบว่า เราได้ Map = แผนที่ห้องโดยยึดประตูเป็นหลัก

และ Observation ก็คงจะเป็น การที่เรามองแล้วเจอของ
“เทียบตำแหน่งกับประตูบานนั้น”

เอ๋ . . แล้วยกตัวอย่างมาทำไมล่ะ !!! . . . .

ปัญหาที่เราพูดมาทั้งหมดนี้ เรียกว่า “Localization” ครับ
ใน Field ของ Robotics จะแปลเป็นไทยว่า “การระบุตำแหน่งของตัวเอง”

เป็นสิ่งที่หุ่นยนต์ใช้ในการเดินทางแบบอัตโนมัติ
แทบจะทั้งหมดทุกแบบที่เดินเองได้เลยนะ !

(เสริม : “Localization” คำๆนี้มีหลายความหมายนะครับ
อาจแปลว่า คำแปลของภาษานั้นๆ เช่น Localization of Thai language
ก็เป็นไปได้ ใน Field ของแต่ละเรื่องจะมีความหมายแตกต่างกันไป)

หุ่นยนต์รู้ว่าตัวเองอยู่ที่ไหนได้ยังไงล่ะ ? (Localization in Robot)

รูปจาก Textbook Introduction to Autonomous Mobile Robot — Siegwart

ถ้าเราเริ่มต้นจากการดูก่อน ว่าหุ่นยนต์ที่เราพูดถึง เป็นหุ่นยนต์ที่เกี่ยวกับอะไร และใช้ทำอะไร เพราะ หุ่นยนต์แต่ละตัวจะมีวิธีการหาตำแหน่งตัวเองที่ ทั้งคล้ายบ้าง และต่างกันบ้าง ตามประเภทการใช้งานครับ :)

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

เช่นหุ่นยนต์ Security Robot (SR1) ของทางบริษัทเรานั่นเอง !

ขายของนิดนึง

หุ่นยนต์ของเราจะใช้ 2D Lidar ระยะไกล ในการสังเกตดูสิ่งแวดล้อมรอบๆ

( ผลลัพธ์ของ 2D Lidar จากตัวอย่างนี้ได้เลยครับ )

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

การที่หุ่นยนต์รู้ว่าอยู่ตรงไหนในห้าง True Digital Park เกิดจากการที่ LIDAR Scan ไปเจอบริเวณร้านต่างๆ

แสดงว่า แผนที่ของสิ่งแวดล้อมรอบๆหุ่นยนต์เป็นสิ่งที่สำคัญมากๆเลยสินะ

ใช่ครับ เป็นที่มาของบทความนี้เลยล่ะ ! lol

การทำแผนที่ (Mapping)

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

หลังจากได้ตำแหน่งเริ่มต้นแล้ว ก็เริ่มการหลักสังเกตรอบๆ เพื่อที่จะวัดไปหา
เช่น ต้นไม้ใหญ่ ภูเขา

หรือตัวอย่างทั่วๆไป เช่นแผนที่ทางหลวง หรือแผนที่ ภูมิประเทศ
ก็จะมีอุปกรณ์ในการเล็งวัดแนวต่างๆ หน้าตาแบบนี้ ในการรังวัดทำแผนที่

สิ่งนี้เรียกว่า Total Station เห็นวิศวกรสำรวจและโยธาหลายๆคนได้ใช้งานกันในการทำแผนที่บริเวณต่างๆ

ถ้าเราเริ่มรังวัดจากจุดที่เรารู้มาก่อน ว่าตรงนี้คือที่ไหน
เทียบกับ Latitude , Longitude ที่ 0.00 ของโลกใบนี้
หรือเทียบกับ หมุดหลักซักอันที่เป็นสากล
เราก็จะสามารถสร้างแผนที่รอบๆบริเวณของเราได้
และสามารถเอาไปต่อกับแผนที่ของคนที่อยู่รอบๆแถวๆนั้นให้เป็นแผนที่ใหญ่ขึ้นได้อีกด้วย

ตัวอย่างแผนที่ในสมัยก่อน ที่ทำกันแบบมีจุดหลักเป็นหมู่บ้าน , แคว้นตัวเองซึ่งยังไม่รู้ทิศทางที่แท้จริงบนโลก https://sites.google.com/site/sarawut560410058/prawati-phaenthi/prawati-phaenthi-lok

สมัยก่อนก็ใช้จุดเริ่มต้นเป็นหมู่บ้านนะ เลยได้แผนที่รอบๆหมู่บ้านมา แล้วก็เริ่มใหญ่ขึ้นเป็นแคว้น สะสมความรู้ต่อๆกันจากรุ่นสู่รุ่น
โดยไม่รู้หรอกว่า หมู่บ้านอยู่ Latitude , Longitude ไหนบนโลกทรงกลมใบนี้ ~

แผนที่เลยเป็นสิ่งจำเป็นสำหรับนักเดินทาง !
หุ่นยนต์ก็เป็นนักเดินทางนะ ! :|

ถ้าไปอยู่ในที่ที่เราไม่เคยไป แถมไม่คุ้นเคยด้วยจะทำแผนที่ยังไงดี ?

เหมือนตอนเวลาที่เราเมาๆ แล้วตื่นมาพบว่าเราไปโผล่ที่อื่น . . .

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

หลังจากนี้ถ้าเราเดินมั่วไปทางอื่น แล้วกลับมาเจอเซเว่น เราจะเริ่มขยายแผนที่ในหัวเราได้ละ ว่ามีอะไรรอบๆแถวๆนี้บ้าง

สิ่งๆนี้แหละ เรียกว่า Simultaneously Localization and Mapping
หรือตัวย่อก็คือ SLAM ! นั่นเอง

หลักการทำงานคร่าวๆเริ่มจาก

  1. สังเกตสิ่งรอบๆ ได้ Observation รอบๆ มา (มองไปรอบๆเจอเซเว่น)
  2. เริ่มสร้างแผนที่ จาก Observation นั้นๆ และถือว่า จุดนี้เป็น Initial position
    (เซเว่นโผล่เข้ามาในหัวเรา + เราเริ่มต้นที่หน้าเซเว่นเป็นจุดเริ่มต้น)
  3. ลองขยายความรู้แผนที่ด้วยการเดินไปทางอื่น (เช่น เดินไปทางขวา)
  4. สังเกตสิ่งรอบๆ ได้ Observation อันใหม่ ที่อาจพอมองเห็นอันเก่าบ้าง (เห็นบ้านคนด้านขวา และยังเห็นเซเว่นอยู่)
  5. จด Observation อันใหม่ลงไปในแผนที่ (วาดบ้านคนเพิ่มมาในหัวเรา)
  6. วนข้อ 3–5 ไปเรื่อยๆ โดยเรียก ข้อ 1–2 ว่าเป็นรอบเริ่มต้น (initial state)

ท้ายที่สุดเราก็จะได้แผนที่บริเวณนั้นๆออกมา ซึ่งก็ยังเพิ่มเติมได้เรื่อยๆ เทียบกับตำแหน่งเริ่มต้นที่เราสมมติไว้ตอนเริ่มต้น(ข้อ1–2)

ขั้นตอนที่เกิดขึ้นในหัวเราคร่าวๆ ตอนเวลาทำ SLAM — ใน Basic SLAM Algorithm มันจะเป็นประมาณนี้แล

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

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

เมื่อเดินกลับมาที่เดิมได้ จะชดเชยความเบี้ยว และ Correct แผนที่ให้เข้า Lock

SLAM จะมี Algorithm ในส่วนของการชดเชยความเบี้ยวที่เกิดขึ้น และ จดจำความเบี้ยวนั้นๆมาชดเชยกับจุดที่เคยไปมา เรียกว่า Loop Closure ซึ่งเป็นของดีที่จะทำให้เราทำแผนที่พร้อมระบุตำแหน่งได้ง่ายขึ้นอีกด้วย

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

เดินในเขาวงกต ก็ใช้ SLAM ในการสร้างแผนที่เขาวงกตได้นะ ! ถ้าเราจำจุดเริ่มและเลี้ยวอะไรมาได้บ้างอะ 5555

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

ไก่กับไข่ อะไรเกิดก่อนกัน ?

เมื่อพูดถึงปัญหา SLAM ที่ทำงานแบบ Localization and Mapping พร้อมๆกันแล้ว มันก็มักจะ เกิดปัญหาไก่กับไข่อะไรเกิดก่อนกัน ตามมาเสมอเลย เพราะว่า

  1. การที่เราจะรู้ตำแหน่งที่แม่นยำได้ เราจะต้องรู้ว่าเรามีสิ่งแวดล้อมที่หน้าตาเป็นยังไงในภาพรวม (นั่นก็คือ จะต้องมีแผนที่)
    จะได้กากบาทลงไปว่าเราอยู่ตรงนี้ในแผนที่
    — จะสร้างแผนที่ ต้องระบุตำแหน่งให้ได้ก่อน
  2. แต่การที่เราจะสร้างแผนที่ขึ้นมา
    เราจะต้องรู้ว่าเราอยู่ตรงไหน (ซึ่งก็คือการระบุตำแหน่ง)
    เพื่อที่จะจดสิ่งที่เรามองเห็น(เช่นผนัง) ณ ขณะนั้น ลงไปได้ว่าอยู่ตรงไหนของกระดาษไงล่ะ
    — จะระบุตำแหน่งให้ได้ ต้องมีแผนที่ก่อน
อะไรกันวะเนี่ย !!!

มันเลยมีความงงงวยเกิดขึ้นมาในการแก้ปัญหาตรงนี้
แต่เบื้องหลังแล้ว มันมีวิธีการคิดอยู่นะ แต่อาจลงลึกไป ไว้ค่อยมาเล่าเพิ่มเติมละกัน !

SLAM มันทำงานยังไงในหุ่นยนต์ล่ะ

หลังจากสาธยายน้ำๆ ยกตัวอย่างมานาน
ขอยกตัวอย่างการใช้หุ่นยนต์ติดล้อที่มี 2D LIDAR ต่อเลยนะครับผม

ตัวอย่าง SLAM : Cartographer ของทาง Google ที่รับข้อมูล LIDAR เข้าไปและสร้างแผนที่ไปพร้อมๆกัน
  1. เริ่มเรื่องด้วยการอ่านสิ่งแวดล้อมรอบๆก่อน
  2. หุ่นยนต์จะวาดแผนที่ Top view รอบๆตัวมัน
  3. หลังจากนั้นเราต้องขยับหุ่นยนต์ไปสำรวจบริเวณรอบๆ โดยพยายามให้เห็นสิ่งแวดล้อมคล้ายๆจุดเริ่มต้น ไปเรื่อยๆ
  4. หุ่นยนต์จะค่อยๆวาดแผนที่ด้วยสิ่งที่มันสังเกตเจอออกมาเรื่อยๆ

เจ๋งไปเลย ท้ายที่สุด หุ่นยนต์สามารถสร้างแผนที่ (Mapping) พร้อมกับ
รู้ตำแหน่งตัวเองไปด้วย (Localization)

และเราก็เอาแผนที่ที่ได้จากขั้นตอนนี้ ไปทำ Localization
(ที่กินพลังประมวลผลน้อยกว่า) เพื่อที่จะทำ Autonomous Navigation ต่อได้เลย เย้ !!!!!

สุดท้ายหุ่นยนต์มีแผนที่ก็จริง แต่มันยังไม่รู้หรอกว่าจริงๆอยู่ในส่วนที่มนุษย์เรียกว่าอะไร ?

บางที การที่หุ่นยนต์เริ่มทำแผนที่ไปในทิศทางต่างๆกัน มันก็ได้แผนที่อยู่หรอก แต่แผนที่นั้น ในความเข้าใจมนุษย์(Semantics) หรือ ความเข้าใจที่ตรงกันกับทุกๆคน มันไม่เหมือนในหุ่นยนต์นะสิ

ถ้าเราบอกว่าหุ่นยนต์เริ่มที่มุมซ้ายล่างเสมอ หุ่นยนต์ทั้ง 4 ตัวก็อยู่คนละที่กันแล้ว

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

เช่น เราบอกให้หุ่นยนต์ไปมุมขวา หุ่นยนต์ที่ใช้แผนที่แตกต่างกันทั้ง 4 แบบ
วิ่งไปคนละทางเลย 55555

ถ้าจะให้ใช้งานได้ หุ่นต้องรู้ว่าตัวเองอยู่ตรงไหน “ในโลกของคนสั่งงาน”

เราอาจช่วยมันเพิ่มเติม เช่น ไปทางทิศเหนือ แล้วใช้เข็มทิศมาช่วย อะไรทำนองนี้ แต่ก็ต้องเสีย Cost ในการสร้าง + ติดตั้งเข็มทิศในหุ่นยนต์นะ

แล้วต่อไป จะเป็นยังไงต่อ

ในความคิดเห็นส่วนตัวของผม การพัฒนาหุ่นยนต์ในศาสตร์ของ SLAM นี้ น่าจะไปในทางของการทำ Semantic Mapping และ Place Recognition เพิ่มเติมครับ

เพื่อให้หุ่นยนต์สามารถเอาแผนที่ที่ทำมาคร่าวๆ ไปบิดให้ตรงกับความเป็นจริง, Update แผนที่ใหม่
หรือ แม้กระทั่งบิดแผนที่ของมันเองที่เกิดขึ้นมาสดๆขณะนั้น ให้ตรงกับแผนที่ที่มนุษย์เข้าใจได้เช่น เอาแผนที่ไปเทียบกับพิมพ์เขียว (ที่ไม่มีการ Update ว่ามีอะไรเกิดขึ้นมาบ้าง)

ตัวอย่าง 4 แผนที่ด้านบน ถ้าหุ่นยนต์บิดแผนที่ให้หมุนตรงกันทุกๆตัวได้ เวลาสั่งงานก็จะเดินไปจุดเดียวกันได้ หรือ หาทิศเหนือให้มันก็ได้

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

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

นี่คือ หุ่นยนต์ SR1 ของ Obodroid Corporation ครับผม รายละเอียดเพิ่มเติม : http://www.obodroid.com

ขอบคุณที่อ่านจนจบครับผม ในบทความนี้ หากมีอะไรผิดพลาดหรืออยากเพิ่มเติมแก้ไขส่วนต่างๆ สามารถมาคุยกันได้เลยนะครับผม :)

ติวเตอร์ — เทพสิทธิ์ นิสิตสุขเจริญ
Robotics Software Engineer
Obodroid Corporation Co., Ltd

--

--

iTUTOR - Theppasith N.
iTUTOR
Editor for

A Robotics Software Engineer - Not a quick learner , but eager to learn. — http://www.itutor.name