yahboom
HomeLearn
Solution
Blog
Online Store
About Us
EN/中文
Raspberry Pi 4B📖
1.Preparation before use
  • 1.1 Download image
  • 1.2 Write image into SD card
  • 1.3 Start up Raspberry Pi
  • 1.4 Linux common commands
  • 1.5 Precautions
2.Basic course
  • 2.1 Log into Raspberry Pi system
  • 2.2 Change password and root account
  • 2.3 Remote transfer file
  • 2.4 Backup image file
  • 2.5 Fixing Raspberry Pi IP
  • 2.6 Set screen keep on
  • 2.7 Get Pi temperature
  • 2.8 Connect WIFI
  • 2.9 Modify Pi time
  • 2.10 Set the boot self-starting program
3.Expand course
  • 3.1 Serial port communicates with external devices
  • 3.2 2.Serial port login Pi
  • 3.3 Configured as a router
  • 3.4 Install Jupyter Lab
  • 3.5 Install Jupyter Widgets
  • 3.6 More Detail for Widgets
  • 3.7 Install OpenCV
  • 3.8 Install Tensorflow
4.Programming course
C language
  • 1.Development environment
  • 2.Print Hello World
  • 3.Pin output level
  • 4.Read pin level
  • 5.PWM output
Python language
  • 1.Development environment
  • 2.Print basic usage
  • 3.Pin output level
  • 4.Read pin level
  • 5.PWM output
5.AI vision course
A.Getting started with OpenCV
  • 6.Picture Rotation
  • 1.Introduction of OpenCV
  • 2.OpenCV image read and display
  • 3.OpenCV image write
  • 4.OpenCV image quality
  • 5.OpenCV pixel operation
B.OpenCV Geometric transformat
  • 1.Picture Zoom
  • 2.Picture Cut
  • 3.Picture Shift
  • 4.Picture Mirroring
  • 5.Affine Map
  • 7.Perspective Transformation
C.OpenCV picture processing
  • 1.Grayscale processing
  • 2.Image Binarization
  • 3.Edge detection
  • 4.Drawing line segment
  • 5.Drawing rectangle circle
  • 6.Drawing text picture
D.OpenCV image beautification
  • 1.Histogram of color pictures
  • 2.Histogram equalization
  • 3.Image restoration
  • 4.Brightness enhancement
  • 5.Skin whitening
  • 6.Gaussian mean filtering
  • 7.Median filtering
F.AI Advanced Course (Ubuntu system)
  • 1. QR code
  • 2. Human posture estimation
  • 3. Target detection
  • 4. Mediapipe development
  • 5. yolov4-tiny
E.Install TensorFlow
  • Install TensorFlow
6.ROS1 coursenew
Basic Course
  • 1.ROS introduction
  • 2.Project file structure
  • 3.Common commands and tools
  • 4.Publisher
  • 5.Subscribers
  • 6.Customize topic messages and use
  • 7.Client
  • 8.Server
  • 9.Custom service messages and usage
  • 10.TF release and monitoring
Visual Image Processing
  • 1. AR vision
  • 2. AR QR code
  • 3. ROS+Opencv foundation
  • 4. ROS+Opencv application
  • 5. MediaPipe development
7.ROS2 coursenew
Docker Course
  • 1.Overview and installation
  • 2.Common commands
  • 3.Understand and publish images
  • 4.Hardware interaction data processing
  • 5.Enter docker container
  • 6.Update docker images
Basic Course
  • 1.Introduction to ROS2
  • 2.Commands and tools
  • 3.ROS2 Topic communications
  • 4.ROS2 service communications
  • 5.ROS2launch file starts
OpenCV Course
  • 1.OpenCV Basic Course
  • 2.ROS+opencv application
  • 3.QR code recognition
  • 4.AR Vision
  • 5.Mediapipe
8.Accessories installation
  • 1. Installation of heat sink
  • 2. Wiring of cooling fan
  • 3. Double fan armor case Installation
  • 4. Argon NEO aluminum case installation
  • 5. Argon ONE aluminum alloy case installation
  • 6. Metal shell with built-in fan installation
  • 7. Acrylic case with cooling fan installation
  • 8. White-red ABS protective case installation
Download
  • Tools
  • C_code
  • Python code
  • ROS System
Download ZIP

Welcome to Raspberry Pi 4B repository

9.Custom service messages and usage

9. Custom service messages and usage

9. Custom service messages and usage 9.1 Custom service message 9.1.1 define srv file 9.1.2 Add function package dependencies in package.xml 9.1.3 Add compile options in CMakeLists.txt 9.1.4 Compile and generate language-related files 9.1.5 C++ language implementation 9.1.6 Python language implementation

