ROS 定义复杂服务消息类型并传递图像

接上一篇文章

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 定义复杂服务消息类型并传递图像_第1张图片

 完成这个作业参考了

ROS学习:定义复杂服务消息类型并传递图像 - 古月居 (guyuehome.com)

这篇文章 

你可能感兴趣的:(机器人)