ros(一)使用消息传递图像+launch启动文件

发布于:2025-06-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

1)第一步:构建工作空间

mkdir -p test_ws/src
cd test_ws/src
catkin_create_pkg  test_launch  roscpp cv_bridge image_transport sensor_msgs
cd test_ws
catkin_make

这时候发现 test_ws工作空间下有了 build和 devel文件夹,build主要存放的就是编译过程文件,devel主要存放的就是动态库、静态库和可执行文件。

2)编写程序

在 test_launch/src文件夹下,新建一个img_pub.cpp和一个 img_sub.cpp文件

img_pub.cpp文件内容如下:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>

int main(int argc, char** argv)
{
    ros::init(argc, argv, "publisher_img");
    ros::NodeHandle nh;

    image_transport::ImageTransport it(nh);
    image_transport::Publisher pub = it.advertise("image", 1);

    cv::Mat image = cv::imread("/home/slamugv/111.jpg");
    ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);
    if (image.empty())
    {
        ROS_INFO("Image is Empty!");
    }
    sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
    ros::Rate loop_rate(5);

    while(nh.ok())
    {
        ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);
        pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }
}

img_sub.cpp文件内容如下:

#include <ros/ros.h>
#include <image_transport/image_transport.h>
#include <opencv2/highgui/highgui.hpp>
#include <cv_bridge/cv_bridge.h>


void imageCallback(const sensor_msgs::ImageConstPtr& msg)
{

    try
    {
        cv::Mat image = cv_bridge::toCvCopy(msg,"bgr8")->image;
        ROS_INFO("Image is Empty %d  %d!",image.cols, image.rows);
        cv::imshow("view", image);
        cv::waitKey(5);
    }
    catch(const cv_bridge::Exception& e)
    {
        ROS_ERROR("cloud not convert from %s to bgr8", msg->encoding.c_str());
        std::cerr << e.what() << '\n';
    }
    
}

int main(int argc, char** argv)
{
    ros::init(argc, argv, "sublisher_img");
    ros::NodeHandle nh;


    cv::namedWindow("view");
    // cv::startWindowThread();
    image_transport::ImageTransport it(nh);
    image_transport::Subscriber sub = it.subscribe("image", 1, imageCallback);
    ros::spin();
    // cv::destroyWindow();
    // cv::destroyWindow("view");

    // cv::Mat image = cv::imread("/home/ghigher/workplace/pointcloud_ws/src/pub_sub_image/images/ros_logo.png");
    // if (image.empty())
    // {
    //     ROS_INFO("Image is Empty!");
    // }
    // sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image).toImageMsg();
    // ros::Rate loop_rate(5);

    // while(nh.ok())
    // {
    //     pub.publish(msg);
    //     ros::spinOnce();
    //     loop_rate.sleep();
    // }
}

写完程序后,还需要修改一下Cmakelist.txt,具体的在

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES test_launch
#  CATKIN_DEPENDS cv_bridge image_transport roscpp sensor_msgs
#  DEPENDS system_lib
)

###########
## Build ##
###########

后面加上

add_executable(img_pub src/img_pub.cpp)
target_link_libraries(img_pub ${catkin_LIBRARIES} ${Opencv_LIBS}) 

add_executable(img_sub src/img_sub.cpp)
target_link_libraries(img_sub ${catkin_LIBRARIES} ${Opencv_LIBS}) 

然后使用catkin_make编译一下,看看书在devel/lib文件夹下是否生成了test_launch/img_pub和test_launch/img_sub可执行文件。

3)尝试先用rosrun pkg node_name先把程序跑起来,然后再说其他的。

4)编写launch文件

首先在test_launch文件夹下新建一个launch文件夹,然后使用touch test_launch.launch命令,新建一个launch文件。

<launch>
    <node pkg = "test_launch" type = "img_sub" name = "img_sub" output = "screen"/>
	<node pkg = "test_launch" type = "img_pub" name = "img_pub" output = "screen"/>

</launch>

然后使用

catkin_make
source ./devel/setup.bash
roslaunch test_launch test_launch.launch

就可以把程序给启动起来。


网站公告

今日签到

点亮在社区的每一天
去签到