9.1 Custom service message

Switch to the ~/catkin_ws/src/learning_server function package directory, and then create a new folder named srv to store custom service messages.

9.1.1 define srv file

Switch to the srv directory, create a new blank srv file, and use srv as the suffix to indicate that it is a srv file. Here we take IntPlus.srv as an example, and copy the following code into the srv file just created.

​x
uint8   a 
uint8   b 

--- 
uint8  result 

The composition of the srv file is described here, which is divided into upper and lower parts by the symbol ---, the upper part indicates the request and the lower part is the response.

9.1.2 Add function package dependencies in package.xml

xxxxxxxxxx
<build_depend>message_generation</build_depend> 
<exec_depend>message_runtime</exec_depend> 

9.1.3 Add compile options in CMakeLists.txt

xxxxxxxxxx
Add message_generation to find_package 
add_service_files(FILES IntPlus.srv) 
generate_messages(DEPENDENCIES std_msgs) 

9.1.4 Compile and generate language-related files

xxxxxxxxxx
cd ~/catkin_ws 
catkin_make 

9.1.5 C++ language implementation

  1. switch to ~/catkin_ws/src/learning_server/src, create two new cpp files, named IntPlus_server.cpp and IntPlus_client.cpp, and copy the following codes into them respectively,

IntPlus_server.cpp

xxxxxxxxxx
/** 
 * This routine will execute /Two_Int_Plus service, service data type learning_service::IntPlus 
 */ 
 
#include <ros/ros.h> 
#include "learning_server/IntPlus.h" 

// service callback function, input parameter req, output parameter res 
bool  IntPlusCallback(learning_server::IntPlus::Request   & req, 
                    learning_server::IntPlus::Response  & res) 
{ 
    
    ROS_INFO("number 1 is:%d,number 2 is:%d ", req.a, req.b); // Display request data 

    res.result  =  req.a  +  req.b; // The feedback result is the sum of the two numbers 

    return  res.result; 
} 

int  main(int  argc, char  ** argv) 
{ 
   
    ros::init(argc, argv, "IntPlus_server"); // ROS node initialization 
    
    ros::NodeHandle  n; // create node handle 

    // Create a server and register the callback function IntPlusCallback 
    ros::ServiceServer  Int_Plus_service  =  n.advertiseService("/Two_Int_Plus", IntPlusCallback); 

    // loop waiting for the callback function 
    ROS_INFO("Ready to caculate."); 
    ros::spin(); 

    return  0; 
} 

IntPlus_client.cpp

xxxxxxxxxx
/* 
 This routine will request /Two_Int_Plus service, service data type learning_service::IntPlus 
Add and sum two integers 
 */ 

#include <ros/ros.h> 
#include "learning_server/IntPlus.h" 
#include <iostream> 
using  namespace  std; 
int  main(int  argc, char**  argv) 
{ 
    int  i, k; 
    cin >> i; 
    cin >> k; 

    ros::init(argc, argv, "IntPlus_client"); // initialize the ROS node 

    
    ros::NodeHandle  node; // create node handle 

    // After discovering the /Two_Int_Plus service, create a service client 
    ros::service::waitForService("/Two_Int_Plus"); 
    ros::ServiceClient  IntPlus_client  =  node.serviceClient < learning_server::IntPlus >("/Two_Int_Plus"); 

    // Initialize the request data for learning_service::IntPlus 
    learning_server::IntPlus  srv; 
    srv.request.a  =  i; 
    srv.request.b   =  k; 

    ROS_INFO("Call service to plus %d and %d", srv.request.a, srv.request.b); // request service call 

    IntPlus_client.call(srv); 

    // Display the result of the service call 
    ROS_INFO("Show the result : %d", srv.response.result); // show the result of the service call 

    return  0; 
} 
  1. modify the CMakeLists.txt file
xxxxxxxxxx
add_executable(IntPlus_server src/IntPlus_server.cpp) 
target_link_libraries(IntPlus_server ${catkin_LIBRARIES}) 
add_dependencies(IntPlus_server ${PROJECT_NAME}_generate_messages_cpp) 

add_executable(IntPlus_client src/IntPlus_client.cpp) 
target_link_libraries(IntPlus_client ${catkin_LIBRARIES}) 
add_dependencies(IntPlus_client ${PROJECT_NAME}_generate_messages_cpp) 
  1. the core part

The implementation process here is the same as before, the main difference is the introduction of header files and the use of custom service files:

The import header file is

xxxxxxxxxx
#include "learning_server/IntPlus.h" 

The front learning_server is the function package name, and the latter IntPlus.h is the header file name generated by the srv file just created

