ros(一)使用消息传递图像+launch启动文件
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
就可以把程序给启动起来。