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
复制代码

 

posted @   澳大利亚树袋熊  阅读(245)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示