Microcontroller / cpu สำหรับตรีโกณมิติแบบเร็วในหุ่นยนต์?


15

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

PIC, Arduino หรือ AVR ราคาถูกนั้นไม่เร็วพอที่จะคำนวณทุกอย่าง 100 / วินาทีและเก็บสิ่งต่าง ๆ เช่นความเฉื่อยและการหลีกเลี่ยงสิ่งกีดขวางในใจหรือแม้กระทั่งเส้นทางที่โหดเหี้ยม

  • แผนกคือนำสมองไปสู่หุ่นยนต์ ไม่ว่าจะเป็นไมโครโปรเซสเซอร์ไมโคร ITX เน็ตท็อปหรืออื่น ๆ ฮาร์ดแวร์ที่มีประสิทธิภาพในการทำตรีโกณมิติ / เมทริกซ์คณิตศาสตร์นั้นเร็วแค่ไหน?

    ฉันค้นหาออนไลน์และคาดว่าจะพบกับคอนโทรลเลอร์ไมโครคอนโทรลเลอร์ AVR, x86 หรือ ARM ซึ่งมีความเชี่ยวชาญในเรื่องนี้ แต่ก็ไม่มีโชค

  • Plan B มีการเชื่อมต่อเครื่อง x86 ผ่าน WiFi เพื่อทำการยกของหนัก ยอดเยี่ยมสำหรับการสร้างต้นแบบเช่นกัน แต่ฉันต้องการสิ่งนี้เพื่อย้ายไปวางแผนในที่สุดเมื่อฮาร์ดแวร์ย่อขนาด แต่ถึงอย่างนั้น CPU บนเดสก์ท็อปใดที่สามารถทำตรีโกณมิติได้เร็วที่สุด?

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

ฉันยังไม่ได้ตัดสินใจเกี่ยวกับภาษาและ / หรือห้องสมุดที่ใช้ แต่ชอบ Pascal และ C ++

(คำแนะนำสำหรับการต้อนรับแท็กที่เหมาะสมยิ่งขึ้นฉันใหม่ที่นี่)


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

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

2
นอกจากนี้คุณยังอาจพิจารณาขอให้ชนิดของคำถามนี้บนเว็บไซต์ของหุ่นยนต์ Stackexchange
Rocketmagnet

1
Plan B จะทำการคำนวณค่อนข้างเร็ว แต่การสื่อสารผ่าน WiFi จะทำให้ประสิทธิภาพลดลง คุณพิจารณาใช้โทรศัพท์ Android ที่เชื่อมต่อผ่าน usb หรือไม่? มันเป็นพลังการประมวลผลที่มากขึ้นโดยไม่ล่าช้า WiFi
stefan

1
บอร์ด STM32F4 พร้อมหน่วยจุดลอยตัวน่าจะเพียงพอสำหรับการสมัครของคุณ มันมี 128k SRAM กับ 64k CCM มันสามารถทำงานที่ 168MHz 32 บิตลอยคูณจุดใช้เวลาเพียง 1 รอบ CPU ..
richieqianle

คำตอบ:


16

ดูเหมือนว่าแอปพลิเคชันของคุณจะไม่ได้ใช้งานได้ทั้งหมด ตัวอย่างเช่น dsPIC สามารถดำเนินการคำสั่ง 400 k สำหรับการทำซ้ำแต่ละรายการของคุณ นั่นเป็นจำนวนมาก อย่างไรก็ตามจะมีประโยชน์ในการมีความสามารถ I / O ระดับต่ำเครื่องกำเนิด PWM ตัวจับเวลาและอื่น ๆ

ไซน์และโคไซน์ไม่ยากที่จะทำในเครื่องเลขจำนวนเต็มเช่น dsPIC ฉันทำไปสักพักแล้ว เคล็ดลับคือการเลือกตัวแทนที่ถูกต้องสำหรับมุม เรเดียนอาจดีจากมุมมองทางทฤษฎี แต่ไม่สะดวกในการคำนวณ Degress นั้นเป็นสิ่งประดิษฐ์และไร้สาระ ใช้ช่วงเต็มของจำนวนเต็มขนาดเครื่องของคุณเพื่อแสดงการหมุนหนึ่งครั้ง ตัวอย่างเช่นใน dsPIC ซึ่งเป็นตัวประมวลผล 16 บิตการหมุนหนึ่งครั้งเต็มคือ 65536 นับซึ่งเป็นวิธีที่แม่นยำและมีความละเอียดมากกว่าที่คุณต้องควบคุมหุ่นยนต์หรือคุณสามารถวัดได้

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

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

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


