ฉันจะควบคุมระบบเรียลไทม์ที่รวดเร็ว (200Hz) ด้วยระบบที่ช้า (30Hz) ได้อย่างไร


12

ขณะนี้เรากำลังออกแบบแขนหุ่นยนต์มือถือ + ที่ติดตั้งพร้อมองศาอิสระมากมายและเซ็นเซอร์

ฉันกำลังพิจารณาสถาปัตยกรรมในสองส่วน:

  1. ชุดตัวควบคุมเรียลไทม์ (เช่น Raspeberry Pis ที่ใช้ RTOS เช่น Xenomai หรือไมโครคอนโทรลเลอร์โลหะเปลือย) เพื่อควบคุมมอเตอร์แขนและตัวเข้ารหัส ให้เราเรียกเครื่องเหล่านี้ RTx โดยมี x = 1,2,3 ... ขึ้นอยู่กับจำนวนของไมโครคอนโทรลเลอร์ ลูปควบคุมนี้จะทำงานที่ 200Hz

  2. เครื่องวานิลลาลินุกซ์ที่ทรงพลังใช้ ROS เพื่อคำนวณ SLAM, mocap และรันตรรกะระดับสูง (ตัดสินใจงานของหุ่นยนต์และคำนวณตำแหน่งและความเร็วของมอเตอร์ที่ต้องการ) ลูปควบคุมนี้จะทำงานที่ 30Hz

ฉันรู้ว่ากรอบงานของฉันต้องปรับขนาดได้เพื่อรองรับมอเตอร์มากขึ้นเซ็นเซอร์มากขึ้นพีซีมากขึ้น (เช่นสำหรับ mocap ภายนอก)

ปัญหาหลักของฉันคือการตัดสินใจว่าจะให้ RTx สื่อสารกับ PC1 แตกต่างกันอย่างไร ฉันได้ดูเอกสารที่เกี่ยวข้องกับสถาปัตยกรรมของหุ่นยนต์ (เช่นHRP2 ) บ่อยครั้งที่พวกเขาอธิบายสถาปัตยกรรมการควบคุมระดับสูง แต่ฉันยังไม่พบข้อมูลเกี่ยวกับวิธีการสื่อสารระดับต่ำกับระดับสูงและในวิธีที่ปรับขนาดได้ ฉันพลาดอะไรไปหรือเปล่า?

ในการเชื่อมต่อเครื่อง RT ที่รวดเร็วทำให้มั่นใจในการควบคุมมอเตอร์ด้วย PC1 ฉันได้พิจารณา TCP / IP, CAN และ UART:

  • TCP / IP: ไม่ได้กำหนดไว้ล่วงหน้า แต่ง่ายต่อการติดตั้ง ไม่ใช่ปัจจัยกำหนดเป็นปัญหาจริง (เพราะจะใช้เฉพาะที่ความเร็วต่ำ 30Hz ต่อไป)?
  • CAN: ช้าเชื่อถือได้มากตั้งเป้าไปที่รถยนต์ (เคยเห็นมีตัวอย่างบางส่วนที่ใช้ CAN กับหุ่นยนต์ แต่มันดูแปลกใหม่)
  • UART: ถ้าฉันมีเครื่อง RT เพียงตัวเดียวสำหรับการควบคุมมอเตอร์ฉันจะพิจารณา UART แต่ฉันเดาว่าพอร์ตนี้ไม่ค่อยมีขนาดที่ดีกับ RTx หลาย ๆ ตัว TCP / IP เป็นอะไรที่ไม่ไปเพราะคุณสมบัติที่ไม่ได้กำหนดหรือไม่ มันใช้งานง่ายมาก ...

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

ใครบ้างมีมุมมองที่ชัดเจนในประเด็นนี้หรือวรรณกรรมให้ชี้ไปที่? มีการใช้โซลูชันการสื่อสารทั่วไปหรือกระแสหลักในหุ่นยนต์หรือไม่?


1
หากคุณกำลังมองหาเครือข่ายเรียลไทม์คุณอาจต้องการให้EtherCATดู!
Shahbaz

