From 01b13b7afdaa9840c04e4bc8b79561578f1587f1 Mon Sep 17 00:00:00 2001 From: James Pace Date: Thu, 1 Jan 2026 19:14:42 -0500 Subject: [PATCH] Init commit. --- CMakeLists.txt | 45 +++++++++++++++++++++++++++++++++++ package.xml | 21 ++++++++++++++++ src/ImagePublisher.cpp | 54 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 package.xml create mode 100644 src/ImagePublisher.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..225ee03 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,45 @@ +cmake_minimum_required(VERSION 3.8) +project(image_publisher) + +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(rclcpp_components REQUIRED) +find_package(image_transport REQUIRED) +find_package(sensor_msgs REQUIRED) +find_package(OpenCV REQUIRED) +find_package(cv_bridge REQUIRED) + +add_library(image_publisher_component SHARED src/ImagePublisher.cpp) +target_include_directories(image_publisher_component PUBLIC + $ + $) +target_compile_features(image_publisher_component PUBLIC c_std_99 cxx_std_17) # Require C99 and C++17 +target_link_libraries(image_publisher_component + rclcpp::rclcpp + rclcpp_components::component + image_transport::image_transport + ${sensor_msgs_TARGETS} + ${std_msgs_TARGETS} + ${OpenCV_LIBS} + cv_bridge::cv_bridge +) + +rclcpp_components_register_node(image_publisher_component + PLUGIN "j7s::ImagePublisher" + EXECUTABLE image_publisher +) + +ament_export_targets(export_image_publisher_component) +install(TARGETS image_publisher_component + EXPORT export_image_publisher_component + ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib + RUNTIME DESTINATION bin +) + +ament_package() diff --git a/package.xml b/package.xml new file mode 100644 index 0000000..20c2051 --- /dev/null +++ b/package.xml @@ -0,0 +1,21 @@ + + + + image_publisher + 0.0.0 + TODO: Package description + jimmy + TODO: License declaration + + ament_cmake + + cv_bridge + image_transport + sensor_msgs + std_msgs + rclcpp_components + + + ament_cmake + + diff --git a/src/ImagePublisher.cpp b/src/ImagePublisher.cpp new file mode 100644 index 0000000..566bd89 --- /dev/null +++ b/src/ImagePublisher.cpp @@ -0,0 +1,54 @@ +#include +#include +#include +#include +#include + +#include +#include + + +#include + +using namespace std::chrono_literals; + + +namespace j7s { + class ImagePublisher : public rclcpp::Node { + public: + ImagePublisher(const rclcpp::NodeOptions& options); + private: + image_transport::ImageTransport m_transport; + image_transport::Publisher m_publisher; + rclcpp::TimerBase::SharedPtr m_timer; + + sensor_msgs::msg::Image::SharedPtr draw_image(); + }; +}; + +namespace j7s { + ImagePublisher::ImagePublisher(const rclcpp::NodeOptions& options): + Node("image_publisher", options), + m_transport(std::shared_ptr(this)), + m_publisher(m_transport.advertise("image", 1)), + m_timer{} + { + m_timer = this->create_timer(10ms, [this]() -> void { + const auto msg = draw_image(); + m_publisher.publish(msg); + }); + } + + sensor_msgs::msg::Image::SharedPtr ImagePublisher::draw_image() + { + cv::Mat mat = cv::Mat::zeros(200, 200, CV_8UC3); + + std_msgs::msg::Header header; + header.stamp = this->now(); + cv_bridge::CvImage image(header, "mono8", mat); + return image.toImageMsg(); + } +}; + +#include +RCLCPP_COMPONENTS_REGISTER_NODE(j7s::ImagePublisher)