From 044f3651917ac29594a851d5acbea4a3a2c3d0db Mon Sep 17 00:00:00 2001 From: avanmalleghem Date: Sun, 16 Nov 2025 13:11:00 +0000 Subject: [PATCH 1/4] Skeleton for clap_demo --- rclrs/clap_demo/Cargo.toml | 18 ++++++++++++++++++ rclrs/clap_demo/package.xml | 23 +++++++++++++++++++++++ rclrs/clap_demo/src/clap_demo.rs | 0 3 files changed, 41 insertions(+) create mode 100644 rclrs/clap_demo/Cargo.toml create mode 100644 rclrs/clap_demo/package.xml create mode 100644 rclrs/clap_demo/src/clap_demo.rs diff --git a/rclrs/clap_demo/Cargo.toml b/rclrs/clap_demo/Cargo.toml new file mode 100644 index 0000000..0ce43a4 --- /dev/null +++ b/rclrs/clap_demo/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "examples_rclrs_clap_demo" +version = "0.0.1" +authors = ["Antoine Van Malleghem "] +edition = "2021" + +[[bin]] +name = "clap_demo" +path = "src/clap_demo.rs" + +[dependencies] +anyhow = {version = "1", features = ["backtrace"]} +rclrs = "0.6" +rosidl_runtime_rs = "0.5" +example_interfaces = "*" + +# This specific version is compatible with Rust 1.75 +backtrace = "=0.3.74" diff --git a/rclrs/clap_demo/package.xml b/rclrs/clap_demo/package.xml new file mode 100644 index 0000000..4d96b64 --- /dev/null +++ b/rclrs/clap_demo/package.xml @@ -0,0 +1,23 @@ + + + + examples_rclrs_clap_demo + 0.0.1 + Package containing an example of clap library usage with rclrs. + Antoine Van Malleghem + Apache License 2.0 + + rclrs + rosidl_runtime_rs + rclrs_example_msgs + + rclrs + rosidl_runtime_rs + rclrs_example_msgs + + + ament_cargo + + diff --git a/rclrs/clap_demo/src/clap_demo.rs b/rclrs/clap_demo/src/clap_demo.rs new file mode 100644 index 0000000..e69de29 From a95dbb5b6836fa7fb2da8e49980285025f021061 Mon Sep 17 00:00:00 2001 From: avanmalleghem Date: Sun, 16 Nov 2025 13:46:00 +0000 Subject: [PATCH 2/4] Clap basic publisher working Signed-off-by: avanmalleghem --- rclrs/clap_demo/Cargo.toml | 1 + rclrs/clap_demo/src/clap_demo.rs | 38 ++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/rclrs/clap_demo/Cargo.toml b/rclrs/clap_demo/Cargo.toml index 0ce43a4..699cdb6 100644 --- a/rclrs/clap_demo/Cargo.toml +++ b/rclrs/clap_demo/Cargo.toml @@ -13,6 +13,7 @@ anyhow = {version = "1", features = ["backtrace"]} rclrs = "0.6" rosidl_runtime_rs = "0.5" example_interfaces = "*" +clap = { version = "4.5.51", features = ["derive"] } # This specific version is compatible with Rust 1.75 backtrace = "=0.3.74" diff --git a/rclrs/clap_demo/src/clap_demo.rs b/rclrs/clap_demo/src/clap_demo.rs index e69de29..0eed3be 100644 --- a/rclrs/clap_demo/src/clap_demo.rs +++ b/rclrs/clap_demo/src/clap_demo.rs @@ -0,0 +1,38 @@ +use anyhow::{Error, Result}; +use rclrs::*; + + +use clap::Parser; + +/// Simple program to publish ROS 2 messages using clap +#[derive(Parser, Debug)] +#[command(long_about = None)] +struct Args { + /// Number of messages to publish + #[arg(short, long, default_value_t = 1)] + count: u32, +} + +fn main() -> Result<(), Error> { + let args = Args::parse(); + + let context = Context::default_from_env()?; + let executor = context.create_basic_executor(); + + let node = executor.create_node("clap_demo")?; + + let publisher = node.create_publisher::("topic")?; + + let mut message = example_interfaces::msg::String::default(); + + let mut publish_count: u32 = 1; + + while context.ok() && publish_count <= args.count { + std::thread::sleep(std::time::Duration::from_millis(500)); + message.data = format!("Hello, world! {}", publish_count); + println!("Publishing: [{}]", message.data); + publisher.publish(&message)?; + publish_count += 1; + } + Ok(()) +} \ No newline at end of file From 71c58af58cc59edf055586bd782621cfd50d4468 Mon Sep 17 00:00:00 2001 From: avanmalleghem Date: Thu, 20 Nov 2025 08:47:29 +0100 Subject: [PATCH 3/4] Clap working with ros-args arguments aswell Signed-off-by: avanmalleghem --- rclrs/clap_demo/src/clap_demo.rs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/rclrs/clap_demo/src/clap_demo.rs b/rclrs/clap_demo/src/clap_demo.rs index 0eed3be..057c693 100644 --- a/rclrs/clap_demo/src/clap_demo.rs +++ b/rclrs/clap_demo/src/clap_demo.rs @@ -11,12 +11,18 @@ struct Args { /// Number of messages to publish #[arg(short, long, default_value_t = 1)] count: u32, + + /// Name to include in the message + #[arg(long)] + name: String, } fn main() -> Result<(), Error> { - let args = Args::parse(); + + let args = Args::parse_from(extract_non_ros_args(std::env::args())?); let context = Context::default_from_env()?; + let executor = context.create_basic_executor(); let node = executor.create_node("clap_demo")?; @@ -29,7 +35,7 @@ fn main() -> Result<(), Error> { while context.ok() && publish_count <= args.count { std::thread::sleep(std::time::Duration::from_millis(500)); - message.data = format!("Hello, world! {}", publish_count); + message.data = format!("Hello, world! {} - my name is {}", publish_count, args.name); println!("Publishing: [{}]", message.data); publisher.publish(&message)?; publish_count += 1; From ebd9b13655a59861e0522b70c31c082296e12948 Mon Sep 17 00:00:00 2001 From: avanmalleghem Date: Thu, 20 Nov 2025 18:43:57 +0100 Subject: [PATCH 4/4] Integrate clap_demo with minimal_publisher.rs Signed-off-by: avanmalleghem --- rclrs/clap_demo/Cargo.toml | 19 -------- rclrs/clap_demo/package.xml | 23 ---------- rclrs/clap_demo/src/clap_demo.rs | 44 ------------------- rclrs/minimal_pub_sub/Cargo.toml | 1 + .../minimal_pub_sub/src/minimal_publisher.rs | 15 ++++++- 5 files changed, 15 insertions(+), 87 deletions(-) delete mode 100644 rclrs/clap_demo/Cargo.toml delete mode 100644 rclrs/clap_demo/package.xml delete mode 100644 rclrs/clap_demo/src/clap_demo.rs diff --git a/rclrs/clap_demo/Cargo.toml b/rclrs/clap_demo/Cargo.toml deleted file mode 100644 index 699cdb6..0000000 --- a/rclrs/clap_demo/Cargo.toml +++ /dev/null @@ -1,19 +0,0 @@ -[package] -name = "examples_rclrs_clap_demo" -version = "0.0.1" -authors = ["Antoine Van Malleghem "] -edition = "2021" - -[[bin]] -name = "clap_demo" -path = "src/clap_demo.rs" - -[dependencies] -anyhow = {version = "1", features = ["backtrace"]} -rclrs = "0.6" -rosidl_runtime_rs = "0.5" -example_interfaces = "*" -clap = { version = "4.5.51", features = ["derive"] } - -# This specific version is compatible with Rust 1.75 -backtrace = "=0.3.74" diff --git a/rclrs/clap_demo/package.xml b/rclrs/clap_demo/package.xml deleted file mode 100644 index 4d96b64..0000000 --- a/rclrs/clap_demo/package.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - examples_rclrs_clap_demo - 0.0.1 - Package containing an example of clap library usage with rclrs. - Antoine Van Malleghem - Apache License 2.0 - - rclrs - rosidl_runtime_rs - rclrs_example_msgs - - rclrs - rosidl_runtime_rs - rclrs_example_msgs - - - ament_cargo - - diff --git a/rclrs/clap_demo/src/clap_demo.rs b/rclrs/clap_demo/src/clap_demo.rs deleted file mode 100644 index 057c693..0000000 --- a/rclrs/clap_demo/src/clap_demo.rs +++ /dev/null @@ -1,44 +0,0 @@ -use anyhow::{Error, Result}; -use rclrs::*; - - -use clap::Parser; - -/// Simple program to publish ROS 2 messages using clap -#[derive(Parser, Debug)] -#[command(long_about = None)] -struct Args { - /// Number of messages to publish - #[arg(short, long, default_value_t = 1)] - count: u32, - - /// Name to include in the message - #[arg(long)] - name: String, -} - -fn main() -> Result<(), Error> { - - let args = Args::parse_from(extract_non_ros_args(std::env::args())?); - - let context = Context::default_from_env()?; - - let executor = context.create_basic_executor(); - - let node = executor.create_node("clap_demo")?; - - let publisher = node.create_publisher::("topic")?; - - let mut message = example_interfaces::msg::String::default(); - - let mut publish_count: u32 = 1; - - while context.ok() && publish_count <= args.count { - std::thread::sleep(std::time::Duration::from_millis(500)); - message.data = format!("Hello, world! {} - my name is {}", publish_count, args.name); - println!("Publishing: [{}]", message.data); - publisher.publish(&message)?; - publish_count += 1; - } - Ok(()) -} \ No newline at end of file diff --git a/rclrs/minimal_pub_sub/Cargo.toml b/rclrs/minimal_pub_sub/Cargo.toml index 803f3d8..72a2083 100644 --- a/rclrs/minimal_pub_sub/Cargo.toml +++ b/rclrs/minimal_pub_sub/Cargo.toml @@ -30,6 +30,7 @@ anyhow = {version = "1", features = ["backtrace"]} rclrs = "0.6" rosidl_runtime_rs = "0.5" example_interfaces = "*" +clap = { version = "4.5.51", features = ["derive"] } # This specific version is compatible with Rust 1.75 backtrace = "=0.3.74" diff --git a/rclrs/minimal_pub_sub/src/minimal_publisher.rs b/rclrs/minimal_pub_sub/src/minimal_publisher.rs index 2eaf409..8c363a9 100644 --- a/rclrs/minimal_pub_sub/src/minimal_publisher.rs +++ b/rclrs/minimal_pub_sub/src/minimal_publisher.rs @@ -1,7 +1,20 @@ use anyhow::{Error, Result}; use rclrs::*; +use clap::Parser; + +/// Simple program to publish ROS 2 messages using clap +#[derive(Parser, Debug)] +#[command(long_about = None)] +struct Args { + /// Number of messages to publish + #[arg(short, long, default_value_t = u32::MAX)] + count: u32, +} + fn main() -> Result<(), Error> { + let args = Args::parse_from(extract_non_ros_args(std::env::args())?); + let context = Context::default_from_env()?; let executor = context.create_basic_executor(); @@ -13,7 +26,7 @@ fn main() -> Result<(), Error> { let mut publish_count: u32 = 1; - while context.ok() { + while context.ok() && publish_count <= args.count { message.data = format!("Hello, world! {}", publish_count); println!("Publishing: [{}]", message.data); publisher.publish(&message)?;