[ROS2]Part 1 — แล้วทำไมต้อง ROS2 ล่ะ?

iTUTOR - Theppasith N.
iTUTOR
Published in
4 min readOct 11, 2019

บทความนี้ เราไปอ่าน Design Document ของ ROS2 ที่ http://design.ros2.org มา แล้วอยากจะสรุปเก็บไว้ ให้ตัวเองมาอ่านนี่แหละ ถ้าเขียนผิด ช่วยเสริมได้เลยนะคับผม :)

แปลและใส่ไข่มาจาก Design Document ของ ROS2 ที่ เขียนโดย Brian Gerkey

ROS1 เริ่มต้นด้วยการเป็นตัวช่วยเขียน Software ของ หุ่นยนต์ PR2
(จาก Willow Garage) ที่พยายามผลักดันให้มีการเอา PR2 ไปใช้ใน Research and Development เยอะๆ

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

และไหนๆก็ลงแรงพัฒนา Software ของ PR2 มาอย่างดี (ซึ่งก็คือ ROS) จนทำให้ Software หลายๆอย่าง รวมไปถึง Code หลายๆอย่างในตัว PR2 สามารถ Reused ได้เยอะเลย

จึงมีแนวคิดว่า ROS มันน่าจะมีประโยชน์กับหุ่นยนต์ตัวอื่นๆบนโลกนี้ด้วย !

การพัฒนา ROS1 จึงทำเพื่อใช้กับ PR2 ที่เป็นหุ่นไม่จำกัดงบเลย

  1. เป็นหุ่นเต็มๆตัว มี Module ที่เกี่ยวกับการเคลื่อนไหว และ การรับรู้ที่จัดเต็ม
  2. คอมแรงๆ (ก็ไม่ได้จำกัดงบนิ) Xeon Server ไปเลยจ้า แรมยับๆ 32–64GB
  3. ไม่ได้สนใจเรื่อง Real Time operating system , real-time processing
    (เสริม)
    — - — การใช้ RTOS เป็นการทำให้ program ที่เขียน ใช้เวลา Run ใน CPU แบบไม่เบียดเบียน Process อื่นๆ ที่จำเป็นจะต้องใช้ CPU ในเวลานั้น หรือ พูดให้ง่ายกว่านั้น คือ ถ้าสั่งให้ทำอะไรจะต้องให้คำตอบภายในเวลาที่กำหนดไว้ (พยายามไม่แฮงค์และไม่พาคนอื่นแฮงค์ไปด้วย — อันนี้ตัวอย่างโง่ๆมากๆ)ความแย่ของ RTOS คือมันจะทำงาน Multi Task ได้แย่กว่า OS ธรรมดา (GPOS — General Purpose OS)จริงถ้าจะอธิบายลึกเรื่องนี้ต้องไปเปิดเป็น blog ใหม่แหะ จะมีเรื่องของ preemptive scheduling task ที่จะส่งไปทำที่ CPU และอีกมากมาย
    — — — — — — -
  4. สภาพ Network ที่ดี ก็คือถ้าไม่อยู่ในห้องวิจัย ก็ ใช้ Network แบบไม่มีคนมากวนอะ พูดง่ายๆ
  5. ตอนทำเค้าก็พยายาม จะไม่ไปยุ่งกับ Code ของเรามากเท่าไร (เช่น Arduino ต้องเขียนใน Setup() กับ Loop() เท่านั้นนะ เขียนแบบอื่นไม่ได้ แต่ ROS พยายามจะแยกตัวออกจากตรงนั้น ไม่ต้องมากำหนดกฏการเขียน Code)

ทำให้มันมีข้อจำกัดด้าน Performance ในการสั่งงานอยู่บ้างถ้าเอามาใช้กับเครื่องที่ Spec ไม่ได้เทพแบบ PR2

แต่ใครจะไปสนใจล่ะ มันเอาไว้ในงานวิจัยชิวๆ แบบไม่ค่อยหวังจะไปใช้จริงอยู่แล้วนิ 5555+

ไปๆมาๆคนดันใช้เยอะมาก และมี Community ที่กว้างใหญ่ขึ้น

