Cara menggunakan memori bersama ROS 2 di Snap

Ubuntu


Jika Anda pernah mencoba mengemas aplikasi ROS 2 Foxy di Snap, Anda mungkin mengalami kesalahan memori bersama berikut:

[RTPS_MSG_OUT Error] Domain name: fastrtps -> Function compute_per_allocation_extra_size
[RTPS_TRANSPORT_SHM Error] Failed to create segment bed1660b134d4b19: Permission denied -> Function compute_per_allocation_extra_size
[RTPS_MSG_OUT Error] Permission denied -> Function init

Laporan ini menyatakan bahwa FastDDS (sebelumnya dikenal sebagai FastRTPS) tidak dapat membuat file untuk mekanisme memori bersama karena izin ditolak. Untungnya, FastDDS cukup pintar untuk kembali ke opsi berbasis memori non-berbagi, memungkinkan program Anda berjalan dengan lancar.

Dalam posting ini, kita akan menjelajahi mekanisme memori bersama di ROS 2, menjelaskan mengapa kesalahan ini terjadi dalam snap, dan menyarankan solusi berbeda untuk mengatasinya dalam snap yang sangat terbatas. Jadi kami menganggap Anda sudah familiar dengan ROS 2 dan Snap. Jika tidak, lihat salah satu (atau keduanya) dokumentasi ROS 2 dan halaman arahan instan.

Apa itu memori bersama ROS 2?

Memori bersama adalah mekanisme komunikasi antar-proses yang cepat yang memungkinkan beberapa proses mengakses ruang memori bersama seperti memori kerja normal. Dengan membuat segmen memori yang dapat diakses oleh banyak proses, proses ini dapat membaca/menulis ke memori ini dengan bantuan mekanisme sinkronisasi. Di FastDDS, memori bersama biasanya memiliki latensi yang lebih rendah dan throughput yang lebih tinggi daripada komunikasi soket karena penggunaan mekanisme berbasis paket yang lebih kecil dan strategi penyalinan yang efisien.

Di Linux, segmen memori bersama dibuat di bawah ini /dev/shm Arah. Di direktori ini, orang biasanya menemukan file partisi memori serta file yang terkait dengan sinkronisasi (kunci, mutex, dll.). Berikut adalah contoh dari apa yang dibuat oleh ROS 2 Foxy di dalamnya /dev/shm.

-rw-r--r--  1 guillaume guillaume 545K mai   11 09:40 fastrtps_1ab64bba8500211c
-rw-rw-r--  1 guillaume guillaume    0 mai   11 09:40 fastrtps_1ab64bba8500211c_el
-rw-r--r--  1 guillaume guillaume  33K mai   11 09:40 fastrtps_port7424
-rw-rw-r--  1 guillaume guillaume    0 mai   11 09:40 fastrtps_port7424_el
-rw-r--r--  1 guillaume guillaume  33K mai   11 09:40 fastrtps_port7425
-rw-rw-r--  1 guillaume guillaume    0 mai   11 09:40 fastrtps_port7425_el
-rw-r--r--  1 guillaume guillaume   32 mai   11 09:40 sem.fastrtps_port7424_mutex
-rw-r--r--  1 guillaume guillaume   32 mai   11 09:40 sem.fastrtps_port7425_mutex

file dengan ‘_elEkstensi terkunci, file dengan tandasem.diberi nama awalan mutex, fastrtps_port File awalan adalah port dan sisanya adalah file memori bersama yang sebenarnya. Membuat mutex bernama membuat sejumlah file sementara (diformat) /dev/shm/XXXXXX ).

Perhatikan bahwa FastDDS menggunakan boost::interprocess sebagai backend untuk mekanisme memori bersama.

Komunikasi ROS 2 dapat mengambil manfaat dari mekanisme memori bersama ketika node berada pada perangkat yang sama. Mari kita periksa cara kerjanya.

Bagaimana ROS 2 Foxy menggunakan memori bersama FastDDS?

FastDDS mengimplementasikan berbagai mekanisme komunikasi seperti UDP, TCP, dll., tetapi juga mengaktifkan memori bersama secara default. Memori bersama digunakan jika tersedia dan dari host yang sama. Ini berarti bahwa penggunaan memori bersama tidak mencegah pemantauan data perangkat lain. Ini kembali ke mekanisme pesan normal.

