ROS: แนวทางปฏิบัติที่ดีที่สุด


14

ฉันจะสร้างระบบหุ่นยนต์ขนาดเล็กและดูเหมือนว่า ROS ทำหน้าที่เป็นกรอบที่ดีในการควบคุมและเขียนโปรแกรมระบบ

อย่างไรก็ตามฉันสงสัยว่าวิธีใดที่ดีที่สุดในการจัดการส่วนประกอบของหุ่นยนต์

  • มันสมเหตุสมผลหรือไม่ที่จะวางเซ็นเซอร์ทั้งหมดไว้ในโหนดเดียว

  • ฉันควรใส่เซ็นเซอร์ประเภทเดียวกันในโหนดเดียวหรือดีกว่าที่จะมีหนึ่งโหนดสำหรับเซ็นเซอร์เดียวหรือไม่

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


  1. โหนดเซ็นเซอร์ที่หลอมรวมและโหนดแอคทูเอเตอร์พร้อมตัวจัดการ 1. โหนดเซ็นเซอร์หลอมรวมและโหนดแอคทูเอเตอร์พร้อมตัวจัดการ

  2. เซ็นเซอร์เดี่ยวและโหนดแอคทูเอเตอร์พร้อมตัวจัดการ ป้อนคำอธิบายรูปภาพที่นี่

  3. การสื่อสารโดยตรง ป้อนคำอธิบายรูปภาพที่นี่

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

คำตอบ:


15

คำตอบสั้น ๆ : 2


เซนเซอร์

เกี่ยวกับว่าการอ่านจากเซ็นเซอร์ทั้งหมดในโหนดเดียวหรือแยกกันคุณควรถามตัวเองคำถามนี้:

เซ็นเซอร์ไม่มีความหมายหากไม่มีเซนเซอร์อื่นหรือไม่?

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

ในทางกลับกันหากเซ็นเซอร์มีประโยชน์เป็นเอกเทศโดยทั้งหมดหมายความว่าเก็บไว้ในโหนดแยกต่างหาก สิ่งนี้มีประโยชน์มากมาย:

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

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

actuators

นี่คืออุปมา

แอคทูเอเตอร์นั้นไม่มีความหมายหากไม่มีแอคทูเอเตอร์อื่น ๆ หรือไม่?

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

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

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

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

ควรมีตัวจัดการไหม

แม้ว่าคำตอบคือ "ขึ้นอยู่กับ" แต่ก็มีวิธีการทั่วไปที่มีข้อดีมากมาย ลองเปลี่ยนชื่อแล้วเรียกมันว่า "คอนโทรลเลอร์" วิธีการคือ "ใช่ควรมีตัวควบคุม"

ข้อดีของการมีตัวควบคุมอยู่ (ในหลาย ๆ ):

  • การประมวลผลแบบแยกอิสระ: แต่ละโหนดรับผิดชอบสิ่งหนึ่งซึ่งหมายถึง:
    • ความเรียบง่าย: ซึ่งหมายถึง
      • การพัฒนาที่ง่ายขึ้น
      • การดีบักง่ายขึ้น
      • ข้อผิดพลาดน้อยลง
      • โอกาสของความล้มเหลวน้อยลง
    • ความสามารถในการนำมาใช้ใหม่: เนื่องจากคอนโทรลเลอร์เดียวกันสามารถใช้กับโหนดเซ็นเซอร์ต่าง ๆ ได้หากมีฟังก์ชั่นเดียวกัน (เช่นข้อความและรูปแบบบริการ)
  • การดำเนินการบนฮาร์ดแวร์แยก: แต่ละโหนดสามารถเคลื่อนย้ายในเครือข่าย ตัวอย่างเช่นโหนดเซ็นเซอร์และแอคทูเอเตอร์อาจถูกย้ายไปยังไมโครคอนโทรลเลอร์เฉพาะ ( เช่นArduino (ไม่ใช่ที่ฉันแนะนำ)) และคอนโทรลเลอร์บนพีซี
  • หลีกเลี่ยงความน่าเกลียดสุดขีด: หากเซ็นเซอร์ต้องการมีอิทธิพลโดยตรงต่อแอคทูเอเตอร์ผลที่ได้คือความยุ่งเหยิง สมมติว่าไม่มีคอนโทรลเลอร์ลองดูแต่ละกรณี:
    • โหนดเซ็นเซอร์หนึ่ง: โดยทั่วไปหมายความว่าโหนดเซ็นเซอร์และคอนโทรลเลอร์ถูกรวมเข้าด้วยกันในโหนดเดียวกัน ไม่เลวเกินไป แต่ไม่จำเป็นมาก
    • โหนดเซ็นเซอร์จำนวนมาก: นี่เป็นระเบียบ นี่หมายความว่าคอนโทรลเลอร์ถูกแจกจ่ายระหว่างโหนดเซ็นเซอร์ ดังนั้นโหนดเซ็นเซอร์ทั้งหมดจะต้องพูดคุยกันเพื่อให้แต่ละคนรู้วิธีควบคุมแอคทูเอเตอร์ที่เกี่ยวข้อง ลองนึกภาพความล้มเหลวในการสื่อสารหรือความล่าช้าหลายประเภทและคุณจะเห็นว่ามันยากแค่ไหน ระบุว่าสิ่งนี้ไม่จำเป็นอย่างที่สุดไม่มีเหตุผลที่จะทำมัน!

