Mikrokontroler / cpu untuk trigonometri cepat dalam robot?


15

Ini menyangkut perangkat keras yang sedikit berbobot, karena robot berjalan (berukuran kucing gemuk, 6 kaki dengan 3 DOF) harus membawanya berkeliling. Karena itu berjalan itu perlu melakukan banyak trigonometri (menggunakan matriks matematika atau belum saya belum yakin) dan ini adalah dari mana pertanyaan ini berasal.

PIC, Arduino, atau AVR murah tidak cukup cepat untuk menghitung semuanya 100 / detik dan menjaga hal-hal seperti inersia dan penghindaran kendala dalam pikiran, atau bahkan jalur / alat bruteforce.

  • Rencana A adalah membawa otak pada robot. Baik itu mikroprosesor, mikro ITX, nettop atau lainnya; apa perangkat keras yang efisien untuk melakukan trigonometri / matriks matematika dengan cepat?

    Saya mencari secara online dan diharapkan untuk mengetahui tentang AVR, x86, atau mikrokontroler ARM yang terspesialisasi dalam hal ini tetapi tidak berhasil di sana.

  • Plan B adalah memiliki mesin x86 yang terhubung melalui WiFi untuk melakukan pengangkatan berat. Sangat bagus untuk membuat prototipe, tetapi saya ingin ini bermigrasi ke rencana A pada akhirnya ketika perangkat kerasnya mini. Tetapi meskipun begitu, apa yang dapat dilakukan CPU desktop paling cepat trigonometri?

  • Plan C adalah mendistribusikan beban dan memiliki satu mikrokontroler / inti efisien daya untuk setiap kaki, walaupun itu bukan solusi terbaik karena berbagai alasan, saya suka memperluas kemampuannya.

Saya belum memutuskan bahasa dan / atau perpustakaan yang digunakan, tetapi lebih suka Pascal dan C ++.

(saran untuk menyambut tag yang lebih cocok, saya baru di sini)


11
floating point matematika bukanlah suatu keharusan. Anda selalu dapat membuat tabel sinus (atau fungsi lainnya), memasukkannya ke dalam flash AVR dan menginterpolasi antara nilai dengan perhitungan titik tetap. Ini mungkin cukup cepat untuk kebutuhan Anda.
Christoph

3
Daripada kehilangan matematika dalam waktu nyata, solusi yang umum adalah menghitung tabel nilai sebelumnya dan mencari jawabannya. Gagasan untuk mendistribusikan pekerjaan antara banyak CPU juga baik, misalnya satu master CPU yang kuat dan kemudian satu prosesor per kaki.
John U

2
Anda juga dapat mempertimbangkan untuk mengajukan pertanyaan semacam ini di situs Robotics Stackexchange .
Rocketmagnet

1
Paket B akan melakukan perhitungan dengan cukup cepat, tetapi komunikasi melalui WiFi kemungkinan besar akan mematikan perolehan kinerja. Apakah Anda mempertimbangkan untuk menggunakan ponsel Android yang terhubung melalui usb? Ini jauh lebih banyak daya komputasi tanpa jeda wifi
Stefan

1
Papan STM32F4 dengan Floating Point Unit tampaknya cukup untuk aplikasi Anda. Memiliki 128k SRAM dengan 64k CCM. Itu dapat berjalan pada 168MHz. Penggandaan floating point 32-bit hanya membutuhkan 1 siklus CPU ..
richieqianle

Jawaban:


16

Itu tidak terdengar seperti aplikasi Anda benar-benar semua yang intensif komputasi. Sebuah dsPIC, misalnya, dapat mengeksekusi instruksi 400 k untuk masing-masing iterasi Anda. Itu banyak. Akan bermanfaat jika memiliki kemampuan I / O tingkat rendah yang baik, generator PWM, timer, dan sejenisnya.

Sinus dan cosinus sebenarnya tidak terlalu sulit untuk dilakukan dalam mesin integer seperti dsPIC. Saya telah melakukannya sendiri beberapa kali. Caranya adalah dengan memilih representasi yang tepat untuk sudut. Radian mungkin baik dari sudut pandang teoretis, tetapi tidak nyaman secara komputasi. Degress adalah buatan dan konyol. Gunakan rentang penuh apa pun bilangan bulat berukuran mesin Anda untuk mewakili satu putaran penuh. Misalnya, pada dsPIC, yang merupakan prosesor 16 bit, satu putaran penuh adalah jumlah 65536, yang jauh lebih akurat dan resolusi daripada yang Anda butuhkan untuk mengendalikan robot atau Anda dapat mengukur pula.

Satu keuntungan dari representasi ini adalah bahwa semua pembungkus terjadi secara otomatis hanya karena cara bilangan bulat unsigned menambah dan mengurangi kerja. Keuntungan signifikan lainnya adalah bahwa representasi ini cocok untuk menggunakan tabel pencarian untuk sinus dan cosinus. Anda hanya perlu menyimpan 1/4 siklus. Dua bit teratas sudut memberi tahu Anda kuadran mana Anda berada, yang memberi tahu Anda apakah akan mengindeks ke dalam tabel ke depan atau ke belakang, dan apakah akan meniadakan hasil atau tidak. N bit yang lebih rendah berikutnya digunakan untuk mengindeks ke dalam tabel, dengan tabel yang memiliki 2 segmen N (2 N +1 poin). Perhatikan bahwa pengindeksan ke tabel mundur kemudian hanya melengkapi bit indeks tabel.

Anda bisa memberikan tabel cukup poin sehingga memilih jawaban terdekat cukup baik. Misalnya, jika tabel memiliki 1024 segmen, maka sinus dan kosinus akan dihitung ke 1/4096 terdekat dari sebuah lingkaran. Itu akan banyak untuk mengendalikan robot. Jika Anda ingin lebih akurat, Anda bisa membuat tabel lebih besar atau menggunakan bit sudut yang tersisa untuk menginterpolasi secara linear antara entri tabel yang berdekatan.

Pokoknya, intinya adalah tampaknya persyaratan Anda untuk prosesor ini tidak cocok dengan masalah yang disebutkan. Saya mungkin akan menggunakan dsPIC33F. Ini tentu kecil, ringan, dan jauh lebih efisien daya daripada proses komputasi tujuan umum penuh seperti x86 pada komputer papan tunggal.


Saya selalu mendapat kesan bahwa PIC lambat bahkan untuk kinematika terbalik, tetapi saya mungkin perlu mempertimbangkan kembali. Apakah mungkin untuk melakukan kinematika terbalik untuk 6 kaki 3DOF setidaknya 100 / detik? Thats 6x3x100 membalikkan kinematika hanya untuk mendapatkan gerakan kaki langsung. Bagaimanapun saya memerlukan kinematika terbalik terjadi pada platform yang sama dengan algoritma berjalan, sehingga saya tidak perlu mengimplementasikan bagian ini dua kali. Algoritma akan lebih menuntut, dan tentu saja tidak akan dapat berjalan pada PIC atau Arduino-isch board.
Barry Staes

9

Anda akan berurusan dengan banyak sinyal input. Anda tidak perlu membutuhkan CPU dengan throughput tinggi; banyak sinyal dapat diproses secara paralel. Ini adalah wilayah khas DSP. Tentu saja, Anda juga menginginkan fungsionalitas CPU umum. Ini bukan masalah. Ada banyak CPU dengan DSP terintegrasi.

Desain chip yang khas untuk aplikasi tersebut adalah Cortex-M4. Ini dilengkapi dengan DSP terintegrasi, dan versi -M4F juga memiliki FPU. Ini mungkin tidak perlu, trigonometri dapat dengan mudah dilakukan dalam matematika titik tetap.


Apakah matrik matematika memiliki keunggulan pada Cortex-M4F? (Dalam kasus saya berani di sana, prototyping)
Barry Staes

3
Hanya untuk menjadi sedikit berlebihan - Inti prosesor Cortex-M4 tidak memiliki DSP terintegrasi, ia memiliki tingkat kemampuan DSP yang dimasukkan ke dalam inti prosesor utamanya. Ekstensi DSP adalah penambahan instruksi gandakan / terakumulasi yang memfasilitasi fungsi DSP khas seperti penyaringan dan transformasi.
uɐɪ

6

Beberapa komentar:

  1. Anda tidak perlu memproses operasi trigonometri pada CPU yang sama yang mengeksekusi penghalang rintangan. Anda dapat membagi tugas antara dua mikrokontroler dan menggunakan protokol komunikasi untuk membuat mereka berbicara.

  2. Untuk percobaan saya telah menerapkan algoritma AHRS dengan filter Kalman dalam mikrokontroler ARM Cortex M0 (itu adalah STM32, tidak ingat persis sisanya tetapi saya pikir itu 32 MHz), dan menggunakan matematika titik tetap saya bisa menjalankan sekitar 40 sampel / detik. Dengan pengontrol yang lebih cepat Anda harus dapat membawanya dengan mudah, dan tentu saja Anda dapat mencoba cara FPGA atau DSP.

  3. Saya akan mengatakan bahwa kontrol tungkai tidak intensif-CPU dan Anda dapat mengontrol semua tungkai secara bersamaan, mungkin terpisah dari operasi trigonometri dan penghindaran rintangan (lihat 1)


Servo dikendalikan serial melalui pengontrol atau bus dinamixel, jadi pada dasarnya sudah dimuat. Masalahnya adalah perangkat lunak perlu melakukan perhitungan kinematika terbalik lebih dari sekadar yang diperlukan untuk pose hidup / gaya berjalan.
Barry Staes

