可观察的到底是个啥?前端老铁速看,别再被 RxJS 整懵了!
2026/1/13 18:13:58
以下是一个完整的ROS2 Jazzy C++应用案例,包含图像发布节点和订阅节点:
#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;}#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;}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} )<depend>rclcpp</depend><depend>sensor_msgs</depend><depend>cv_bridge</depend><depend>opencv</depend>colcon build --packages-select your_packageros2 run your_package image_publisherros2 run your_package image_subscriber此案例完整展示了ROS2 Jazzy下图像的生成、发布、订阅和处理全流程,符合ROS2最新规范并通过编译验证。