Orkestrasi ROS dengan Snap ubuntu

Ubuntu


Sinkronisasi aplikasi adalah proses mengintegrasikan aplikasi satu sama lain untuk mengotomatisasi dan menyinkronkan proses. Dalam robotika, ini penting, terutama dalam sistem kompleks yang melibatkan banyak proses berbeda yang bekerja bersama. Namun, aplikasi ROS biasanya diluncurkan sekaligus dari file startup tingkat atas.

Dengan orkestrasi, file startup yang lebih kecil dapat diinisialisasi dan disinkronkan untuk memulai satu demi satu untuk memastikan semuanya dalam keadaan yang benar. Orkestrasi juga dapat menahan proses dan menyuntikkan logika proses. Inilah yang seharusnya menjadi orkestrasi ROS.

Dengan cara ini, misalnya, Anda dapat membuatnya sendiri localisation Node dimulai hanya sekali map_server membuat peta tersedia.

Snaps menyediakan fitur orkestrasi yang mungkin berguna untuk orkestrasi ROS Anda.

Dalam posting ini, kami akan menunjukkan kepada Anda cara memulai snap saat boot secara otomatis dan cara memantaunya. Kemudian, melalui beberapa contoh, kita akan menjelajahi berbagai fitur orkestrasi yang disediakan Snaps. Jadi kami menganggap Anda sudah familiar dengan snaps untuk ROS. Jika Anda tidak atau perlu revisi, buka halaman dokumentasi.

Ayo mulai

Mari kita buat dan instal Snappy terlebih dahulu, yang akan kita gunakan dalam tutorial langkah demi langkah ini

git clone https://github.com/ubuntu-robotics/ros-snaps-examples.git -b ros_orchestration_with_snaps_blog
cd ros-snaps-examples/orchestration_humble_core22
SNAPCRAFT_ENABLE_EXPERIMENTAL_EXTENSIONS=1 snapcraft
sudo snap install talker-listener_0.1_amd64.snap --dangerous 

Perhatikan bahwa semua langkah yang dijelaskan di bawah ini sudah diterapkan di repositori git ini. Namun, mereka dijelaskan untuk Anda ikuti dengan mudah.

Mulai aplikasi ROS secara otomatis saat boot

Setelah Anda menguji dan mengisolasi perangkat lunak robotika Anda, Anda dapat memulainya dari shell. Untuk bot mandiri, lebih baik memulai program Anda secara otomatis saat boot, daripada memulai secara manual setiap kali. Ini jelas menghemat waktu dan yang paling penting membuat robot Anda benar-benar otonom.

Snaps menyediakan cara sederhana untuk mengubah perintah snap Anda menjadi layanan dan daemon, sehingga keduanya mulai secara otomatis saat startup dan berakhir saat perangkat dimatikan, atau mulai dan berhenti sesuai permintaan melalui aktivasi soket. .

Di sini, kami akan bekerja dengan pendengar sederhana ROS 2 Humble yang sudah terputus (sangat dibatasi). Jika Anda ingin mengetahui bagaimana pembicara-pendengar difoto, Anda dapat mengunjungi posting blog “Cara membuat foto menggunakan ROS 2 Humble”.

Ubah perintah snap Anda menjadi daemon

Setelah Anda mengisolasi program Anda, Anda tidak hanya dapat mengekspos perintah, tetapi juga membuat daemon.

  • Daemon adalah perintah yang dapat dimulai secara otomatis saat boot, yang diperlukan untuk perangkat lunak bot Anda.

Saat ini, Snap kami memperlihatkan dua perintah – talker Dan listener. Mereka memulai pesan siaran node dan keanggotaan node dan mendengarkan pesan masing-masing.

Anda dapat menguji Snap dengan menjalankan salah satu perintah berikut di terminal Anda:

$ talker-listener.talker
$ talker-listener.listener

Untuk memulai keduanya secara otomatis di latar belakang, kita perlu menjadikannya daemon. Daemon snap dapat terdiri dari banyak jenis, tetapi yang paling umum adalah yang ini.simple“. Ini hanya berjalan selama layanan aktif.

