c++实现rosbag订阅并读取图片数据
参考资料:https://blog.csdn.net/qq_40344790/article/details/134947607
http://wiki.ros.org/cv_bridge/Tutorials/UsingCvBridgeToConvertBetweenROSImagesAndOpenCVImages
一、ros安装
看我的另一篇文章:https://www.cnblogs.com/xmds/p/17875018.html
二、cmakelists.txt
cmake_minimum_required(VERSION 3.0.2) project(test_cvbridge) ## Find catkin macros and libraries ## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz) ## is used, also find other catkin packages find_package(OpenCV REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs sensor_msgs image_transport cv_bridge ) ########### ## Build ## ########### ## Specify additional locations of header files ## Your package locations should be listed before other locations include_directories( ${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS} ) add_executable(${PROJECT_NAME} main.cpp) ## Specify libraries to link a library or executable target against target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES} ${OpenCV_LIBS} )
二、订阅并展示数据
#include <ros/ros.h> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp> #include <image_transport/image_transport.h> #include <cv_bridge/cv_bridge.h> void imageCallback(const sensor_msgs::ImageConstPtr &msg) { try { // 将ROS图像消息转换为OpenCV图像 cv::Mat image = cv_bridge::toCvShare(msg, "mono8")->image; // 显示图像 cv::imshow("Image", image); cv::waitKey(1); } catch (cv_bridge::Exception &e) { ROS_ERROR("Failed to convert ROS image to OpenCV image: %s", e.what()); } } int main(int argc, char **argv) { ros::init(argc, argv, "image_sub"); ros::NodeHandle nh; // 创建图像传输对象和订阅者 image_transport::ImageTransport it(nh); image_transport::Subscriber sub = it.subscribe("sensor/camera/front_middle/image/bgr", 1, imageCallback); // 创建opencv窗口本地显示 cv::namedWindow("Image", cv::WINDOW_AUTOSIZE); ros::spin(); cv::destroyAllWindows(); return 0; }
其中 mono8为8位灰度图,bgr8为8位彩色图。
三、自定义消息订阅
cmakelist有所改动,需要使用catkin构建。自定义消息的订阅可以参考以下,或者问一问文心一言、gpt。但不管怎样,都需要自定义消息的.msg文件。
#cmakelist cmake_minimum_required(VERSION 2.8.3) project(loc_test) find_package(OpenCV REQUIRED) find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs geometry_msgs message_generation ) add_message_files(FILES Location.msg) generate_messages(DEPENDENCIES geometry_msgs std_msgs) include_directories(${OpenCV_INCLUDE_DIRS}) include_directories(include ${catkin_INCLUDE_DIRS} ) add_executable(loc_test main.cpp) target_link_libraries (loc_test ${OpenCV_LIBS} ${catkin_LIBRARIES}) catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs geometry_msgs message_runtime)
实现可以参考以下:
#include "ros/ros.h" #include "sstream" #include "loc_test/Location.h" #include "iostream" using namespace std; void printMsg(const loc_test::Location::ConstPtr& msg_p) { std::cout<<"time:"<<msg_p->header.stamp.sec<<"ns:"<<msg_p->header.stamp.nsec<<endl; std::cout<<msg_p->pose<<std::endl; } int main(int argc,char *argv[]) { setlocale(LC_ALL,""); ros::init(argc,argv,"besproma_sub_node"); ros::NodeHandle nh; ros::Subscriber sub=nh.subscribe<loc_test::Location>("/localization/data",20,printMsg); ros::spin(); return 0; }
location.msg的格式如下:
Header header string child_frame_id float64 latitude float64 longitude float64 altitude geometry_msgs/Pose pose geometry_msgs/Twist twist geometry_msgs/Vector3 linear_acceleration float64[] mileage uint8 status float64[] status_data uint8 Location_Invalid=0 uint8 Outdoor_Single=1 uint8 Outdoor_Rtcm_Diff=2 uint8 Outdoor_Satell_Err=3 uint8 Outdoor_Imu_Whell=4 uint8 Outdoor_Fix=5 uint8 Indoor_Imu=6 uint8 Indoor_Imu_Lidar=7 uint8 Indoor_Imu_Lidar_Vel=8 uint8 Indoor_Imu_Lidar_Vel_Uwb=9 uint8 Indoor_Fix=10 uint8 type string info
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理