Pengantar ROS2 dengan alarm. Penulisan penerbit dan pelanggan Oleh Timothy Shan | Juni 2022

Programming

[ad_1]
Halo Sahabat di suratpembaca.web.id. Kali ini kita akan membahas tentang Linux yaitu Pengantar ROS2 dengan alarm. Penulisan penerbit dan pelanggan Oleh Timothy Shan | Juni 2022

.

Semoga postingan tentang Pengantar ROS2 dengan alarm. Penulisan penerbit dan pelanggan Oleh Timothy Shan | Juni 2022

bisa memberikan faedah untuk Sahabat semua. Langsung saja baca artikel ini
hingga tuntas.

Tulis penerbit dan pelanggan

Pada Mei 2022, ROS 2 Humble Hawksbill (rendah hati) dirilis, yang mendukung Ubuntu 22.04. Karena saya masih menggunakan Ubuntu 20.04, blog ini akan fokus pada itu foxy.

Hal pertama yang pertama, bagaimana cara menginstal ROS2?

Karena tim kami bermigrasi dari ROS1 ke ROS2, saya harus menggunakan keduanya untuk saat ini. Cara saya saat ini adalah menginstal ROS2 di OS saya sesuai dengan panduan resmi dan menginstal ROS1 melalui itu mamba Menggunakan RoboStack

Meskipun RoboStack juga menyediakan ros-galactic-desktopSaya tidak merekomendasikannya karena dukungan paket tidak lengkap dan tidak berfungsi dengan baik dengan API Python.

Anda mungkin bertanya-tanya apakah ada cara untuk merasakan ROS2, lihat apakah Anda menyukainya, sebelum masuk ke instalasi skala penuh. Ada file buruh pelabuhan untuk mereka yang memiliki GPU nvidia, sementara repositori ini menyediakan file buruh pelabuhan untuk CPU dan VNC. Versi yang digunakan dalam blog ini adalah versi VNC. Setelah menarik dan membangun file Docker, gunakan browser untuk terhubung http://127.0.0.1:6080/, yang menunjukkan desktop. Juga, masalah melalui otorisasi harus ditangani sudo chmod 777 -R ~/.ros/ Dan Anda baik untuk pergi

Untuk antarmuka Rust di bagian ini, saya menggunakan r2r, yang memiliki contoh cara menggunakannya tokio. Antarmuka Rust lainnya juga tersedia, seperti ros2_rust, yang sedang dalam pengembangan aktif, tetapi belum mendukung tokio. Kode blog ini ada di repositori ini.

Mari kita mulai dengan masa lalu yang baik hello world Contoh. Pertama, buat paket biner payload

cargo new hello_world --bin --vcs none

Pada src/main.rstambahkan berikut ini

use r2r::QosProfile;
use tokio::task;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>>

partikel untuk objek langsung Cargo.toml Sepertinya itu

[package]
name = "hello_world"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
r2r = "0.6.2"
tokio = version = "1.15.0", features = ["full"]

Lari berikutnya Cargo run dan tinjau topik melalui ros2 topic listadalah keluaran

/hw_topic
/parameter_events
/rosout

Gunakan untuk memeriksa data ros2 topic echo /hw_topic

data: hello world
---
data: hello world
---
...

saya seorang penggemar Sherlock Holmes Jadi saya menggunakan itu sebagai contoh, terutama yang difilmkan oleh BBC. Dalam serial TV ini, John Watson menulis blog tentang hal-hal yang ditangani Sherlock. Jadi mari kita buat penerbit untuk mempublikasikan blog Watson

cargo new watson --bin

Antarmuka Rust yang digunakan di bagian ini adalah rclrust, yang juga mendukungnya tokio. Perhatikan bahwa kita dapat membuat Rust Client dari awal seperti yang ditunjukkan di sini. Kita perlu mendefinisikan dependensi di Cargo.toml sebagai

[package]
name = "watson"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
rclrust = git = "https://github.com/rclrust/rclrust.git", features = ["foxy"]
rclrust-msg = git = "https://github.com/rclrust/rclrust.git"
tokio = version = "1", features = ["full"]
anyhow = "1.0"

Dalam kode di atas kita dapat menentukan versi ROS2 untuk itu rclrust Melalui karakteristik beban. Kita juga harus diikutsertakan rclrust-msg.

Kode penerbit