Untuk mengubah aplikasi kita menjadi daemon, kita hanya perlu menambahkan “daemon: simple‘ ke kedua aplikasi snap kami:

apps: 
  listener:
    command: opt/ros/humble/bin/ros2 run demo_nodes_cpp listener 
    + daemon: simple
    plugs: [network, network-bind]
    extensions: [ros2-humble]

  talker: command: opt/ros/humble/bin/ros2 run demo_nodes_cpp talker
    + daemon: simple
    plugs: [network, network-bind]
    extensions: [ros2-humble]

Yang harus Anda lakukan adalah membangun kembali Snap dan menginstal ulang. Setelah instalasi, kedua daemon secara otomatis dimulai tanpa urutan tertentu

Sekarang kita dapat membangun dan menginstal snap ini.

Periksa iblismu

Sekarang kita talker Dan listener berjalan di latar belakang. Snaps menyediakan cara untuk memantau dan berinteraksi dengan iblis snap Anda.

Daemon snap sebenarnya adalah daemon SystemD sederhana, jadi jika Anda terbiasa dengan perintah dan alat SystemD (systemctl, journalctl, etc.) Anda juga dapat menggunakannya untuk Snap Daemon.

Untuk posting ini, kami akan fokus pada itu snap Petunjuk untuk berinteraksi dengan setan dan memantau mereka.

Periksa status layanan kami

Hal pertama yang harus dilakukan adalah memverifikasi status daemon kita dan memastikannya berjalan. Perintah snap info memberi kita ringkasan status daemon.

$ snap info talker-listener

name: talker-listener
summary: ROS 2 Talker/Listener Example
publisher: –
license: unset
description: | 
 This example launches a ROS 2 talker and listener.
Services:
 talker-listener.listener: simple, enabled, active
 talker-listener.talker: simple, enabled, active
refresh-date: today at 18:00 CEST 
installed: 0.1 (x35) 69MB -

Di sini kami melihat dua layanan kami terdaftar. Mereka berdua simple, enabled Dan active.

Simple Ini adalah jenis daemon yang kami tentukan. Enabledberarti layanan kami seharusnya dimulai secara otomatis (saat boot, setelah instalasi instan, dll.). Activeberarti layanan kami sedang berjalan.

Jadi di sini, kita berdua talker Dan listener Layanan sedang berjalan. Mari kita tinjau log.

Telusuri log

Perintah snap juga menyediakan cara untuk menelusuri log layanan kami.

Karena layanan kami sudah berjalan di latar belakang, kami dapat mengetik:

$ sudo snap logs talker-listener

2022-08-23T11:13:08+02:00 talker-listener.listener [2833606]: [INFO] [1661245988.120676423] [talker]: Publishing: 'Hello World: 123' 
[...]
2022-08-23T11:13:12+02:00 talker-listener.talker[2833607]: [INFO] [1661245992.121411564] [listener]: I heard: [Hello World: 123]

Perintah ini mengambil log layanan kami dan menampilkan 10 baris terakhir secara default. Jika Anda ingin perintah berjalan terus menerus dan mencetak log baru saat tiba, Anda dapat menggunakan “-f” pilihan:

sudo snap logs talker-listener -f

Perhatikan bahwa sejauh ini kami telah mengambil seluruh log snap kami (kedua layanan). Kami juga dapat menerima laporan tentang layanan tertentu. Untuk pengambilan terus menerus listener log, ketik:

sudo snap logs talker-listener.listener -f

Berinteraksi dengan setan sekejap

Perintah snap juga menyediakan cara untuk mengontrol layanan. Seperti yang telah kita lihat, layanan kami sekarang tersedia enabled Dan active.

Enabled, berarti layanan kami dimulai secara otomatis saat boot. Kami dapat mengubahnya dengan “menonaktifkan”, sehingga tidak akan mulai secara otomatis lagi

sudo snap disable talker-listener.talker

Perhatikan bahwa menonaktifkan layanan tidak menghentikan proses yang sedang berjalan.