เริ่มมีคนเอาROS1ไปใช้งานในตลาด Consumer และ Industrial มากขึ้นเยอะ (คืองัดมันออกมาจากห้องทดลอง แล้วเอาไปทำของขาย) และความคาดหวังของคนใน Community ก็มีมากขึ้นเหมือนกัน (ในบทความที่แปลมามีพูดถึง NASA ที่อยากใช้ ROS กับหุ่นบนสถานีอวกาศด้วย ใครกันจะไม่อยากให้ระบบของตัวเองไปแล่นบนนั้นล่ะ นี่ไง เลยต้องทำของใหม่ที่ดีๆ5555+)

เพราะฉะนั้น ทีมคนคิด ก็เลยอยากทำ ROS2 ขึ้นมาใหม่ให้มันดีไปเลย

  • โดยอยากให้ ใช้งานหุ่นยนต์ได้พร้อมๆกันหลายตัว (เดิมที ROS1 เน้นคุมหุ่นยนต์ทีละตัว — ถ้านายกำลังจะใช้คุมหุ่นยนต์ทีละหลายๆตัวคือเราคิดว่านายกำลังใช้มันแบบ Hack ๆ อยู่นะ(…มั้ง) )
  • ใช้งานใน Embedded Platform ได้ เช่นพวก Board เล็กๆ น่าจะสามารถต่อเข้ากับ ระบบหลักได้ง่ายๆ (เดิมที ต้องใช้ ROS Header เอามา Serialize และแปลงให้ใช้กับ Hardware นั้นๆได้ เช่น Rosserial-Arduino , Rosserial-STM32 ไรงี้)
  • พยายามทำให้ระบบ เป็น Real Time System — พยายามทำให้คำสั่งต่างๆที่เราเขียน ตอบสนองได้ไวขึ้น พยายามไม่ค้าง สั่งตีก็ตีทันที สั่งทำก็ทำทันที
  • Non Ideal Network อันนี้เกี่ยวกับการติดต่อสื่อสารระหว่าง Node ต่างๆในระบบ โดยคุณภาพของช่องการติดต่อมันอาจทนความห่วยได้ เช่น ใช้คอม 2 เครื่องผ่านWifi (เช่น Notebook + Raspberry Pi บน Turtlebot3) แล้วต้องผ่าน Network ทำให้ภาพแลค สั่งการแล้วรอนานบน Wifi ห่วยๆ (คงโดน TCP Go back N สินะ) — พวกทีมที่ทำเลยพยายามจะมาแก้ไขตรงนี้
  • พยายามอยากให้ใช้ได้บน Production จริง เพราะ Code เดิมๆที่ทำกันนี้ ส่วนใหญ่จะเป็น Grade แบบ Research ไม่ได้มีการเน้นให้เอาไปใช้งานทนๆได้จริงๆแบบยาวๆเท่าไร
  • และก็มีพวกระบบ Building System , CI พวกนี้ที่เค้าอยากให้ Setup ง่ายๆ Maintain Configuration ของหุ่นยนต์ได้ง่ายๆ ให้เหมาะสมกับการเอาไปปล่อยใช้งานจริง

เทคโนโลยีใหม่ที่เกิดขึ้น ทำให้เรามีของเจ๋งๆมาใช้

ROS ทำกันมาตั้งแต่ปี 2007 และต้อง maintain core system เดิมๆมาตั้งแต่ตอนนั้น (ก็เพราะมันทำเสร็จแล้ว และก็ใช้งานได้ดีแล้วไง 5555 เลยไม่เปลี่ยน)

ซึ่งพวก Core System ก็ได้แก่ การส่ง Message หากัน , แปลง Message ให้พร้อมส่ง (Serialization , Deserialization) ,รู้ได้ไงว่าส่งไปที่ไหน ก็ต้อง ทำพวก Discovery ระหว่าง Process ต่างๆ

แต่ด้วยเวลาที่ผ่านไป ทำให้มีของเจ๋งๆเกี่ยวกับการรับส่งข้อมูลเกิดขึ้น เช่น

  • Protobuff (Protocol Buffer) ของ Google เป็นตัวช่วย Pack, Unpack ข้อความส่งกันที่เจ๋งมาก และทำให้ message เล็กมากๆ (เล็ก = ส่งไว = พลาดยาก)