File terpenting dalam transfer memori bersama di bawah ini /dev/shm adalah fastrtps_port* Dan fastrtps_* File.

Fastrtps_* Berisi blok memori bersama (segmen) yang dapat diakses oleh banyak proses. Setiap DomainParticipant yang dikonfigurasi dengan memori bersama membuat file seperti itu saat membuat penerbit/pelanggan. Data ditulis ke file ini dan mungkin dibaca oleh peserta domain lain.

Untuk mengetahui tentang file-file ini dan informasi yang dikandungnya, FastDDS menggunakan port (fastrtps_port* File). Port pertama yang dibuat digunakan untuk menemukan peserta. Setiap peserta menyatakan kehadirannya di port ini dan port apa yang didengarkannya. Setiap peserta dapat menulis deskriptor data ke port lain yang berpartisipasi, menyatakan data apa yang tersedia di segmen memori bersama mana.

Anda dapat menemukan contoh skenario peserta domain yang bertukar data melalui memori bersama dalam dokumentasi FastDDS.

File yang tersisa *_el Dan sem.* Mereka masing-masing mengunci file (untuk mencegah partisi dan port file zombie) dan menamai mutex untuk menyinkronkan akses port antar-pemrosesan.

ROS berbagi 2 memori pada saat yang sangat terbatas

Sekarang setelah kita membahas masalah dan teknis di baliknya, mari kita bahas solusinya. Secara default, snaps tidak memiliki akses ke sana saat sangat dibatasi /dev/shm jalur pada mesin Host, tetapi hanya ke subdirektori spesifik yang telah ditentukan sebelumnya untuk setiap pukulan keras dan setelah pola: /dev/shm/snap.SNAP_NAME. Direktori memori bersama FastDDS ROS 2 Foxy tidak dapat dikonfigurasi pada tulisan ini. Kami tidak dapat memaksanya untuk menggunakan subdirektori memori bersama yang dibuat untuk snap.

Kami dapat menemukan solusi yang dibahas dengan contoh di GitHub.

Antarmuka memori bersama umum untuk ROS 2

Snap menyediakan antarmuka yang disebut memori bersama. Antarmuka ini memungkinkan snap yang berbeda untuk mengakses (membaca dan/atau menulis) jalur yang diberikan. Ini berarti berbagi sumber daya /dev/shm Di seberang jepret. Untuk melakukan ini, kita perlu mendeklarasikan keduanya a slot juga plug. Sebelum menjalankan snap, kita perlu menghubungkan slot dan plug ini secara manual, mungkin menghubungkan beberapa snap lainnya ke slot yang sama.

Slot yang mendefinisikan jalur memori bersama yang dapat diakses. Dengan ROS 2 Foxy, kami sebenarnya membutuhkan akses ke semua yang ada di dalamnya /dev/shm direktori (karena file semaphore sementara). Contoh slot dan fork adalah sebagai berikut:

slots:
  shmem-slot:
    interface: shared-memory
    write: ['*'] # paths are relative to /dev/shm
    private: false 
plugs:
  shmem-plug:
    interface: shared-memory
    shared-memory: shmem-slot
    private: false

Kemudian plug-in dan slot ditambahkan ke program:

apps:
  my-ros-2-app:
    [...]
    plugs: [network, network-bind, shmem-plug]
    slots: [shmem-slot] 

Setelah snap dibuat dan diinstal, kita dapat memasang memori bersama dengan perintah

sudo snap connect my_snap_name:shmem-plug my_snap_name:shmem-slot

Snap tambahan hanya perlu membuat plugin sendiri dan menghubungkannya ke plugin yang sama slot.

Solusi ini memiliki overhead yang signifikan, karena slot dan colokan harus ditentukan, mungkin dalam beberapa hit. Namun sebenarnya cara mengaktifkan penggunaan fitur shared memory cukup terbatas di foto. perhatikan itu snapd 2.56.2 (atau lebih tinggi) diperlukan.

Antarmuka memori bersama pribadi