1
ขณะที่มันยืนคำถามนี้ไม่น่าจะมีผู้เข้าชมความช่วยเหลือในอนาคตและอาจได้รับการปิดเป็นภาษาท้องถิ่นมากเกินไป แม้ว่าจะมีประโยชน์ที่จะมีพื้นหลังทั้งหมดในที่เดียวฉันขอแนะนำให้แบ่งคำถามเหล่านี้ออกเป็นชุดคำถามที่ตอบได้จริงและสามารถตอบได้ตามปัญหาจริงที่คุณเผชิญอยู่ ดูการถามความคิดเห็นหรือไม่? สำหรับพื้นหลังเพิ่มเติม
Mark Booth

คำตอบ:


8

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

ฉันได้ดูเอกสารเกี่ยวกับสถาปัตยกรรมของหุ่นยนต์ [... ] แต่ฉันยังไม่พบข้อมูลเกี่ยวกับวิธีการสื่อสารระดับต่ำกับระดับสูงและในวิธีที่ปรับขนาดได้ ฉันพลาดอะไรไปหรือเปล่า?

จากคำอธิบายของคุณดูเหมือนว่าคุณกำลังพยายามผูกตัวควบคุม RTx แต่ละตัวกับ PC1 โดยตรงซึ่งกำลังเรียกใช้ ROS สิ่งที่คุณพลาดคือ ROS ได้รับการออกแบบมาเพื่อจัดการกลุ่มแอปพลิเคชันที่อาจผลิตและใช้ข้อมูลในอัตราที่แตกต่างกัน

สิ่งที่แอปพลิเคชันของคุณต้องการคือสะพานสื่อสาร - เป็นอินเทอร์เฟซเดียวระหว่างลูป 200Hz และสภาพแวดล้อม ROS ของคุณ ในคำอื่น ๆ แทนการผูกแต่ละตัวควบคุม RTX เพื่อ PC1 ผูกตัวควบคุม RTX ร่วมกันและการเชื่อมต่อที่จะ PC1

ตัวอย่างเช่นใช้I2C Busเพื่อเชื่อมโยงระบบ RTx เข้าด้วยกันและเพิ่มตัวควบคุม RTx อื่นให้เป็น "Arm Master" (AM) งานของ AM คือการยอมรับคำสั่งที่เข้ามาในรูปแบบและโปรโตคอลที่เป็นมิตรกับ PC1 และแปลงคำสั่งเหล่านั้นเป็นข้อความ I2C จากนั้นคุณจะเขียนแอป ROS เพื่อส่งคำสั่งไปที่ AM

อีกวิธีหนึ่งในการทำกับ I2C คือการวางตัวควบคุม I2C โดยตรงบน PC1 และเขียนตรรกะการควบคุมแขนทั้งหมดในแอป ROS นี่อาจดูเหมือนเป็นวิธีที่มีความคล่องตัวมากขึ้นในการบรรลุเป้าหมายของคุณ แต่มันสามารถทำการดีบักได้ยากขึ้นเมื่อคุณลบส่วนย่อยของระบบ - คุณจะต้องแก้ไขปัญหาให้เป็นระบบที่ซับซ้อนขนาดใหญ่แทนที่จะเป็นสองส่วนที่ทดสอบได้ง่าย


ฉันชอบแนวคิดของสะพานสื่อสารนี้ ฉันจะดูที่ลิงค์ที่ส่งต่อ ขอบคุณมาก!
arennuit

5

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

ระบบควบคุมใด ๆ จำเป็นต้องมีการกำหนดระดับสูงซึ่งช่องสัญญาณแบนด์วิธสูง (เช่น Ethernet) มักจะไม่ดีที่ (โดยเฉพาะเมื่อใช้กับระบบปฏิบัติการทั่วไปที่แนะนำตัวกำหนดตารางเวลาจำนวนมากดูลิงค์ต่อไปนี้เพื่อดูการกำหนดเวลา ) ตัวประมวลผลแอปพลิเคชัน (เช่น ARM11 ของ Raspberry Pi) อาจเป็นแบบที่ไม่ดีสำหรับระบบเรียลไทม์ (เนื่องจากเอฟเฟกต์เช่นเวลาแฝงการขัดจังหวะและการซับซับคำสั่ง) ดูการอภิปรายต่อไป Digikey เปรียบเทียบพฤติกรรมในเวลาจริงของแกนแอพลิเคชัน ARM เทียบกับไมโครคอนโทรลเลอร์