Kami juga dapat menghentikan proses saat ini sepenuhnya:

sudo snap stop talker-listener.talker

Sebaliknya, kami dapat menyediakan layanan menggunakan:

sudo snap enable talker-listener.talker
sudo snap start talker-listener.talker

Pastikan untuk mengaktifkan semuanya lagi untuk mengikuti posting ini:

sudo snap enable talker-listener

Orkestrasi ROS

Selama ini pembicara dan pendengar kita memulai tanpa orkestrasi khusus. Atau dalam bahasa gaul, tanpa urutan tertentu. Untungnya, snaps menawarkan berbagai cara untuk mengoordinasikan layanan.

Untuk membumbui pengalaman kami, mari tambahkan beberapa skrip ke foto kami untuk menampilkan fitur orkestrasi:

Parts:
[...]
  + # copy local scripts to the snap usr/bin 
  + local-files:
    + plugin: dump
      + source: snap/local/
      + organize: '*.sh': usr/bin/

Ini adalah satu set skrip bash yang mudah disiapkan untuk mendemonstrasikan orkestrasi masa depan.

Kami juga akan menambahkan program lain:

Apps:
  [...]
  + listener-waiter:
    + command: usr/bin/listener-waiter.sh
    + daemon: oneshot
    + plugs: [network, network-bind]
    + extensions: [ros2-humble]
    + # Necessary for python3 ROS app
    + environment: "LD_LIBRARY_PATH": "$LD_LIBRARY_PATH:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/blas:$SNAP/usr/lib/$SNAPCRAFT_ARCH_TRIPLET/lapack"

Program hanya menunggu node /listener siap-siap. Daemon ini adalahoneshotJenis daemon lain yang hanya berjalan sekali saat startup dan keluar setelah selesai.

Setelah dan sebelum untuk orkestrasi ROS

Hal pertama yang bisa kita lakukan adalah mengubah urutan awal. ini after/before Kata kunci hanya valid untuk daemon dan memungkinkan kita untuk menentukan apakah daemon tertentu harus dimulai atau tidak. after Atau before Satu (atau lebih) layanan lainnya. Perhatikan bahwa untuk oneshot Iblis, before/after Kata kunci sedang menunggu untuk diselesaikan oneshot melayani

Skenario di sini adalah sebagai berikut: Mulai listenerpastikan itu dimulai dengan benar, lalu dan hanya kemudian, mulai talker. Untuk meyakinkan kami listener Ini dimulai dengan benar, kami akan menggunakannya listener-waiter Program yang kami perkenalkan di bagian sebelumnya. Ingat, itu menunggu node untuk terdaftar.

Di sini, kami mendefinisikan orkestrasi hanya sebagian listener-waiter Tingkat aplikasi untuk membuatnya tetap sederhana. Jadi, kami menginginkannya setelah memulai listener dan sebelumnya talker Jadi talker Ini akan dimulai hanya sekali listener sudah siap.

Untuk melakukan ini, dari before/after Kata kunci:

listener-waiter:
      command: usr/bin/listener-waiter.sh
      daemon: oneshot
      + after: [listener]
      + before: [talker]
      plugs: [network, network-bind]
      extensions: [ros2-humble]

Ini cukup mudah, itu harus dimulai after partikel untuk objek langsung listener tetapi before partikel untuk objek langsung talker. Setelah Snap membangun kembali, kita dapat menginstal ulang dan melihat laporan lagi. Berikut adalah versi singkat dari log keluaran:

systemd[1]: Started Service for snap application talker-listener.listener. 
systemd[1]: Starting Service for snap application talker-listener.listener-waiter... talker-listener.listener-waiter[76329]: Making sure the listener is started 
systemd[1]: snap.talker-listener.listener-waiter.service: Succeeded. 
systemd[1]: Finished Service for snap application talker-listener.listener-waiter. systemd[1]: Started Service for snap application
talker-listener.talker. [talker]: Publishing: 'Hello World: 1'
talker-listener.listener[76439]: [INFO] [1661266809.685248681] [listener]: I heard: [Hello World: 1]

Dalam laporan ini, kami melihat bahwa semuanya berjalan seperti yang diharapkan. partikel untuk objek langsung talker Hanya dimulai sekali listener tersedia.

Dalam contoh ini, kami menentukan before/after persegi di listener-waiter Untuk kesederhanaan, bagaimanapun, setiap daemon dapat menentukan a before/after selama aplikasi yang ditentukan berasal dari snap yang sama, yang memungkinkan orkestrasi yang sangat kompleks.

Hentikan perintah untuk orkestrasi ROS

Fitur lain yang menarik untuk orkestrasi adalah Snap stop-command. Ini memungkinkan menentukan skrip atau perintah untuk dipanggil tepat sebelum sinyal berhenti dikirim ke program selama eksekusi. snap stop. Dengan cara ini, misalnya, kita dapat memastikan semuanya disinkronkan atau disimpan sebelum keluar. Mari kita lihat contoh singkatnya: eksekusi echo dari sebuah string.

Sebuah naskah yang disebut stop-command.sh Sudah ditambahkan ke Snap usr/bin.

Yang perlu kita lakukan di sini adalah menentukan jalur skrip tersebut sebagai stop-command.

talker:
  command: opt/ros/humble/bin/ros2 run demo_nodes_cpp talker
  plugs: [network, network-bind]
  daemon: simple
  + stop-command: usr/bin/stop-command.sh
  extensions: [ros2-humble]

Setelah membangun kembali dan menginstal ulang Snap, kita dapat memulai penghentian secara manual dengannya snap stop memerintah:

sudo snap stop talker-listener # stop all the services of this snap
sudo snap logs talker-listener -f # visualize the logs

Kita akan melihat output yang mirip dengan:

systemd[1]: Stopping Service for snap application talker-listener.listener... 
systemd[1]: snap.talker-listener.listener.service: Succeeded.
systemd[1]: Stopped Service for snap application talker-listener.listener.
systemd[1]: Stopping Service for snap application talker-listener.talker... 
talker-listener.talker[86863]: About to stop the service
systemd[1]: snap.talker-listener.talker.service: Succeeded. 2022-08-23T17:23:57+02:00 systemd[1]: Stopped Service for snap application talker-listener.talker.

Dari log, kita bisa melihatnya sebelum meninggalkan layanan talker, stop-command Script dieksekusi dan pesan dicetak:About to stop the service“. Kemudian, hanya setelah stop-command Scriptnya sudah selesai talker berakhir.

Perintah pasca-stop untuk orkestrasi ROS

mirip dengan stop-command Gabung, post-stop-command Itu juga memanggil perintah, tetapi kali ini, hanya setelah menghentikan layanan.

Ini dapat digunakan untuk melakukan pembersihan data atau bahkan memberi tahu server bahwa sistem Anda sedang down. Sekali lagi, mari kita uji fitur ini dengan skrip yang sudah dikemas sebelumnya yang hanya mencatat pesan.

talker:
  command: opt/ros/humble/bin/ros2 run demo_nodes_cpp talker
  plugs: [network, network-bind]
  daemon: simple
  stop-command: usr/bin/stop-command.sh
  + post-stop-command: usr/bin/post-stop-command.sh
  extensions: [ros2-humble]

Bangun kembali, instal ulang, dan tanpa banyak kejutan, kami mendapatkan output berikut:

systemd[1]: Stopping Service for snap application talker-listener.talker...
talker-listener.talker[90660]: About to stop the service
talker-listener.talker[90548]: [INFO] [1661269138.094854527] [rclcpp]: signal_handler(signum=15)
talker-listener.talker[90710]: Goodbye from the post-stop-command!
systemd[1]: snap.talker-listener.talker.service: Succeeded.
systemd[1]: Stopped Service for snap application talker-listener.talker.

Dari log kita dapat melihat bahwa kita talker Program dijalankan stop-command Script kemudian menerima sinyal penghentian dan hanya setelah kami post-command Script merekam pesan:Goodbye from the post-stop-command!“.