Using a custom service file is

xxxxxxxxxx
client: 
learning_server::IntPlus  srv; 
srv.request.a  =  i; 
srv.request.b   =  k; 
#i, k is the addend input by the terminal 
ros::ServiceClient  IntPlus_client  =  node.serviceClient < learning_server::IntPlus >("/Two_Int_Plus"); 
IntPlus_client.call(srv); 
server: 
ros::ServiceServer  Int_Plus_service  =  n.advertiseService("/Two_Int_Plus", IntPlusCallback); 
bool  IntPlusCallback(learning_server::IntPlus::Request   & req, 
                    learning_server::IntPlus::Response  & res) 
  1. run the program
xxxxxxxxxx
roscore 
rosrun  learning_server  IntPlus_client 
rosrun  learning_server  IntPlus_server 
  1. run the screenshot

image-20220225122525963

  1. program description

After running IntPlus_server, you will be prompted to prepare for calculation; after running IntPlus_client, the terminal will input two integer numbers, then IntPlus_server will calculate the result, return it to IntPlus_client, and then print the result.

9.1.6 Python language implementation

  1. switch to ~/catkin_ws/src/learning_server/script, create two new py files, named IntPlus_server.py and IntPlus_client.py, and copy the following codes into them respectively,

IntPlus_server.py

xxxxxxxxxx
# !/usr/bin/env python 
# -*- coding: utf-8 -*- 
import  rospy 

from  learning_server.srv  import  IntPlus, IntPlusResponse 

 def IntPlusCallback(req): 
    
    rospy.loginfo("Ints: a:%db:%d", req.a, req.b) # show request data 
    
    return  IntPlusResponse(req.a + req.b) # Feedback data 

 def IntPlus_server(): 
    
    rospy.init_node ' IntPlus_server(') # ROS node initialization 

    # Create a server and register the callback function IntPlusCallback 
    s  =  rospy.Service('/Two_Int_Plus', IntPlus, IntPlusCallback) 

    
    print  "Ready to caculate two ints." # Loop waiting for the callback function 

    rospy.spin() 

if  __name__  ==  "__main__" : 
    IntPlus_server() 

IntPlus_client.py

xxxxxxxxxx
# !/usr/bin/env python 
# -*- coding: utf-8 -*- 
import  sys 
import  rospy 
from  learning_server.srv  import  IntPlus, IntPlusRequest 

 def Plus_client(): 
    # ROS node initialization 
    rospy.init_node('IntPlus_client') 

    rospy.wait_for_service('/Two_Int_Plus') 
    try : 
        Plus_client  =  rospy.ServiceProxy('/Two_Int_Plus', IntPlus) 

        response = Plus_client(22, 20) # Request service call, enter request data 

        return  response.result 
    except  rospy.ServiceException, e : 
        print  "failed to call service : %s" % e 

if  __name__  ==  "__main__" : 
    #Service call and display the call result 
    print  "Show two_int_plus result : %s"  %(Plus_client()) 
  1. the core part

Here is mainly to explain how to import the custom service message module and use it:

import

xxxxxxxxxx
server : 
from  learning_server.srv  import  IntPlus, IntPlusResponse 
client : 
from  learning_server.srv  import  IntPlus, IntPlusRequest 

use

xxxxxxxxxx
server: 
s  =  rospy.Service('/Two_Int_Plus', IntPlus, IntPlusCallback) 
return  IntPlusResponse(req.a + req.b) # Feedback data 
client: 
response = Plus_client(12, 20) # Request service call, enter request data 
return  response.result 
  1. run the program

Before running the program, first add executable permissions to the py file

xxxxxxxxxx
sudo chmod a+x IntPlus_server.py 
sudo chmod a+x IntPlus_client.py 

run the program

xxxxxxxxxx
roscore 
rosrun learning_server IntPlus_client.py 
rosrun learning_server IntPlus_server.py 
  1. program operation instructions

What is inconsistent with the C++ version here is that the addend here is set in the program(12 and 20) so after the service is started, the result can be returned immediately.

Server
TF release and monitoring

COMPANY

  • About us
  • Team Style
  • Blog

LEARNING & EXPLORATION

  • Tutorials
  • Edge AI hardware
  • Educational robots
  • Embedded intelligent hardware

WHERE TO BUY

  • Yahboom Online Store
  • Amazon
  • Alibaba
  • AliExpress
  • Mercado

TECHNOLOGY SUPPORT

  • Email: support@yahboom.com

BE A DISTRIBUTOR

  • Email: sales@yahboom.com
QR Code
QR Code

Copyright © 2017-2026 Yahboom. All Rights Reserved.

EN/中文