เป็นเรื่องน่าเสียดายที่ความพร้อมใช้งานของ CAN ในตัวยังไม่แพร่หลายเท่า UART (RS-485) หรือ I2C (ยัง) เพราะฉันคิดว่ามันง่ายขึ้นที่จะทำให้การกระจายและการกระตุ้น และในขณะที่ความเร็ว 1 Mbps ปกติอาจช้ากว่าปกติหลังจากคำนวณอัตราการรีเฟรชของสมาชิกบัสทั้งหมดแล้ว (และอัตราการส่งข้อมูลสามารถเพิ่มได้ตลอดเวลาขึ้นอยู่กับความยาวบัสความต้านทานและตัวรับส่งสัญญาณของคุณจะอนุญาตหรือไม่) นอกจากนี้ยังมีซอฟต์แวร์การจำลองที่ยอดเยี่ยมที่สามารถรับประกันเวลาตอบสนองกรณีที่เลวร้ายที่สุดได้ (เช่น RealTime-at-work มี CAN บัสวิเคราะห์ฟรีที่เรียกว่า RTaW-Sim) และในที่สุดดูเหมือนว่าความพร้อมใช้งานของเซ็นเซอร์ MEMS พร้อม CAN ในตัวค่อนข้างแย่

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

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


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

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

ฉันเข้าใจแล้ว! ขอขอบคุณสำหรับรายละเอียดเพิ่มเติมในอีกหนึ่งปีต่อมา;)
2557

4

คุณดูเหมือนจะมีปัญหา 2 ข้อ (แต่เกี่ยวข้องกัน) ที่คุณพยายามแก้ไขในครั้งเดียว ลองแยกปริศนาของคุณออกเป็นชิ้นเล็ก ๆ :

  1. ฉันจะสื่อสารคำสั่งจากระบบที่ช้า (30Hz) ไปยังตัวควบคุมที่รวดเร็ว (200Hz) ได้อย่างไรและฉันจะสื่อสารข้อมูลที่ได้รับที่ 200Hz กลับไปที่ 30Hz ได้อย่างไร
  2. ฉันจะควบคุมสิ่งที่เกิดขึ้นที่ 200Hz ได้อย่างไรเมื่อฉันบอกหุ่นยนต์ว่าต้องทำอย่างไรที่ 30Hz เท่านั้น

รายการที่ 1 สามารถแก้ไขได้ในฮาร์ดแวร์เนื่องจากคำถามเดิมของคุณดูเหมือนจะชี้ไปที่คุณสามารถจัดคิวข้อมูลที่ 200Hz และส่งแพ็กเก็ตที่ 30Hz ไปยังระบบระดับที่สูงขึ้นของคุณ คุณสามารถทำได้ด้วย TCP / IP หรืออาจขึ้นอยู่กับจำนวนข้อมูลที่คุณต้องการส่ง ฮาร์ดแวร์ที่ต่างกันมีอัตราข้อมูลสูงสุดที่ต่างกัน การเพิ่มระดับสถาปัตยกรรมเช่น ROS เพื่อทำหน้าที่เป็นสะพานสื่อสาร / ผู้ตัดสินตามที่แนะนำในโพสต์อื่นอาจช่วยได้เช่นกัน

รายการที่ 2 เป็นปัญหาทฤษฎีการควบคุมที่ไม่สามารถแก้ไขได้ด้วยฮาร์ดแวร์เพียงอย่างเดียว การกำหนดตำแหน่งและความเร็วของ SLAM และการกำหนดภารกิจที่คุณต้องการจะต้องฉลาดกว่าเนื่องจากจะส่งและรับข้อมูลน้อยลง คุณอาจต้องการควบคุม 2 ลูป : 1 ที่ 200Hz และ 1 ที่ 30Hz

มีคำถามอื่น ๆ อีกมากมายที่ครอบคลุมฟีดไปข้างหน้าฟีดแบ็กและ PID แต่คุณถามเป็นพิเศษเกี่ยวกับความสามารถในการปรับขนาด - วิธีที่สเกลของระบบยักษ์ใหญ่ที่สุดคือการวางเลเยอร์ควบคุมและตรรกะเพื่อให้ข้อมูลที่จำเป็นน้อยที่สุด คุณจบลงด้วย ตัวอย่างเช่นตัวควบคุมระดับบนสุดของคุณอาจให้คะแนนตำแหน่งเป้าหมายและความเร็วเป้าหมายเฉลี่ยถึงระดับที่ต่ำกว่าหนึ่งไม่เปลี่ยนความเร็ว 30 ครั้งต่อวินาที

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