สิ่งเหล่านี้กล่าวว่ามีข้อเสียเช่นกัน การมีโหนดเพิ่มเติม (โหนดใด ๆ ไม่ใช่เฉพาะคอนโทรลเลอร์) หมายถึง:

  • การสื่อสารที่สิ้นเปลืองมากขึ้น: ข้อมูลต้องย้ายไปอยู่ในรูปแบบมาตรฐาน (ต่อเนื่องและถูกจัดลำดับ) ผ่านเครือข่ายหรือหน่วยความจำที่ใช้ร่วมกันแกน ROS จะต้องมองพวกเขาและตัดสินใจว่าจะส่งใครไป ฯลฯ ในระยะสั้นทรัพยากรระบบบางอย่างสูญเปล่า ในการสื่อสาร หากโหนดทั้งหมดอยู่ในที่เดียวต้นทุนนั้นอาจเป็นศูนย์
  • โอกาสที่จะเกิดความล้มเหลวสูงขึ้น: หากมีเหตุผลใดก็ตามที่ลิงก์ของเครือข่ายล่มหรือโหนดตายระบบจะล้มเหลว หากคุณยังไม่ได้เตรียมมันอาจทำให้ระบบทั้งหมดล้มเหลว ตอนนี้นี่เป็นสิ่งที่ดีโดยทั่วไปที่จะสูญเสียส่วนหนึ่งของระบบ แต่ไม่ใช่ทั้งหมด ( การสลายตัวที่สง่างาม ) แต่ก็มีแอปพลิเคชั่นที่ควรหลีกเลี่ยงให้มากที่สุด การตัดการสื่อสารและการวางโค้ดทั้งหมดในโหนดเดียวช่วยได้จริงกับความเสถียรของระบบ ข้อเสียคือแน่นอนว่าระบบทำงานได้ดีหรือตายทันที
  • การกำหนดเวลาที่วุ่นวาย: แต่ละโหนดทำงานด้วยตนเอง เวลาที่ใช้ในการส่งข้อความถึงบุคคลอื่นนั้นไม่สามารถกำหนดได้ เว้นแต่ว่าโหนดของคุณจะประทับเวลาแต่ละข้อความ (เป็นหมายเหตุด้านข้าง: คุณต้องมีการซิงโครไนซ์นาฬิกาในระดับที่ดีซึ่ง ROS ไม่ได้ทำ) และเว้นแต่ว่าโหนดรับแต่ละโหนดจะใช้เวลาหน่วงเวลาในการพิจารณาและควบคุมตามลำดับ ด้วยตัวเอง) จากนั้นการมีหลายโหนดหมายถึงความไม่แน่นอนสูงเกี่ยวกับอายุของข้อมูล นี่เป็นหนึ่งในเหตุผล (ในจำนวนมาก) ที่หุ่นยนต์ส่วนใหญ่เคลื่อนที่ช้ามาก ลูปควบคุมของพวกเขาจะต้องช้าพอที่จะทำให้แน่ใจว่าข้อมูลทั้งหมดสอดคล้องกับช่วงเวลาปัจจุบัน ยิ่งหน่วงเวลามากเท่าไหร่ก็ยิ่งควบคุมการวนได้ช้าลงเท่านั้น

ในข้อเสียทั้งหมดข้างต้นการแก้ปัญหาคือการลดจำนวนโหนดโดยเฉพาะอย่างยิ่งกับโหนดเดียว เดี๋ยวก่อนนั่นไม่ได้ใช้ ROS อีกแล้ว! เผง

เพื่อสรุป:

  • ใช้ ROS สำหรับระบบที่ไม่ใช่เรียลไทม์ซึ่งความล่าช้าอาจสูงขึ้นเป็นระยะ ๆ ในกรณีนี้คุณสามารถมีโหนด ROS ได้มากเท่าที่คุณต้องการ ในความเป็นจริงมันเป็นการปฏิบัติที่ดีมากที่จะให้แต่ละโหนด ROS ทำสิ่งเดียวและสิ่งเดียวเท่านั้น ด้วยวิธีนี้พวกเขากลายเป็นเรื่องง่ายมากและพวกเขาสามารถนำมาใช้ซ้ำได้อย่างมาก
  • ในทางกลับกันสำหรับระบบเรียลไทม์โดยหลีกเลี่ยง ROS เพื่อให้มีorocosและเทคโนโลยีเช่นEtherCATและบ่อยกว่าไม่แก้ปัญหา Ad-hoc

เป็นคำสุดท้ายในทางปฏิบัติ ROS ไม่เป็นไร ไม่ดี แต่ก็ดี บ่อยครั้งที่ระบบไม่สำคัญและมีโอกาสเกิดความล้มเหลวน้อยมากทุก ๆ ครั้งที่เริ่มระบบใหม่ไม่ใช่เรื่องใหญ่ นี่คืออัลกอริทึมของนกกระจอกเทศ !


1
ว้าวคำตอบที่ดีและมีรายละเอียดมาก! ขอบคุณมากสำหรับเวลาของคุณ ;)
manf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.