Rantai komando

Sejauh ini, kami telah melihat cara memanggil perintah tambahan saat kami menghentikan layanan kami. ini command-chain Kata kunci memungkinkan kita untuk membuat daftar perintah yang harus dijalankan sebelum perintah utama kita. Kasus penggunaan yang jelas adalah mengatur lingkungan Anda. ini ros2-humble Plugin yang kami gunakan dalam contoh Snap kami sebenarnya menggunakan mekanisme ini. Berkat itu, kita tidak perlu khawatir tentang sumber lingkungan ROS di Snap. Jika Anda penasaran, inilah skrip rantai perintahnya. Bagian yang terbaik adalah itu command-chain Logging tersedia tidak hanya untuk daemon, tetapi juga untuk layanan dan perintah biasa.

Skrip yang disebutkan dalam command-chain Mereka tidak secara otomatis dipanggil satu per satu. Sebaliknya, mereka disebut sebagai argumen satu sama lain, menghasilkan perintah terakhir yang mirip dengan:

./command-chain-script1.sh command-chain-script2.sh main-script.sh

Jadi, Anda harus memastikan bahwa Anda command-chain-scripts Argumen yang diteruskan disebut sebagai executable. Misalnya, di sini command-chain-script1.sh Bertanggung jawab atas panggilan command-chain-script2.sh.

Mari kita lihat seperti apa skrip command-chain-talker.sh kita

#!/usr/bin/sh
echo "Hello from the talker command-chain!"

# Necessary to start the main command 
exec $@

Satu-satunya hal yang harus diperhatikan adalah ini exec $@ yang hanya memanggil perintah berikutnya. Jika kita tidak menentukan ini, perintah snap utama kita tidak akan dipanggil.

Ayo tambahkan skrip lain talker command-chain:

talker:
  + command-chain: [usr/bin/command-chain-talker.sh]
  command: opt/ros/humble/bin/ros2 run demo_nodes_cpp talker
  plugs: [network, network-bind]
  daemon: simple
  stop-command: usr/bin/stop-command.sh
  post-stop-command: usr/bin/post-stop-command.sh
  extensions: [ros2-humble]

Setelah membangun dan menginstal, kita dapat melihat bahwa log sekarang:

systemd[1]: Starting Service for snap application talker-listener.listener-waiter... talker-listener.listener-waiter[96438]: Making sure the listener is started 
systemd[1]: snap.talker-listener.listener-waiter.service: Succeeded. 
systemd[1]: Finished Service for snap application talker-listener.listener-waiter.
systemd[1]: Started Service for snap application talker-listener.talker.
talker-listener.talker[96538]: Hello from the talker command-chain!
talker-listener.talker[96594]: [INFO] [1661271361.139378609] [talker]: Publishing: 'Hello World: 1'

Kami dapat dari log ketika kami listener tersedia talker Bagian ini dimulai command-chain-talker.sh Script dipanggil dan dicetak pesan ini:Hello from the talker command-chain!Dan hanya setelah itu pembicara kami mulai menerbitkan.

Hasil

Saya harap membaca artikel ini akan membantu Anda lebih memahami fitur Snap Daemon dan menginspirasi Anda untuk menggunakannya untuk orkestrasi ROS. Saat ini, orkestrasi hanya dapat dilakukan dalam snap yang sama, karena snap yang dibatasi sepenuhnya tidak diizinkan untuk meluncurkan aplikasi lain di luar sandbox mereka. Tentu saja, Anda dapat menggabungkan fitur orkestrasi Snap dengan perangkat lunak orkestrasi lainnya. Yang terpenting, siklus hidup node ROS 2 memungkinkan Anda untuk mengontrol status node Anda, misalnya Anda dapat mengoordinasikan inisialisasi node Anda.
Jika Anda memiliki umpan balik, pertanyaan, atau ide tentang orkestrasi snap ROS dengan Snap, silakan bergabung dengan komunitas kami dan beri tahu kami pendapat Anda. 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.