From d31c9faf02d50d15e33d5e8872fcb5e67474cfd7 Mon Sep 17 00:00:00 2001 From: Wessel Tip Date: Tue, 9 Sep 2025 11:11:20 +0200 Subject: [PATCH] feat(hw1): First iteration of custom interface, rename clock - Rename `hw1-clock` -> `hw1_clock` --- src/{hw_1_clock => hw1_clock}/CMakeLists.txt | 2 +- src/{hw_1_clock => hw1_clock}/package.xml | 2 +- .../src/1-clock-print.cpp | 0 .../src/2-clock-steady-continuous.cpp | 0 src/hw1_interface/CMakeLists.txt | 18 +++++++ src/hw1_interface/msg/StudentResult.msg | 2 + src/hw1_interface/package.xml | 22 ++++++++ src/hw1_interface_usage/CMakeLists.txt | 41 ++++++++++++++ src/hw1_interface_usage/package.xml | 20 +++++++ src/hw1_interface_usage/src/1-publisher.cpp | 54 +++++++++++++++++++ src/hw1_interface_usage/src/2-subscriber.cpp | 48 +++++++++++++++++ 11 files changed, 207 insertions(+), 2 deletions(-) rename src/{hw_1_clock => hw1_clock}/CMakeLists.txt (98%) rename src/{hw_1_clock => hw1_clock}/package.xml (95%) rename src/{hw_1_clock => hw1_clock}/src/1-clock-print.cpp (100%) rename src/{hw_1_clock => hw1_clock}/src/2-clock-steady-continuous.cpp (100%) create mode 100644 src/hw1_interface/CMakeLists.txt create mode 100644 src/hw1_interface/msg/StudentResult.msg create mode 100644 src/hw1_interface/package.xml create mode 100644 src/hw1_interface_usage/CMakeLists.txt create mode 100644 src/hw1_interface_usage/package.xml create mode 100644 src/hw1_interface_usage/src/1-publisher.cpp create mode 100644 src/hw1_interface_usage/src/2-subscriber.cpp diff --git a/src/hw_1_clock/CMakeLists.txt b/src/hw1_clock/CMakeLists.txt similarity index 98% rename from src/hw_1_clock/CMakeLists.txt rename to src/hw1_clock/CMakeLists.txt index cd2bf98..f61294d 100644 --- a/src/hw_1_clock/CMakeLists.txt +++ b/src/hw1_clock/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.8) -project(hw_1_clock) +project(hw1-clock) if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) diff --git a/src/hw_1_clock/package.xml b/src/hw1_clock/package.xml similarity index 95% rename from src/hw_1_clock/package.xml rename to src/hw1_clock/package.xml index d34eb92..638f459 100644 --- a/src/hw_1_clock/package.xml +++ b/src/hw1_clock/package.xml @@ -1,7 +1,7 @@ - hw_1_clock + hw1-clock 0.0.0 TODO: Package description wessel diff --git a/src/hw_1_clock/src/1-clock-print.cpp b/src/hw1_clock/src/1-clock-print.cpp similarity index 100% rename from src/hw_1_clock/src/1-clock-print.cpp rename to src/hw1_clock/src/1-clock-print.cpp diff --git a/src/hw_1_clock/src/2-clock-steady-continuous.cpp b/src/hw1_clock/src/2-clock-steady-continuous.cpp similarity index 100% rename from src/hw_1_clock/src/2-clock-steady-continuous.cpp rename to src/hw1_clock/src/2-clock-steady-continuous.cpp diff --git a/src/hw1_interface/CMakeLists.txt b/src/hw1_interface/CMakeLists.txt new file mode 100644 index 0000000..9aad5f0 --- /dev/null +++ b/src/hw1_interface/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.8) +project(hw1_interface) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rosidl_default_generators REQUIRED) + +rosidl_generate_interfaces(${PROJECT_NAME} + "msg/StudentResult.msg" +) + +ament_export_dependencies(rosidl_default_runtime) + +ament_package() diff --git a/src/hw1_interface/msg/StudentResult.msg b/src/hw1_interface/msg/StudentResult.msg new file mode 100644 index 0000000..f4c89eb --- /dev/null +++ b/src/hw1_interface/msg/StudentResult.msg @@ -0,0 +1,2 @@ +string student +float64 result diff --git a/src/hw1_interface/package.xml b/src/hw1_interface/package.xml new file mode 100644 index 0000000..7893d80 --- /dev/null +++ b/src/hw1_interface/package.xml @@ -0,0 +1,22 @@ + + + + hw1_interface + 0.0.0 + TODO: Package description + wessel + TODO: License declaration + + ament_cmake + + rosidl_default_generators + rosidl_default_runtime + rosidl_interface_packages + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/src/hw1_interface_usage/CMakeLists.txt b/src/hw1_interface_usage/CMakeLists.txt new file mode 100644 index 0000000..a38da87 --- /dev/null +++ b/src/hw1_interface_usage/CMakeLists.txt @@ -0,0 +1,41 @@ +cmake_minimum_required(VERSION 3.8) +project(hw1_interface_usage) + +if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_compile_options(-Wall -Wextra -Wpedantic) +endif() + +# find dependencies +find_package(ament_cmake REQUIRED) +find_package(rclcpp REQUIRED) +find_package(hw1_interface REQUIRED) +# uncomment the following section in order to fill in +# further dependencies manually. +# find_package( REQUIRED) + +add_executable(1_pub src/1-publisher.cpp) +add_executable(2_sub src/2-subscriber.cpp) + +ament_target_dependencies(1_pub rclcpp hw1_interface) +ament_target_dependencies(2_sub rclcpp hw1_interface) + +install ( + TARGETS + 1_pub + 2_sub + DESTINATION lib/${PROJECT_NAME} +) + +if(BUILD_TESTING) + find_package(ament_lint_auto REQUIRED) + # the following line skips the linter which checks for copyrights + # comment the line when a copyright and license is added to all source files + set(ament_cmake_copyright_FOUND TRUE) + # the following line skips cpplint (only works in a git repo) + # comment the line when this package is in a git repo and when + # a copyright and license is added to all source files + set(ament_cmake_cpplint_FOUND TRUE) + ament_lint_auto_find_test_dependencies() +endif() + +ament_package() diff --git a/src/hw1_interface_usage/package.xml b/src/hw1_interface_usage/package.xml new file mode 100644 index 0000000..f064d67 --- /dev/null +++ b/src/hw1_interface_usage/package.xml @@ -0,0 +1,20 @@ + + + + hw1_interface_usage + 0.0.0 + TODO: Package description + wessel + TODO: License declaration + + ament_cmake + + hw1_interface + + ament_lint_auto + ament_lint_common + + + ament_cmake + + diff --git a/src/hw1_interface_usage/src/1-publisher.cpp b/src/hw1_interface_usage/src/1-publisher.cpp new file mode 100644 index 0000000..3245761 --- /dev/null +++ b/src/hw1_interface_usage/src/1-publisher.cpp @@ -0,0 +1,54 @@ +/* hw1_interface_usage/1-publisher.cpp.cpp + * A node that will publish a custom static message + * every 3 seconds. + * + * Reviewed by: + * Changelog: + * [04-09-2025] Wessel T: Implement template + * [09-09-2025] Wessel T: (BASE) Work out assignment + */ + +#include + +#include "rclcpp/rclcpp.hpp" +#include "hw1_interface/msg/student_result.hpp" + +class NodeHw1StudentPublisher : public rclcpp::Node { +public: + NodeHw1StudentPublisher() + : Node("node_hw1_student_publisher") + { + publisher_student_result_ = + this->create_publisher("student_result", 10); + + timer_student_result_ = this->create_wall_timer( + std::chrono::seconds(3), + std::bind(&NodeHw1StudentPublisher::timer_student_result_function, this) + ); + } + + void timer_student_result_function() { + hw1_interface::msg::StudentResult msg; + msg.student = "Wessel T"; + msg.result = 7.0; + + publisher_student_result_->publish(msg); + RCLCPP_INFO(this->get_logger(), + "Published: student=%s, result=%f", msg.student.c_str(), msg.result + ); + } + +private: + rclcpp::Publisher::SharedPtr publisher_student_result_; + rclcpp::TimerBase::SharedPtr timer_student_result_; +}; + +int main(int argc, char *argv[]) { + rclcpp::init(argc, argv); + + auto node = std::make_shared(); + rclcpp::spin(node); + rclcpp::shutdown(); + + return 0; +} diff --git a/src/hw1_interface_usage/src/2-subscriber.cpp b/src/hw1_interface_usage/src/2-subscriber.cpp new file mode 100644 index 0000000..2fed527 --- /dev/null +++ b/src/hw1_interface_usage/src/2-subscriber.cpp @@ -0,0 +1,48 @@ +/* hw1_interface_usage/2-subscriber.cpp + * A node that will subscribe to a custom static message + * + * Reviewed by: + * Changelog: + * [04-09-2025] Wessel T: Implement template + * [09-09-2025] Wessel T: (BASE) Work out assignment + */ + +#include + +#include "rclcpp/rclcpp.hpp" +#include "hw1_interface/msg/student_result.hpp" + +using namespace std::placeholders; + +class NodeHw1StudentSubscriber : public rclcpp::Node { +public: + NodeHw1StudentSubscriber() + : Node("node_hw1_student_subscriber") + { + subscriber_student_result_ = + this->create_subscription( + "student_result", 10, + std::bind(&NodeHw1StudentSubscriber::callback_student_result, this, _1) + ); + } + + void callback_student_result(const hw1_interface::msg::StudentResult::SharedPtr msg) { + RCLCPP_INFO(this->get_logger(), + "Received: student=%s, result=%f", msg->student.c_str(), msg->result + ); + } + +private: + rclcpp::Subscription::SharedPtr subscriber_student_result_; +}; + +int main(int argc,char *argv[]) { + rclcpp::init(argc,argv); + + auto node = std::make_shared(); + + rclcpp::spin(node); + rclcpp::shutdown(); + + return 0; +}