str_puber.cpp 发布 str
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
int main(int argc, char **argv) {
ros::init(argc, argv, "str_puber");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
ros::Rate loop_rate(10);
int count = 0;
while (ros::ok()) {
std_msgs::String msg;
std::stringstream ss;
ss << "hello world " << count; // string stream to ss
msg.data = ss.str(); // stringstream cvt to str
ROS_INFO("%s", msg.data.c_str()); // const pointer of str, show sending info
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
image_puber 发布 sensor_msgs::Image
-
cv_bridge
将 opencv Mat 转化为 ros sensor_msgs Image,注意编码格式 -
std_msgs::Header
设置图像相关属性,时间戳,sequence - CMakeLists.txt 添加
cv_bridge
等库
#include <ros/ros.h>
#include <std_msgs/Header.h>
#include <sensor_msgs/Image.h>
#include <cv_bridge/cv_bridge.h>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(int argc, char **argv) {
ros::init(argc, argv, "image_puber");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<sensor_msgs::Image>("/stereo/rgb/image", 1000);
ros::Rate loop_rate(10); // 10fps
// opencv mat Image
cv::Mat rgb = cv::imread("/home/nvidia/wali_ws/src/stereo/img/rgb.jpg");
// ros sensor_msg Image, attrs
sensor_msgs::ImagePtr rgb_msg;
std_msgs::Header header; // not necessary
header.frame_id = "/stereo/rgb/image"; // detailed header info
header.stamp = ros::Time::now(); // time stamp
unsigned int count = 0;
while (ros::ok()) {
header.seq = count;
rgb_msg = cv_bridge::CvImage(header, "bgr8", rgb).toImageMsg(); // color img
ROS_INFO("send rgb %d", count); // const pointer of str, show sending info
chatter_pub.publish(rgb_msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}
使用 image_view
测试是否收到
roscore
rosrun stereo image_puber
rosrun image_view image_view image:=/stereo/rgb/image
CMakeLists.txt
cmake_minimum_required(VERSION 2.8.3)
project(stereo)
## Compile as C++11, supported in ROS Kinetic and newer
add_compile_options(-std=c++11)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
sensor_msgs
std_msgs
cv_bridge
)
find_package(OpenCV REQUIRED)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES stereo
# CATKIN_DEPENDS roscpp rospy sensor_msgs std_msgs
# DEPENDS system_lib
)
###########
## Build ##
###########
## Specify additional locations of header files
## Your package locations should be listed before other locations
include_directories(
include
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(str_puber src/str_puber.cpp)
add_executable(image_puber src/image_puber.cpp)
## Add cmake target dependencies of the executable
## same as for the library above
# str_puber
add_dependencies(str_puber
${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS}
)
target_link_libraries(str_puber
${catkin_LIBRARIES}
)
# image_puber
add_dependencies(image_puber
${${PROJECT_NAME}_EXPORTED_TARGETS}
${catkin_EXPORTED_TARGETS}
)
target_link_libraries(image_puber
${catkin_LIBRARIES}
${OpenCV_LIBRARIES}
)
网友评论