คุ้นไม๊ คุ้นนป่าววว คล้ายๆ MSG ของ ROS1 เลยนิ แหม่แหม่แหม่
  • MQ (Message Queues) การจัดการกับลำดับของ Message ต่างๆ เช่น จะ Broadcast Message ไปให้ สาวๆในชั้นเรียนเท่านั้นนะ ห้ามให้ผู้ชายใน Class รู้ พวก MQ ก็สามารถตั้ง Rules ได้ > Example name : ZeroMQ, RabbitMQ (ใช้เยอะจัดเลยเวลาทำพวก web, socket)
อันนี้คือตัวอย่างของสิ่งที่เรียกว่า Fanout (การกระจาย Message) ของระบบ MQ ซึ่งรูปนี้อธิบาย Lib MQ ของ RabbitMQ คับ
  • MemCached อะไรบางอย่างที่เรียกใช้บ่อยๆก็เอามาเก็บไว้ใน RAM จะทำให้การทำงานทำได้ไวขึ้น ลดเวลา อ่าน Harddisk ไป พวกนี้ ชื่อที่เกี่ยวข้องก็คงจะหนีไม่พ้น REDIS
  • DDS (Data Distribution Service) อันนี้เป็นพระเอกของงานนี้เลย เป็นวิธีการส่งข้อมูลแบบนึง ที่ใช้หลักการ Publish-Subscribe

เอ๊ะ !!!!! Pub- Sub มันมีใน ROS1(2007) มาก่อนหนิ — เค้าพยายามจะทำเลียนแบบ DDS(2001) นี่แหละ

ซึ่งตอนนี้ Library ดีๆ ที่สามารถสร้าง DDS มันมีฟรี และ Open Source เต็มไปหมดเลยซึ่งนั่นจะทำให้เราสามารถสร้างของที่ “ดีกว่าเดิม” จากของที่มีอยู่ได้นี่นาา (เพราะไอ้ของที่จะเอามาใช้ มันก็มีคนใช้งาน+คนช่วยกันพัฒนาเรื่อยๆอยู่แล้ว เราเองไม่ต้องไปเหนื่อยสร้างตัวใหม่ตั้งแต่ Module เริ่มต้นแบบ ROS1 เลย)

แล้วมันจะมีอะไรเปลี่ยนไปบ้างอะ ? API Changes ?

คนเขียนบทความนี้ได้บอกไว้ทำนองว่า ไอ้ที่เกิด ROS2 มาใหม่ เพื่อที่จะทำให้คนใช้งานใช้ API ได้ง่ายขึ้นแหละ ถึงแม้ว่า Code ของ ROS1 จะสามารถทำให้ของเก่าๆในปี 2009 (10ปีที่แล้ว ตอนเราเขียนบทความนี้คือปี 2019) กลับมาใช้งานใน ROS1 Version ณ ตอนนี้ได้

แต่ ของที่สร้างมาตอนนั้น คิดแล้วเร๊อะ ว่ามันดีแล้ว — จากวิทยาการง่อยๆในสมัยนั้น มันอาจต้องทำออกมาแย่ๆแบบนั้น แล้วก็ใช้ๆกันมา ทั้งๆที่บางทีอาจมีวิธีการเขียนใหม่ๆเกิดขึ้นมาและดีกว่าก็ได้นิ

//me สรุปให้ — “เพราะฉะนั้น พวกกรูเลยจะทำใหม่ — อย่าหวังว่าจะใช้งานของเก่าได้ง่ายๆนะจ๊ะ บัยยย !”

