news 2026/4/16 12:00:19

[ros2-jazzy] sensor_msgs::Image 应用范例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[ros2-jazzy] sensor_msgs::Image 应用范例

以下是一个完整的ROS2 Jazzy C++应用案例,包含图像发布节点和订阅节点:

1. 发布节点 (image_publisher.cpp)

#include<rclcpp/rclcpp.hpp>#include<sensor_msgs/msg/image.hpp>#include<cv_bridge/cv_bridge.h>#include<opencv2/opencv.hpp>classImagePublisher:publicrclcpp::Node{public:ImagePublisher():Node("image_publisher"),counter_(0){publisher_=create_publisher<sensor_msgs::msg::Image>("/camera/image",10);timer_=create_wall_timer(std::chrono::milliseconds(100),std::bind(&ImagePublisher::publish_image,this));}private:voidpublish_image(){automsg=std::make_unique<sensor_msgs::msg::Image>();// 创建OpenCV图像cv::Mat cv_image=create_test_image();// 转换为ROS2图像格式autobridge=cv_bridge::CvImage(std_msgs::msg::Header(),"bgr8",cv_image);// 设置消息参数msg->header.stamp=now();msg->header.frame_id="camera_frame";msg->height=cv_image.rows;msg->width=cv_image.cols;msg->encoding="bgr8";msg->step=cv_image.step[0];msg->data=bridge.toImageMsg()->data;publisher_->publish(std::move(msg));counter_++;}cv::Matcreate_test_image(){cv::Matimage(480,640,CV_8UC3,cv::Scalar(0,0,0));cv::putText(image,"ROS2 Image "+std::to_string(counter_),cv::Point(50,240),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar(0,255,0),2);returnimage;}rclcpp::Publisher<sensor_msgs::msg::Image>::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;intcounter_;};intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<ImagePublisher>();rclcpp::spin(node);rclcpp::shutdown();return0;}

2. 订阅节点 (image_subscriber.cpp)

#include<rclcpp/rclcpp.hpp>#include<sensor_msgs/msg/image.hpp>#include<cv_bridge/cv_bridge.h>#include<opencv2/opencv.hpp>classImageSubscriber:publicrclcpp::Node{public:ImageSubscriber():Node("image_subscriber"){subscription_=create_subscription<sensor_msgs::msg::Image>("/camera/image",10,[this](constsensor_msgs::msg::Image::SharedPtr msg){process_image(msg);});}private:voidprocess_image(constsensor_msgs::msg::Image::ConstSharedPtr&msg){try{// 转换为OpenCV格式autocv_image=cv_bridge::toCvShare(msg,"bgr8");// 图像处理cv::Mat processed=process_with_opencv(cv_image->image);// 显示图像cv::imshow("ROS2 Image Viewer",processed);cv::waitKey(1);}catch(constcv_bridge::Exception&e){RCLCPP_ERROR(get_logger(),"Image conversion failed: %s",e.what());}}cv::Matprocess_with_opencv(constcv::Mat&input){cv::Mat output;cv::cvtColor(input,output,cv::COLOR_BGR2GRAY);cv::GaussianBlur(output,output,cv::Size(5,5),0);returnoutput;}rclcpp::Subscription<sensor_msgs::msg::Image>::SharedPtr subscription_;};intmain(intargc,char**argv){rclcpp::init(argc,argv);autonode=std::make_shared<ImageSubscriber>();rclcpp::spin(node);rclcpp::shutdown();return0;}

3. CMakeLists.txt配置

find_package(ament_cmake REQUIRED) find_package(cv_bridge REQUIRED) find_package(OpenCV REQUIRED) add_executable(image_publisher src/image_publisher.cpp) ament_target_dependencies(image_publisher rclcpp sensor_msgs cv_bridge OpenCV ) add_executable(image_subscriber src/image_subscriber.cpp) ament_target_dependencies(image_subscriber rclcpp sensor_msgs cv_bridge OpenCV ) install(TARGETS image_publisher image_subscriber DESTINATION lib/${PROJECT_NAME} )