ฉันมักจะอยู่ภายใต้ความประทับใจว่า PIC จะต้องชะลอตัวลงแม้เพียงแค่จลนศาสตร์ผกผัน แต่ฉันอาจต้องพิจารณาอีกครั้ง เป็นไปได้ไหมที่จะทำจลนศาสตร์ผกผันเป็นเวลา 6legs ของ 3DOF อย่างน้อย 100 / วินาที? นั่นคือจลนศาสตร์ของ 6x3x100 ผกผันเพียงเพื่อให้ได้การเคลื่อนไหวของขาแบบสด อย่างไรก็ตามฉันต้องการจลนศาสตร์ผกผันเกิดขึ้นบนแพลตฟอร์มเดียวกับที่อัลกอริทึมทำงานดังนั้นฉันจึงไม่ต้องนำชิ้นส่วนเหล่านี้มาใช้ซ้ำสองครั้ง อัลกอริทึมจะมีความต้องการมากขึ้นและแน่นอนจะไม่สามารถเรียกใช้บนบอร์ด PIC หรือ Arduino-isch
Barry Staes

9

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

การออกแบบชิปทั่วไปสำหรับการใช้งานดังกล่าวคือ Cortex-M4 สิ่งนี้มาพร้อมกับ DSP ในตัวและรุ่น -M4F ก็มี FPU เช่นกัน สิ่งนี้อาจไม่จำเป็นตรีโกณมิติสามารถทำได้อย่างง่ายดายในคณิตศาสตร์จุดคงที่


คณิตศาสตร์เมทริกซ์จะมีขอบบน Cortex-M4F หรือไม่? (ในกรณีที่ฉันไปที่นั่นต้นแบบ)
Barry Staes

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

6

ข้อสังเกตบางประการ:

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

  2. สำหรับการทดลองฉันได้ใช้อัลกอริธึมAHRSกับตัวกรองคาลมานในไมโครคอนโทรลเลอร์ ARM Cortex M0 (เป็น STM32 อย่าจำส่วนที่เหลือทั้งหมด แต่ฉันคิดว่ามันคือ 32 MHz) และใช้คณิตศาสตร์จุดคงที่ที่ฉันสามารถเรียกใช้ได้ ประมาณ 40 ตัวอย่าง / วินาที ด้วยคอนโทรลเลอร์ที่เร็วกว่าคุณควรพกติดตัวได้ง่ายและแน่นอนว่าคุณสามารถลองใช้วิธี FPGA หรือ DSP

  3. ฉันจะบอกว่าการควบคุมขานั้นไม่ได้ใช้ซีพียูมากและคุณสามารถควบคุมขาทั้งหมดเข้าด้วยกันอาจแยกจากตรีโกณมิติและการหลีกเลี่ยงสิ่งกีดขวาง (ดู 1)


เซอร์โวได้รับการควบคุมแบบอนุกรมผ่านคอนโทรลเลอร์หรือบัสบัสแบบไดนามิกดังนั้นโดยทั่วไปจะโหลดไว้แล้ว ปัญหาคือซอฟแวร์ต้องทำวิธีการคำนวณจลนศาสตร์ผกผันมากขึ้นกว่าที่จำเป็นสำหรับการถ่ายทอดสด / การเดิน
Barry Staes

5

ตรีโกณมิติมีความซับซ้อน แต่มีทางลัด หากคุณมีความเบาต่อกำลังการประมวลผลให้พิจารณาอัลกอริทึม CORDIC

มันคือตารางค่าสำหรับ [ตัวอย่าง] ไซน์ มุมสามารถเป็นองศาเรเดียนไม่ว่าคุณจะชอบอะไร ประเด็นก็คือค่า SINE ของค่าเหล่านี้คือ 1/2 (0.5), 1/4 (0.25), 1/8, 1/16 ..... ถึงเศษส่วนขององศาที่หุ่นยนต์ของคุณสามารถใช้ได้