use std::thread::sleep, time::Duration;use anyhow::Result;
use rclrust::qos::QoSProfile, rclrust_info;
use rclrust_msg::std_msgs::msg::String as String_;
fn main() -> Result<()>
let ctx = rclrust::init()?;
let node = ctx.create_node("watson_blog")?;
let logger = node.logger();
let publisher = node.create_publisher::<String_>("blog", &QoSProfile::default())?;
let mut count = 1;
loop
publisher.publish(&String_
data: format!("Watson's th blog", count),
)?;
rclrust_info!(logger, "Watson's th blog published", count);
count += 1;
sleep(Duration::from_millis(100));
Ok(())

akan keluar

[INFO] [1653823142.928885221] [watson_blog]: Watson's 1th blog published
[INFO] [1653823143.029225096] [watson_blog]: Watson's 2th blog published
[INFO] [1653823143.129426721] [watson_blog]: Watson's 3th blog published
[INFO] [1653823143.230213513] [watson_blog]: Watson's 4th blog published
[INFO] [1653823143.330655138] [watson_blog]: Watson's 5th blog published

Lebih banyak contoh dapat ditemukan di rclust-examples.

Seorang pemuda bernama Billy yang tinggal di Baker Street sangat senang membaca blog Watson, jadi mari kita berlangganan untuk Billy. Kode di bawah ini

use std::sync::Arc;use rclrust::qos::QoSProfile, rclrust_info;
use rclrust_msg::std_msgs::msg::String as String_;
#[tokio::main]
async fn main() -> anyhow::Result<()>
let ctx = rclrust::init()?;
let mut node = ctx.create_node("billy_reader")?;
let logger = node.logger();
let _subscription = node.create_subscription(
"blog",
move

Kita perlu menjalankan penerbit dan pelanggan, hasilnya adalah

[INFO] [1653826256.633754176] [billy_reader]: I read: Watson's 2th blog
[INFO] [1653826256.734067551] [billy_reader]: I read: Watson's 3th blog
[INFO] [1653826256.835288093] [billy_reader]: I read: Watson's 4th blog

Billy sangat menyukai blog sehingga dia memberikan sedikit hadiah setelah membaca satu per satu. Kita perlu menerbitkan satu u8 Untuk mengelola fitur ini, ketik sebagai berikut

use std::sync::Arc;use rclrust::qos::QoSProfile, rclrust_info;
use rclrust_msg::std_msgs::msg::String as String_;
use rclrust_msg::std_msgs::msg::UInt8 as u8_;
#[tokio::main]
async fn main() -> anyhow::Result<()>
rclrust_info!(logger, "I read: ", msg.data);
publisher.publish(&u8_
data: reward,
).unwrap();
rclrust_info!(logger, "I paid: for the blog", reward);
,
&QoSProfile::default(),
)?;
node.wait();
Ok(())

Node penerbit blog harus dimodifikasi sebagai berikut untuk menerima hadiah

use std::thread::sleep, time::Duration;
use std::sync::Arc;
use anyhow::Result;
use rclrust::qos::QoSProfile, rclrust_info;
use rclrust_msg::std_msgs::msg::String as String_;
use rclrust_msg::std_msgs::msg::UInt8 as u8_;
#[tokio::main]
async fn main() -> Result<()>
rclrust_info!(logger, "I received $ reward", msg.data);
,
&QoSProfile::default(),
)?;
let logger = node.logger();
let mut count = 1;
loop
publisher.publish(&String_
data: format!("Watson's th blog", count),
)?;
rclrust_info!(logger, "Watson's th blog published", count);
count += 1;
sleep(Duration::from_millis(100));
Ok(())

Dan outputnya berisi pesan hadiah

[INFO] [1653829848.327928005] [watson_blog]: Watson's 79th blog published
[INFO] [1653829848.329881922] [watson_blog]: I received $10 reward

Ini untuk pengenalan singkat yang mencakup cara menulis penerbit dan pelanggan.

Satu hal yang perlu diperhatikan adalah bahwa tidak seperti contoh Python atau C++ untuk ROS/ROS2, tidak ada fungsi callback di Rust karena, seperti yang disebutkan di sini, fungsinya adalah async.

Demikian pembahasan mengenai Pengantar ROS2 dengan alarm. Penulisan penerbit dan pelanggan Oleh Timothy Shan | Juni 2022

, terimakasih telah berkunjung di website ini, mudah-mudahan informasinya ada manfaatnya ya.

[ad_2]

Source link

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan.