ROS: Praktik terbaik?

14

Saya akan membangun sistem robot kecil , dan sepertinya ROS menyajikan kerangka kerja yang bagus untuk mengontrol dan memprogram sistem.

Namun, saya bertanya-tanya mana yang merupakan praktik terbaik untuk mengelola komponen robot saya.

  • Apakah masuk akal untuk meletakkan semua sensor dalam satu simpul?

  • Haruskah saya hanya meletakkan sensor dari jenis yang sama dalam satu node atau lebih baik memiliki satu node untuk satu sensor?

  • Apakah ini praktik yang baik untuk memiliki beberapa jenis handler node, yang mengambil input dari sensor dan mengarahkan aktuator yang sesuai atau haruskah node aktuator dan node sensor berkomunikasi secara langsung?


  1. Node sensor yang menyatu dan node aktuator dengan handler 1. Node sensor menyatu dan node aktuator dengan handler

  2. Sensor tunggal dan node aktuator dengan handler masukkan deskripsi gambar di sini

  3. Komunikasi langsung masukkan deskripsi gambar di sini

Bagi saya, saya kira yang terbaik adalah memiliki semacam handler, yang menangani komunikasi antara sensor dan aktuator dan memiliki satu simpul untuk setiap elemen robot (seperti pada gambar 2), karena sistem dengan cara ini secara longgar digabungkan dan dapat diperpanjang dengan mudah, tetapi saya ingin tahu pendapat Anda.

manf
sumber

Jawaban:

15

Jawaban yang sangat singkat: 2


Sensor

Mengenai apakah membaca dari sensor semuanya dalam satu node atau masing-masing secara terpisah, Anda harus bertanya pada diri sendiri pertanyaan ini:

Apakah sensor tidak ada artinya tanpa yang lain?

Pertanyaan ini menanyakan apakah sensor terpasang erat atau tidak. Misalnya, Anda memiliki sensor yang sensitif terhadap suhu (dan Anda harus menggantinya). Anda menambahkan sensor suhu terutama untuk memperbaiki nilai sensor lainnya. Dalam skenario ini, masuk akal untuk membaca kedua nilai pada saat yang sama, karena keduanya digabungkan secara ketat. Bahkan, tanpa pembacaan dari sensor suhu, pembacaan dari sensor asli tidak berguna.

Di sisi lain, jika sensor secara individual bermanfaat, tentu saja simpan di node yang terpisah. Ini memiliki banyak manfaat:

  • Node dapat dijalankan pada prosesor terpisah
  • Node dapat digunakan kembali di robot masa depan
  • Kegagalan dalam komunikasi dengan satu node tidak membawa seluruh sistem turun
  • Restart akuisisi dari papan sensor yang salah dapat dilakukan secara terpisah dari yang lain

Faktanya, jika Anda membutuhkan salah satu dari manfaat di atas, Anda harus menggunakan node yang terpisah, bahkan jika sensornya dipasangkan dengan erat, tetapi itu biasanya tidak terjadi.

Aktuator

Ini analog.

Apakah aktuator tidak ada artinya tanpa yang lain?

Sebagai contoh, jika Anda mendesain pergelangan tangan dengan tendon robotik di mana untuk setiap tendon (untuk alasan apa pun) dua motor bertanggung jawab untuk secara bersamaan bekerja untuk memindahkan sambungan dalam satu atau arah lain, maka dengan melayani mereka di simpul yang sama membuat lebih banyak akal daripada terpisah.

Di sisi lain, di mana aktuator independen (kasus umum), masuk akal untuk memiliki satu simpul untuk setiap aktuator. Dalam hal ini, masing-masing dapat diletakkan di simpul yang berbeda. Selain manfaat yang sama persis dengan sensor, ada manfaat tambahan ini:

  • Jika aktuator macet (untuk alasan apa pun), aktuator lainnya masih berfungsi. Jika ada derajat kebebasan yang berlebihan, mereka bahkan bisa mengimbanginya sepenuhnya.

Ini memiliki satu implikasi. Jika Anda membutuhkan aktuator untuk bekerja secara harmonis, maka letakkan di simpul yang sama. Ini bukan hanya karena kegagalan dalam komunikasi, tetapi karena node yang berbeda berarti penundaan yang berbeda; pada sistem terdistribusi, setiap node berada pada bagian jaringan yang berbeda dan karenanya perbedaan penundaan, pada sistem terpusat, penundaan yang berbeda terjadi pada beban CPU yang tinggi karena keberuntungan setiap proses dalam penjadwalan.

Haruskah Ada Pawang?

Meskipun jawabannya adalah "itu tergantung", ada pendekatan umum dengan banyak keuntungan. Mari kita ubah nama dan menyebutnya "controller". Pendekatannya adalah "ya, harus ada controller".