ป้อนมุมของคุณลบค่าตารางแรกตั้งค่าผลลัพธ์ของคุณเป็นผลลัพธ์แรก (0.5) หากการลบมุมของคุณกลายเป็นลบแล้วเพิ่มค่าถัดไป (และลบ 0.25) มิฉะนั้นให้ลบมุมต่อไปและเพิ่มผลลัพธ์

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

ความแม่นยำ [และความเร็ว] ของผลลัพธ์ขึ้นอยู่กับขนาด [และความละเอียด] ของตารางการค้นหา


CORDIC ดูดี แต่ฉันจะใช้เฉพาะเมื่อมันทำให้หุ่นยนต์เร็วขึ้น (นั่นเป็นข้อกำหนด)
Barry Staes

3

คุณอาจพิจารณาใช้บอร์ด Raspberry Pi ที่ใช้งานระบบ GNU / Linux วัตถุประสงค์ทั่วไป Raspberry Pi มีพิน GPIO หลายตัวที่สามารถใช้เชื่อมต่อกับเซอร์โวของหุ่นยนต์หรือกระดานต่อขยาย

http://www.youtube.com/watch?v=RuYLTudcOaM

แบบจำลอง A Raspberry Pi สามารถทำการคำนวณจุดลอยตัวได้สูงสุด 24 GFLOP โดยใช้ GPU โดยใช้ OpenGL ES 2 ในขณะที่เหลืออยู่ภายใต้งบประมาณพลังงาน 2.5W

http://elinux.org/RPi_Hardware

ตัวอย่าง: การตั้งค่าหุ่นยนต์ที่ใช้พลังงานจากแบตเตอรี่ใช้งานโดยใช้ Raspberry Pi

http://www.homofaciens.de/technics-robots-R3-construction_en_navion.htm

ตัวอย่างที่ 2: หุ่นยนต์ 6 ขาที่ควบคุมโดย raspberry pi:

http://www.youtube.com/watch?v=Yhv43H5Omfc

ตัวอย่างที่ 3: หุ่นยนต์ลูกตุ้ม 2 ล้อแบบปรับสมดุลตนเองที่ควบคุมโดย raspberry pi:

http://www.youtube.com/watch?v=n-noFwc23y0


2

สำหรับหุ่นยนต์ขาคุณสามารถสร้างลำดับการเคลื่อนย้ายขาที่กำหนดไว้ล่วงหน้าและ "เล่นกับมัน" การหลีกเลี่ยงสิ่งกีดขวางแบบเรียลไทม์สามารถทำได้ด้วยfuzzy logicการนำแสงไปใช้ซึ่งทุกอย่างจะกลับมาอยู่ในรูปแบบตารางอีกครั้งและสิ่งที่คุณต้องทำคือเลือกค่าที่ถูกต้องจากมันและใช้สำหรับdefuzzyficationกระบวนการ

ทุกอย่างสามารถทำได้ใน C ARM7ในการประมวลผลได้เร็วขึ้นเหมือนอย่างใด ฉันได้ลองทำAVRและล้มเหลวหลังจากใช้เวลามากมายในการแปลงทุกอย่างให้fixed point arithmeticsเป็น


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

ในกรณีที่ฉันจะไปสำหรับระบบขา servo ขาแต่ละข้างมีคอนโทรลเลอร์ของตัวเอง วิธีการตามตัวแทน
ใยแมงมุม

1

แพลตฟอร์ม Texas Instruments Stellaris มีหน่วยจุดลอยตัวตามค่าเริ่มต้น ไม่แน่ใจว่าคอนโทรลเลอร์ ARM 80Hz ที่โอเวอร์คล็อกนั้นเร็วพอสำหรับแอปพลิเคชั่นของคุณหรือไม่ แต่บอร์ดพัฒนา LaunchPad นั้นค่อนข้างถูก: http://www.ti.com/ww/en/launchpad/stellaris_head.html

มันสามารถตั้งโปรแกรมผ่าน USB ได้มี toolchains ฟรีอย่างน้อย Windows และ Linux ขนาดประมาณ 4 × 6 cm และมี GPIO 30+ พิน (ถ้านับอย่างถูกต้อง)


0

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


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