แต่ถึงอย่างนั้นก็เถอะ Core Concept ของการ Pub/Sub , Services , Actions ก็ยังมีอยู่ ถ้ายังมีหัวคิด Concept แบบROS1 เดิมๆ อยู่ ส่วนตัวผมเองคิดว่า ไม่น่ายากหรอก ถ้าจะ สร้าง Node ROS2 ขึ้นมา
[ขายของ https://medium.com/itutor/ros-part-2-concept-of-modularity-1db4ae5006c2]

As a result, while the key concepts

(distributed processing, anonymous publish/subscribe messaging, RPC with feedback (i.e., actions), language neutrality, system introspectability, etc.)

will remain the same,
…..you should not expect ROS 2 to be API-compatible with existing ROS code….

แล้วทำไมไม่ทำ ROS 1 ต่อให้มันดีเทียบเท่าเทคโนโลยีปัจจุบันล่ะค้าบพี่น้อง ?

ROS 1 คนใช้งานกันเยอะมาก แล้วถ้าจะไปเปลี่ยนอะไรก็ตามที่คนใช้อยู่เยอะๆ เนี่ย มันค่อนข้างอันตรายมากๆ และ ไม่มีประโยชน์เพิ่มขึ้นเท่าไร ทีมที่ทำเลยอยากให้ ROS1 มันทำงานได้อย่างที่เป็นอยู่ปัจจุบันเนี่ยแหละ โดยที่การทำ ROS2 ไม่ทำให้การพัฒนา ROS1 ไขว้เขว 555555

ทีมงานเค้าทิ้งท้ายไว้ในบทความว่า — จริงๆ ROS1 ก็ยังคุยกับ ROS2 ได้นะ มันมี Bridge Node อยู่

สรุป

ทีมพัฒนาROS อยากทำ ROS2 ขึ้นมาใหม่เพราะ

มีเทคโนโลยีใหม่, มีLib ใหม่ๆ ที่มาเกี่ยวข้องกับ Core Transportation(ตัวรับตัวส่งข้อมูล) ระหว่าง Process + Network ทีดีขึ้น — มีตัว Pack Message ที่ย่อได้โหดขึ้น และ Open Source (งานอื่นที่ไม่ใช่ ROS ก็ใช้ — ทำให้มุงไม่ต้องเหนื่อยพัฒนาของเฉพาะ ROS คนเดียวแล้ว) นับว่าเป็นนิมิตใหม่ ถุ้ยย นิมิตหมายที่ดีของการเป็น Literally Robotics Frameworks (ที่ไม่ใช่ RPA และโดน Recruit บ่อยมาก) ที่ดีจากทีมที่เคยทำของที่ดีมาแล้ว :)

— —

… แล้วต้องย้ายไปใช้ไหม ?

ในแง่ของนักพัฒนาที่กำลังศึกษาของใหม่ๆ ผมว่าควรจะรู้ไว้ จะดีมากฮะ ส่วนคนที่ทำของขายอยู่ คิดว่าควรจะทำระบบในของเดิมให้เสร็จ และใช้งานได้แบบ Stable ไปก่อน เพราะว่าการย้ายมามันถือว่าเป็น Major Change เลยแหละ และ Package ของฟรีดีๆ (ผมรู้ คุณก็ใช้ 5555) เช่นพวก move_base , Amcl ก็ยังไม่ได้ port มาสมบูรณ์นัก เลยคิดว่าคนที่ทำงานใหญ่ๆมากับ ROS1 ควรจะอยู่ที่เดิมก่อนครับ เค้ายังคงมี Support ออกมาอย่างต่อเนื่องอยู่นะ รหัสยังเป็น Melodic อยู่ (และ Noetic กำลังจะออกเร็วๆนี้ด้วย)

ติว 10-Oct-2019

กดเข้ามาเหอะ ไม่กัดหรอก https://www.itutor.name

ปล. แล้วมาทำบทความสรุปทำไมล่ะ

จริงๆมันมีต้นเรื่องอยู่ คือเรากำลังจะได้ไป ROSCON2019 ที่มาเก๊าแหละ บริษัทใจดีมาก ที่ส่งเราไปกะ @saxoniaknight แล้วทีนี้เนื้อหาในงานมัน ROS2 เต็มไปหมดเลย แง - เลยต้องมาปรับตัวกันหน่อยนะคับ มีใครได้ไปงานนี้อีกก็มาทักทาย มาคุยกันได้นะ เพราะบัตรแพงเชี่ยๆเลยค้าบพี่น้องค้าบ

--

--

iTUTOR - Theppasith N.
iTUTOR
Editor for

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