Snap menyediakan antarmuka lain yang disebut Memori Bersama Pribadi yang sangat menyederhanakan dukungan memori bersama dengan Snap. Memori bersama pribadi adalah bagian dari antarmuka memori bersama. Tanpa mengubah perangkat lunak, semua panggilan ke /dev/shm akan terikat /dev/shm/snap.SNAP_NAME Secara otomatis.

Dalam konteks ROS 2 Foxy, menambahkan memori bersama pribadi memungkinkan memori bersama bekerja pada saat tertentu, sehingga mendapat manfaat dari kinerja yang lebih baik.

Seperti disebutkan sebelumnya, memori bersama digunakan ketika program dijalankan pada host yang sama. Saat menggunakan penyimpanan bersama pribadi, semua file yang kami jelaskan sebelumnya secara otomatis ditempatkan di jalur tertentu untuk snap yang diberikan. Namun, FastDDS tidak mengetahui kasus sudut seperti itu dan oleh karena itu membuat sambungan lokal menggunakan mekanisme memori bersama. Sedikit yang dia tahu itu tidak akan berhasil. Semuanya baik-baik saja dalam sekejap, tetapi aplikasi dimatikan secara eksternal. Aplikasi ROS 2 berjalan di host, tetapi di luar Snap, tidak dapat melihat utas dari Snap. Apalagi berlangganan mereka.

Demikian pula, dua pengguna lokal di host yang sama tidak akan memiliki akses tulis ke file memori bersama masing-masing karena izin. Oleh karena itu, pengguna tidak dapat berlangganan utas pengguna lain melalui memori bersama. Penyebab yang sama, akibat yang sama.

Dengan demikian, penting untuk dicatat bahwa jika Anda mengakses topik yang diterbitkan Snap ini dari komputer lain, itu akan bekerja dengan mulus karena data dibagikan melalui UDP.

Nonaktifkan memori bersama untuk ROS 2

Last but not least, palu besar. FastDDS menawarkan dua opsi untuk sepenuhnya menonaktifkan fitur memori bersama. baik pada waktu kompilasi maupun pada saat dijalankan. Kami menjelaskan kedua opsi di bawah ini.

Pada waktu kompilasi

FastDDS menyediakan opsi untuk mengompilasi tanpa fitur memori bersama dengan menentukan variabel CMake: -DSHM_TRANSPORT_DEFAULT=OFF. Dengan ini, tidak ada memori bersama atau tidak ada file terkait – pesan kesalahan ciao. Tentu saja, kelemahan utama dari metode ini adalah kita harus mengkompilasi ulang FastDDS dengan setiap klik cepat.

Nonaktifkan memori bersama saat runtime

FastDDS juga menyediakan kemampuan untuk menyediakan file konfigurasi XML pada saat runtime untuk menyesuaikan beberapa aspek middleware. Salah satu aspek tersebut adalah memaksa transportasi untuk menggunakan UDPv4. Profil XML diteruskan dalam variabel lingkungan:

FASTRTPS_DEFAULT_PROFILES_FILE: myProfileLocation/fastdds_no_shared_memory.xml

Jauh lebih mudah untuk menyesuaikan dan mengubahnya di versi Snap berikutnya.

Ringkasan

Saya harap membaca artikel ini akan membantu Anda mempelajari lebih banyak tentang fitur memori bersama ROS 2 Foxy dan cara kerjanya dengan Snap. Meskipun mekanisme memori bersama memiliki keuntungan yang jelas, ia juga memiliki keterbatasan. Kami telah melihat bahwa izin file atau bahkan penampung dapat menyebabkan memori bersama tidak berfungsi seperti yang diharapkan. Memahami implementasi memori bersama FastDDS di ROS 2 Foxy membantu kami menemukan solusi untuk menggunakannya dalam snapshot dengan keterbatasannya. Sering kali, solusi paling sederhana adalah mengemas seluruh tumpukan menggunakan memori bersama pribadi atau menonaktifkannya.

Jika Anda memiliki umpan balik atau ide lain tentang ROS 2 Foxy dan memori bersama, silakan bergabung dengan forum kami dan bagikan pemikiran Anda dengan kami. Selain itu, jika Anda ingin mempelajari lebih lanjut tentang Snap untuk aplikasi robotika, lihat dokumentasi Snap.



Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *