SymForce merupakan komputasi simbolik cepat dan pustaka pembuatan kode untuk aplikasi robotika seperti visi komputer, estimasi keadaan, perencanaan gerak, dan kontrol. Ini menggabungkan kecepatan pengembangan dan fleksibilitas matematika simbolik dengan kinerja kode yang dibuat secara otomatis dan sangat dioptimalkan dalam C++ atau bahasa runtime target apa pun.
-
Symbolic Toolkit - dibangun di atas SymPy API untuk menyediakan tipe geometris dan kamera yang ketat, kalkulus grup kebohongan, penanganan singularitas, dan alat untuk memodelkan masalah kompleks
-
Pembuat Kode (Code Generator) - mengubah ekspresi simbolik menjadi kode tanpa cabang yang sangat cepat dengan API bersih dan ketergantungan minimal, dengan sistem templat untuk menargetkan bahasa apa pun
-
Pustaka Pengoptimalan (Optimization Library) - pustaka pengoptimalan ruang tangen cepat berdasarkan grafik faktor, dengan implementasi yang sangat optimal untuk aplikasi robotika waktu nyata
SymForce secara otomatis menghitung ruang singgung Jacobians, menghilangkan kebutuhan akan turunan tulisan tangan yang rawan bug. Fungsi yang dihasilkan dapat langsung digunakan sebagai faktor dalam pengoptimal nonlinier kami. Alur kerja ini memungkinkan fungsi runtime lebih cepat, waktu pengembangan lebih cepat, dan lebih sedikit baris kode tulisan tangan dibandingkan metode alternatif.
SymForce dikembangkan dan dikelola oleh Skydio. Ini digunakan dalam produksi untuk mempercepat tugas-tugas seperti SLAM, penyesuaian bundel, kalibrasi, dan MPC nonlinier jarang untuk robot otonom dalam skala besar.
Contoh dari implementasi symforce adalah:
- Computer Vision
- State Estimation
- Motion Planning
- Robot Controls
- Implementasi simbolik geometri dan tipe kamera dengan operasi grup Lie
- Pembuatan kode dari kode runtime asli yang cepat dari ekspresi simbolik, mengurangi duplikasi dan meminimalkan bug
- Alat baru untuk menghitung jacobian ruang singgung yang cepat dan benar untuk ekspresi apa pun, menghindari semua turunan tulisan tangan
- Strategi untuk meratakan komputasi dan memanfaatkan sparsity yang dapat menghasilkan 10x percepatan dibandingkan autodiff standar
- Pustaka pengoptimalan ruang tangen cepat di C++ dan Python berdasarkan grafik faktor
- Prototyping cepat dan analisis masalah kompleks dengan matematika simbolik, dengan alur kerja mulus ke penggunaan produksi
- Pembuatan kode Eigen yang di-embedded-friendly dengan C++ dengan alokasi memori dinamis nol
- Kode yang sangat berkinerja, modular, teruji, dan dapat diperluas
Untuk menjalankan simulasi symforce secara optimal bertikut rekomendasi spesifikasi perangkat yang disarankan:
- CPU 4 core
- RAM 8 GB
- Mem 50 GB
atau bisa juga menggunakan alternatif lain seperti github codespace
- Ubuntu 20.04 OS
- Python 3.8+
- Jupyter notebook
- Visual studio code editor
Contoh Studi Kasus dalam hal ini ialah Robot bergerak melalui bidang 2D dan memiliki goal untuk memperkirakan pose pada beberapa langkah kedepan dengan sebuah pengukuran kebisingan (noisy measurements).
Pengukuran yang harus dilakukan oleh Robot :
- Jarak yang ditempuh dengan menggunakan sensor odometri
- Sudut relatif menuju landmark.
Berdasarkan kasus di atas, maka robot memiiki sudut dengan tujuan yang berlawanan arah jarum jam dari sumbu x. Oleh karena itu, pengukuran sudut relatif ditentukan dari arah robot akan maju. Berikut adalah gambar berdasarkan kasus robot yang kita miliki :
Kali ini studi kasus yang dilakukan adalah robot akan bergerak pada bidang 2 dimensi untuk memperkirakan pose dari langkah selanjutnya menggunakan pengukuran kebisingan. Robot akan mengukur sudut relatif landmark dan jarak tempuh dengan sensor odometri.
Menurut studi kasus di atas tahapan yang akan dilakukan adalah:
- Import librari symforce
import symforce.symbolic as sf
- Membuat simbolik pose 2 dimensi dan lokasi landmark, menggunakan method symbolic pada library symforce
pose = sf.Pose2(
t=sf.V2.symbolic("t"),
R=sf.Rot2.symbolic("R")
)
landmark = sf.V2.symbolic("L")
- Transformasi landmark kedalam frame lokal robot
landmark_body = pose.inverse() * landmark
- Inisialisasi metode jacobian dari landmark body-frame dengan pendekatan tangent-space dari pose 2
landmark_body.jacobian(pose)
- Melakukan perhitungan sudut relatif bearing
sf.atan2(landmark_body[1], landmark_body[0])
- Menambahkan fungsi epsilon
sf.V3.symbolic("x").norm(epsilon=sf.epsilon())