คำตอบสั้น ๆ : 2
เซนเซอร์
เกี่ยวกับว่าการอ่านจากเซ็นเซอร์ทั้งหมดในโหนดเดียวหรือแยกกันคุณควรถามตัวเองคำถามนี้:
เซ็นเซอร์ไม่มีความหมายหากไม่มีเซนเซอร์อื่นหรือไม่?
คำถามนี้ถามว่าเซ็นเซอร์เชื่อมต่อกันแน่นหรือไม่ ตัวอย่างเช่นสมมติว่าคุณมีเซ็นเซอร์ที่ไวต่ออุณหภูมิ (และคุณจำเป็นต้องชดเชยเซ็นเซอร์) คุณเพิ่มเซ็นเซอร์อุณหภูมิเป็นหลักเพื่อแก้ไขค่าของเซ็นเซอร์อื่น ในสถานการณ์สมมตินี้มันสมเหตุสมผลที่จะอ่านค่าทั้งสองในเวลาเดียวกันเนื่องจากมีการผสานกันอย่างแน่นหนา อันที่จริงแล้วหากไม่มีการอ่านจากเซ็นเซอร์อุณหภูมิการอ่านจากเซ็นเซอร์ดั้งเดิมจะไม่มีประโยชน์
ในทางกลับกันหากเซ็นเซอร์มีประโยชน์เป็นเอกเทศโดยทั้งหมดหมายความว่าเก็บไว้ในโหนดแยกต่างหาก สิ่งนี้มีประโยชน์มากมาย:
- โหนดสามารถรันบนตัวประมวลผลแยกกัน
- โหนดสามารถนำมาใช้ซ้ำได้ในหุ่นยนต์ในอนาคต
- ความล้มเหลวในการสื่อสารกับหนึ่งโหนดไม่ทำให้ทั้งระบบล่ม
- การรีสตาร์ทการได้มาจากบอร์ดเซ็นเซอร์ผิดปกติสามารถทำได้แยกต่างหากจากบอร์ดอื่น
ในความเป็นจริงถ้าคุณต้องการผลประโยชน์ใด ๆ ข้างต้นคุณจะต้องไปกับโหนดที่แยกจากกันแม้ว่าเซ็นเซอร์จะต่อกันแน่น แต่ก็มักจะไม่เกิดขึ้น
actuators
นี่คืออุปมา
แอคทูเอเตอร์นั้นไม่มีความหมายหากไม่มีแอคทูเอเตอร์อื่น ๆ หรือไม่?
ตัวอย่างเช่นถ้าคุณกำลังออกแบบข้อมือด้วยเอ็นกล้ามเนื้อซึ่งแต่ละเอ็น (ด้วยเหตุผลใดก็ตาม) มอเตอร์สองตัวมีความรับผิดชอบในการทำงานพร้อมกันเพื่อย้ายข้อต่อในทิศทางเดียวหรือทิศทางอื่นจากนั้นให้พวกเขาทำหน้าที่ในโหนดเดียวกัน ความรู้สึกกว่าแยก
ในทางกลับกันหากแอคทูเอเตอร์มีความเป็นอิสระ (กรณีทั่วไป) มันมีเหตุผลที่จะมีหนึ่งโหนดสำหรับแต่ละแอคทูเอเตอร์ ในกรณีนั้นแต่ละคนสามารถใส่ในโหนดที่แตกต่างกัน นอกจากประโยชน์ที่แน่นอนเช่นเดียวกับเซ็นเซอร์แล้วยังมีประโยชน์เพิ่มเติมนี้:
- หากแอคชูเอเตอร์หยุดทำงาน (ไม่ว่าจะด้วยเหตุผลใดก็ตาม) แอคทูเอเตอร์อื่นยังคงทำงาน หากมีองศาอิสระซ้ำซ้อนพวกเขาก็สามารถชดเชยได้อย่างสมบูรณ์
สิ่งนี้มีความหมายเดียว หากคุณต้องการให้แอคทูเอเตอร์ทำงานอย่างกลมกลืนให้นำไปใช้ในโหนดเดียวกัน นี่ไม่ใช่เพียงเพราะความล้มเหลวในการสื่อสาร แต่เนื่องจากโหนดที่แตกต่างกันหมายถึงความล่าช้าที่แตกต่างกัน บนระบบกระจายแต่ละโหนดอยู่ในส่วนต่าง ๆ ของเครือข่ายและด้วยเหตุนี้ความแตกต่างในความล่าช้าในระบบรวมศูนย์ความล่าช้าที่แตกต่างกันเกิดขึ้นในการโหลด CPU สูงเนื่องจากโชคของแต่ละกระบวนการในการกำหนดเวลา
ควรมีตัวจัดการไหม
แม้ว่าคำตอบคือ "ขึ้นอยู่กับ" แต่ก็มีวิธีการทั่วไปที่มีข้อดีมากมาย ลองเปลี่ยนชื่อแล้วเรียกมันว่า "คอนโทรลเลอร์" วิธีการคือ "ใช่ควรมีตัวควบคุม"
ข้อดีของการมีตัวควบคุมอยู่ (ในหลาย ๆ ):
- การประมวลผลแบบแยกอิสระ: แต่ละโหนดรับผิดชอบสิ่งหนึ่งซึ่งหมายถึง:
- ความเรียบง่าย: ซึ่งหมายถึง
- การพัฒนาที่ง่ายขึ้น
- การดีบักง่ายขึ้น
- ข้อผิดพลาดน้อยลง
- โอกาสของความล้มเหลวน้อยลง
- ความสามารถในการนำมาใช้ใหม่: เนื่องจากคอนโทรลเลอร์เดียวกันสามารถใช้กับโหนดเซ็นเซอร์ต่าง ๆ ได้หากมีฟังก์ชั่นเดียวกัน (เช่นข้อความและรูปแบบบริการ)
- การดำเนินการบนฮาร์ดแวร์แยก: แต่ละโหนดสามารถเคลื่อนย้ายในเครือข่าย ตัวอย่างเช่นโหนดเซ็นเซอร์และแอคทูเอเตอร์อาจถูกย้ายไปยังไมโครคอนโทรลเลอร์เฉพาะ ( เช่นArduino (ไม่ใช่ที่ฉันแนะนำ)) และคอนโทรลเลอร์บนพีซี
- หลีกเลี่ยงความน่าเกลียดสุดขีด: หากเซ็นเซอร์ต้องการมีอิทธิพลโดยตรงต่อแอคทูเอเตอร์ผลที่ได้คือความยุ่งเหยิง สมมติว่าไม่มีคอนโทรลเลอร์ลองดูแต่ละกรณี:
- โหนดเซ็นเซอร์หนึ่ง: โดยทั่วไปหมายความว่าโหนดเซ็นเซอร์และคอนโทรลเลอร์ถูกรวมเข้าด้วยกันในโหนดเดียวกัน ไม่เลวเกินไป แต่ไม่จำเป็นมาก
- โหนดเซ็นเซอร์จำนวนมาก: นี่เป็นระเบียบ นี่หมายความว่าคอนโทรลเลอร์ถูกแจกจ่ายระหว่างโหนดเซ็นเซอร์ ดังนั้นโหนดเซ็นเซอร์ทั้งหมดจะต้องพูดคุยกันเพื่อให้แต่ละคนรู้วิธีควบคุมแอคทูเอเตอร์ที่เกี่ยวข้อง ลองนึกภาพความล้มเหลวในการสื่อสารหรือความล่าช้าหลายประเภทและคุณจะเห็นว่ามันยากแค่ไหน ระบุว่าสิ่งนี้ไม่จำเป็นอย่างที่สุดไม่มีเหตุผลที่จะทำมัน!
สิ่งเหล่านี้กล่าวว่ามีข้อเสียเช่นกัน การมีโหนดเพิ่มเติม (โหนดใด ๆ ไม่ใช่เฉพาะคอนโทรลเลอร์) หมายถึง:
- การสื่อสารที่สิ้นเปลืองมากขึ้น: ข้อมูลต้องย้ายไปอยู่ในรูปแบบมาตรฐาน (ต่อเนื่องและถูกจัดลำดับ) ผ่านเครือข่ายหรือหน่วยความจำที่ใช้ร่วมกันแกน ROS จะต้องมองพวกเขาและตัดสินใจว่าจะส่งใครไป ฯลฯ ในระยะสั้นทรัพยากรระบบบางอย่างสูญเปล่า ในการสื่อสาร หากโหนดทั้งหมดอยู่ในที่เดียวต้นทุนนั้นอาจเป็นศูนย์
- โอกาสที่จะเกิดความล้มเหลวสูงขึ้น: หากมีเหตุผลใดก็ตามที่ลิงก์ของเครือข่ายล่มหรือโหนดตายระบบจะล้มเหลว หากคุณยังไม่ได้เตรียมมันอาจทำให้ระบบทั้งหมดล้มเหลว ตอนนี้นี่เป็นสิ่งที่ดีโดยทั่วไปที่จะสูญเสียส่วนหนึ่งของระบบ แต่ไม่ใช่ทั้งหมด ( การสลายตัวที่สง่างาม ) แต่ก็มีแอปพลิเคชั่นที่ควรหลีกเลี่ยงให้มากที่สุด การตัดการสื่อสารและการวางโค้ดทั้งหมดในโหนดเดียวช่วยได้จริงกับความเสถียรของระบบ ข้อเสียคือแน่นอนว่าระบบทำงานได้ดีหรือตายทันที
- การกำหนดเวลาที่วุ่นวาย: แต่ละโหนดทำงานด้วยตนเอง เวลาที่ใช้ในการส่งข้อความถึงบุคคลอื่นนั้นไม่สามารถกำหนดได้ เว้นแต่ว่าโหนดของคุณจะประทับเวลาแต่ละข้อความ (เป็นหมายเหตุด้านข้าง: คุณต้องมีการซิงโครไนซ์นาฬิกาในระดับที่ดีซึ่ง ROS ไม่ได้ทำ) และเว้นแต่ว่าโหนดรับแต่ละโหนดจะใช้เวลาหน่วงเวลาในการพิจารณาและควบคุมตามลำดับ ด้วยตัวเอง) จากนั้นการมีหลายโหนดหมายถึงความไม่แน่นอนสูงเกี่ยวกับอายุของข้อมูล นี่เป็นหนึ่งในเหตุผล (ในจำนวนมาก) ที่หุ่นยนต์ส่วนใหญ่เคลื่อนที่ช้ามาก ลูปควบคุมของพวกเขาจะต้องช้าพอที่จะทำให้แน่ใจว่าข้อมูลทั้งหมดสอดคล้องกับช่วงเวลาปัจจุบัน ยิ่งหน่วงเวลามากเท่าไหร่ก็ยิ่งควบคุมการวนได้ช้าลงเท่านั้น
ในข้อเสียทั้งหมดข้างต้นการแก้ปัญหาคือการลดจำนวนโหนดโดยเฉพาะอย่างยิ่งกับโหนดเดียว เดี๋ยวก่อนนั่นไม่ได้ใช้ ROS อีกแล้ว! เผง
เพื่อสรุป:
- ใช้ ROS สำหรับระบบที่ไม่ใช่เรียลไทม์ซึ่งความล่าช้าอาจสูงขึ้นเป็นระยะ ๆ ในกรณีนี้คุณสามารถมีโหนด ROS ได้มากเท่าที่คุณต้องการ ในความเป็นจริงมันเป็นการปฏิบัติที่ดีมากที่จะให้แต่ละโหนด ROS ทำสิ่งเดียวและสิ่งเดียวเท่านั้น ด้วยวิธีนี้พวกเขากลายเป็นเรื่องง่ายมากและพวกเขาสามารถนำมาใช้ซ้ำได้อย่างมาก
- ในทางกลับกันสำหรับระบบเรียลไทม์โดยหลีกเลี่ยง ROS เพื่อให้มีorocosและเทคโนโลยีเช่นEtherCATและบ่อยกว่าไม่แก้ปัญหา Ad-hoc
เป็นคำสุดท้ายในทางปฏิบัติ ROS ไม่เป็นไร ไม่ดี แต่ก็ดี บ่อยครั้งที่ระบบไม่สำคัญและมีโอกาสเกิดความล้มเหลวน้อยมากทุก ๆ ครั้งที่เริ่มระบบใหม่ไม่ใช่เรื่องใหญ่ นี่คืออัลกอริทึมของนกกระจอกเทศ !