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
就可以把程序给启动起来。