Keuntungan memiliki pengontrol adalah (di antara banyak):

  • Pemrosesan yang dipisahkan: setiap node bertanggung jawab untuk satu hal yang berarti:
    • Kesederhanaan: yang menyiratkan
      • Pengembangan lebih mudah
      • Debugging lebih mudah
      • Lebih sedikit kesalahan
      • Lebih sedikit peluang untuk gagal
    • Dapat digunakan kembali: karena pengontrol yang sama dapat digunakan dengan node sensor yang berbeda jika mereka memiliki fungsi yang sama (yaitu format pesan dan layanan).
  • Eksekusi pada perangkat keras terpisah: setiap node dapat dipindahkan dalam jaringan. Sebagai contoh, sensor dan node aktuator dapat dipindahkan ke mikrokontroler khusus ( Arduino misalnya (bukan yang saya sarankan)) dan pengontrol pada PC.
  • Hindari keburukan ekstrim: jika sensor ingin secara langsung mempengaruhi aktuator, hasilnya hanya berantakan. Dengan asumsi tidak ada pengontrol, mari kita lihat setiap kasus:
    • Satu simpul sensor: pada dasarnya ini berarti simpul sensor dan pengontrol disatukan dalam simpul yang sama. Tidak terlalu buruk, tetapi sangat tidak perlu.
    • Banyak node sensor: ini berantakan. Ini berarti pengontrol didistribusikan di antara node sensor. Oleh karena itu semua node sensor harus berbicara satu sama lain agar masing-masing mengetahui cara mengontrol aktuator yang terkait. Bayangkan kegagalan dalam komunikasi atau berbagai jenis keterlambatan dan Anda akan melihat betapa sulitnya itu. Mengingat ini sama sekali tidak perlu, tidak ada alasan untuk melakukannya!

Ini mengatakan, ada juga kerugiannya. Memiliki lebih banyak node (semua node, bukan hanya controller) berarti:

  • Komunikasi yang lebih terbuang: data harus bergerak dalam format standar (jadi serial dan deserialized) melalui jaringan atau memori bersama, inti ROS harus melihat mereka dan memutuskan siapa yang akan dikirim, dll. Singkatnya, beberapa sumber daya sistem terbuang dalam komunikasi. Jika semua titik di mana dalam satu, biaya itu bisa nol.
  • Peluang kegagalan yang lebih tinggi: jika karena alasan apa pun tautan jaringan turun, atau sebuah simpul mati, ada kegagalan dalam sistem. Jika Anda tidak siap untuk itu, itu dapat menghancurkan seluruh sistem. Sekarang ini sebenarnya adalah hal yang baik secara umum untuk dapat kehilangan bagian dari sistem tetapi tidak semuanya ( degradasi anggun ), tetapi ada juga aplikasi di mana ini harus dihindari sebisa mungkin. Memotong komunikasi dan meletakkan semua kode dalam satu simpul sebenarnya membantu stabilitas sistem. Sisi buruknya tentu saja, sistemnya berfungsi dengan baik atau tiba-tiba mati sepenuhnya.
  • Timing kacau: setiap node berjalan sendiri. Waktu yang dibutuhkan untuk pesannya untuk sampai pada orang lain adalah non-deterministik dan bervariasi berjalan demi jalan. Kecuali jika node Anda mencatat waktu setiap pesan (sebagai catatan: Anda harus memiliki sinkronisasi jam sampai tingkat yang baik, yang ROS tidak) dan kecuali setiap node penerima dapat memperhitungkan penundaan dan mengontrolnya (yang merupakan tugas yang sangat sulit) sendiri) kemudian memiliki banyak node berarti ketidakpastian tinggi tentang usia data. Ini sebenarnya adalah salah satu alasan (di antara banyak) bahwa kebanyakan robot bergerak sangat lambat; loop kontrol mereka harus cukup lambat untuk memastikan semua data sesuai dengan periode saat ini. Semakin besar penundaan, semakin lambat loop kontrol.

Dalam semua kerugian di atas, solusinya adalah mengurangi jumlah node, lebih disukai untuk satu node. Tunggu sebentar, itu tidak menggunakan ROS lagi! Persis.

Untuk meringkas:

  • Gunakan ROS untuk sistem non-realtime di mana penundaan bisa menjadi tinggi secara sporadis. Dalam hal ini, jangan ragu untuk memiliki sebanyak mungkin node ROS yang Anda inginkan. Bahkan, itu praktik yang sangat baik untuk meminta setiap simpul ROS melakukan satu dan hanya satu hal. Dengan begitu, mereka menjadi sangat sederhana, dan mereka menjadi sangat dapat digunakan kembali.
  • Di sisi lain, untuk sistem realtime, tentu saja hindari ROS. Untuk itu ada orocos dan teknologi seperti EtherCAT dan lebih sering daripada tidak, solusi ad-hoc.

Sebagai kata terakhir, dalam praktiknya ROS baik-baik saja. Tidak hebat, tapi baik-baik saja. Sangat sering sistem tidak kritis dan kemungkinan kegagalan sangat kecil sehingga setiap sekarang dan kemudian restart bukan masalah besar. Ini adalah algoritma burung unta !

Shahbaz
sumber
1
Wow, jawaban yang sangat bagus dan terperinci! Terima kasih banyak atas waktu Anda;)
manf