5

Trigonometri rumit, tetapi ada pintasan. Jika Anda lemah dalam memproses daya, pertimbangkan algoritma CORDIC.

Ini pada dasarnya adalah tabel nilai untuk [misalnya] sinus. Sudut bisa dalam derajat, radian, apa pun yang Anda suka. Intinya adalah, SINE dari nilai-nilai ini adalah 1/2 (0,5), 1/4 (0,25), 1/8, 1/16 ..... hingga fraksi apa pun dari tingkat yang dapat digunakan robot Anda.

Masukkan sudut Anda, kurangi nilai tabel pertama, atur hasil Anda ke hasil pertama (0,5). Jika, dengan menyuburkan, sudut Anda menjadi negatif, lalu TAMBAH nilai berikutnya (dan kurangi 0,25). Jika tidak, lanjutkan kurangi sudut dan tambahkan hasil.

Ketika Anda sampai di ujung tabel, yang telah Anda lakukan adalah menambah & mengurangi namun Anda sudah sangat dekat. Ada "faktor biola" terakhir untuk dikalikan.

Keakuratan [dan kecepatan] dari hasil tergantung pada ukuran [dan resolusi] dari tabel pencarian.


CORDIC terlihat bagus tetapi saya hanya akan menggunakannya jika itu membuat robot lebih cepat (itu syarat).
Barry Staes

3

Anda dapat mempertimbangkan menggunakan papan Raspberry Pi yang menjalankan sistem tujuan umum GNU / Linux. Raspberry Pi memiliki beberapa pin GPIO yang dapat digunakan untuk menghubungkan robot servos atau papan ekstensi.

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

Model A Raspberry Pi dapat melakukan hingga 24 GFLOP untuk komputasi titik tujuan umum menggunakan GPU menggunakan OpenGL ES 2 sambil tetap di bawah anggaran daya 2,5W.

http://elinux.org/RPi_Hardware

Contoh: pengaturan robot bertenaga baterai diimplementasikan menggunakan Raspberry Pi.

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

Contoh 2: robot berkaki 6 yang dikendalikan oleh pi raspberry:

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

Contoh 3: robot pendulum terbalik 2 roda penyeimbang diri dikendalikan oleh pi raspberry:

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


2

Untuk robot berkaki, Anda dapat membuat beberapa urutan gerakan kaki yang telah ditentukan dan "memainkannya". Penghindaran kendala waktu nyata dapat dilakukan dengan fuzzy logicimplementasi ringan di mana semuanya lagi dalam format tabel dan yang perlu Anda lakukan adalah memilih nilai yang tepat dari itu dan menggunakannya untuk defuzzyficationproses.

Semuanya dapat dilakukan dalam C pada prosesor yang lebih cepat seperti ARM7. Saya sudah mencobanya AVRdan gagal, setelah menghabiskan banyak waktu untuk mengubah segalanya fixed point arithmetics.


Memainkan animasi gaya berjalan adalah persis apa yang tidak saya inginkan. Algoritme yang saya ingin menerapkan angka-angka apa yang harus dilakukan dengan kakinya sendiri, dan algoritma itu sebabnya saya perlu trigonometri cepat. Namun saya kurang menjelaskan pertanyaan saya. Dan melihat bahwa begitu banyak yang berpadu dalam hal ini saya akan sia-sia untuk mengedit pertanyaan. Saya akan bertanya dan lebih spesifik, pada waktunya.
Barry Staes

Dalam hal ini saya akan pergi untuk sistem leg servo. Setiap kaki memiliki pengontrol sendiri. Pendekatan berbasis agen.
Gossamer

1

Platform Texas Instruments Stellaris memiliki unit floating point di papan secara default. Tidak yakin apakah pengontrol ARM clock 80MHz cukup cepat untuk aplikasi Anda, tetapi papan pengembangan LaunchPad cukup murah: http://www.ti.com/ww/en/launchpad/stellaris_head.html

Dapat diprogram melalui USB, toolchains gratis tersedia untuk setidaknya Windows dan Linux, berukuran sekitar 4 × 6 cm dan memiliki 30+ pin GPIO (jika saya hitung dengan benar).


0

Anda dapat menanamkan papan daya CPU x86 ke dalam aplikasi robot Anda dengan bantuan AVR untuk mengontrol drive robot sebagai kartu penghubung. Solusi tercepat dan termurah untuk masalah Anda. Tapi ya Anda harus mengacaukan banyak pengkodean ke arsitektur x86, tetapi untungnya Anda dapat memahami banyak pengkodean dari kode OS open source. (Jika konstruksi mekanik Anda dapat menanggung berat ini)


4
"x86" dan "power pc" adalah dua arsitektur yang sepenuhnya berbeda (dan setidaknya pada beberapa titik dalam sejarah).
Chris Stratton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.