接上一篇文章
http://t.csdn.cn/bBTA6
老师又发布了一个新作业
创建工作空间到环境配置
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src
catkin_init_workspace
cd ~/catkin_ws
catkin_make
source devel/setup.bash
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
echo $ROS_PACKAGE_PATH
创建功能包,取名为image_service
cd ~/catkin_ws/src
catkin_create_pkg image_service roscpp rospy std_msgs sensor_msgs cv_bridge
创建cpp程序文件
cd ~/catkin_ws/src/image_service/src
gedit image_sever.cpp
#include
#include
#include
#include "image_service/Image.h"
bool imageCallback(image_service::Image::Request &req, image_service::Image::Response &res)
{
cv_bridge::CvImagePtr cv_ptr = cv_bridge::toCvCopy(req.img, sensor_msgs::image_encodings::TYPE_8UC3);
cv::Mat CurrentImg = cv_ptr->image;
ROS_INFO("Recived image.");
res.result = "ok";
return true;
}
int main(int argc,char **argv)
{
ros::init(argc,argv,"image_server");
ros::NodeHandle n;
ros::ServiceServer image_service = n.advertiseService("/gimbal_image",imageCallback);
ROS_INFO("Image server is ready.");
ros::spin();
return 0;
}
gedit image_client.cpp
#include
#include
#include
#include
#include
#include "image_service/Image.h"
int main(int argc,char **argv)
{
ros::init(argc,argv,"image_client");
ros::NodeHandle node;
ros::service::waitForService("/gimbal_image");
ros::ServiceClient image_client = node.serviceClient("/gimbal_image");
cv::Mat img = cv::imread("test.JPG", CV_LOAD_IMAGE_COLOR);
sensor_msgs::ImagePtr msg = cv_bridge::CvImage(std_msgs::Header(), "bgr8", img).toImageMsg();
sensor_msgs::Image msg1 = *msg;
image_service::Image srv;
srv.request.img = *msg;
image_client.call(srv);
ROS_INFO("result:%s .", srv.response.result.c_str());
return 0;
}
配置CMakeLists.txt文件
cd ..
gedit CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(image_service)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
roscpp
rospy
sensor_msgs
std_msgs
message_generation
)
find_package(OpenCV 3 REQUIRED)
add_service_files(FILES Image.srv)
generate_messages(DEPENDENCIES std_msgs sensor_msgs)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES image_service
CATKIN_DEPENDS cv_bridge roscpp rospy sensor_msgs std_msgs message_runtime
# DEPENDS system_lib
)
include_directories(${OpenCV_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
add_executable(image_sever src/image_sever.cpp)
target_link_libraries(image_sever ${catkin_LIBRARIES} ${OpenCV_LIBS})
add_dependencies(image_sever ${PROJECT_NAME}_gencpp)
add_executable(image_client src/image_client.cpp)
target_link_libraries(image_client ${catkin_LIBRARIES} ${OpenCV_LIBS} )
add_dependencies(image_client ${PROJECT_NAME}_gencpp)
配置package.xml文件
gedit package.xml
image_service
0.0.0
The image_service package
abb
TODO
catkin
cv_bridge
roscpp
rospy
sensor_msgs
std_msgs
cv_bridge
roscpp
rospy
sensor_msgs
std_msgs
cv_bridge
roscpp
rospy
sensor_msgs
std_msgs
message_generation
message_runtime
定义服务消息
cd ~/catkin_ws/src/image_service
mkdir srv
cd srv
gedit Image.srv
##Image.srv
sensor_msgs/Image img
---
string result
编译程序
cd ~/catkin_ws
catkin_make
source devel/setup.bash
运行程序
roscore
rosrun image_service image_client
rosrun image_service image_sever
完成这个作业参考了
ROS学习:定义复杂服务消息类型并传递图像 - 古月居 (guyuehome.com)
这篇文章