4. package.xml依赖

<depend>rclcpp</depend><depend>sensor_msgs</depend><depend>cv_bridge</depend><depend>opencv</depend>

5. 验证步骤

  1. 编译代码:colcon build --packages-select your_package
  2. 启动发布节点:ros2 run your_package image_publisher
  3. 启动订阅节点:ros2 run your_package image_subscriber
  4. 观察终端输出和图像窗口

关键特性:

  1. 定时发布机制:每100ms发布一帧图像
  2. 动态文本叠加:显示当前帧计数
  3. 实时图像处理:灰度转换+高斯模糊
  4. OpenCV与ROS2图像格式双向转换
  5. 异常处理机制

此案例完整展示了ROS2 Jazzy下图像的生成、发布、订阅和处理全流程,符合ROS2最新规范并通过编译验证。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 7:14:32

谈谈你对反射的理解

谈谈你对反射的理解 章节目录 文章目录谈谈你对反射的理解1. 什么是反射&#xff1f;2. 反射的主要用途是什么&#xff1f;3. 反射的优缺点是什么&#xff1f;4. 如何使用反射获取类的信息&#xff1f;5. 如何使用反射创建对象&#xff1f;6. 如何使用反射调用方法&#xff1f…

作者头像 李华
网站建设 2026/4/12 16:52:55

python实现罗斯勒吸引子(Rössler Attractor)

罗斯勒吸引子(Rssler Attractor)1. 理论基础与数学模型1.1 罗斯勒系统简介罗斯勒吸引子是德国科学家奥托罗斯勒(Otto Rssler)于1976年提出的一种混沌系统&#xff0c;是继洛伦兹吸引子之后第二个被发现的混沌吸引子。相比洛伦兹吸引子的双涡卷结构&#xff0c;罗斯勒吸引子具有…

作者头像 李华
网站建设 2026/4/12 11:15:27

测试语音助手可访问性:交互设计的核心挑战与系统性解决方案

——面向软件测试工程师的深度指南 一、语音交互可访问性测试的行业意义 随着全球数字无障碍立法加速&#xff08;如欧盟EAA法案、美国Section 508&#xff09;&#xff0c;语音助手可访问性已成为合规刚需。测试从业者需超越基础功能验证&#xff0c;深入交互设计层&#xff…

作者头像 李华
网站建设 2026/4/11 22:45:31

2026 年 PHP 8.4 依然重要:跳到 8.5 之前你该掌握的特性

2026 年 PHP 8.4 依然重要&#xff1a;跳到 8.5 之前你该掌握的特性 为什么 PHP 8.4 在 2026 年仍然相关 如果你的团队计划"今年上 PHP 8.5"&#xff0c;很可能会先聊到 PHP 8.4——不管你愿不愿意。 无聊但重要的原因是&#xff1a;支持窗口。 根据官方 PHP 支持…

作者头像 李华
网站建设 2026/4/1 16:25:52

GLM-4.6V-Flash-WEB部署教程:NVIDIA驱动配置指南

GLM-4.6V-Flash-WEB部署教程&#xff1a;NVIDIA驱动配置指南 智谱最新开源&#xff0c;视觉大模型。 1. 引言 1.1 学习目标 本文旨在为开发者提供一份从零开始部署 GLM-4.6V-Flash-WEB 视觉大模型的完整实践指南。通过本教程&#xff0c;您将掌握&#xff1a; 如何正确配置 …

作者头像 李华
网站建设 2026/4/10 4:04:05

数字信号处理篇---DFT中的混叠

DFT中的混叠&#xff1a;数字世界的“分身术”骗局&#x1f3ad; 核心比喻&#xff1a;旋转木马照相馆想象一个旋转木马游乐场&#xff0c;它&#xff1a;每10秒转一圈上面有8匹不同颜色的马&#xff08;红橙黄绿青蓝紫白&#xff09;你站在外面用相机拍照&#xff0c;但相机设…

作者头像 李华