1. Necesitamos crear un servidor y un cliente, CLIent envía dos variables int que deben agregarse y el servidor devuelve el valor agregado después de la adición.
2. Cree un archivo de tipo srv llamado AddTwoInts.srv en el directorio catkin_ws / src / learning_sun / srv e ingrese:
int64 a
int64 b
---
int64 sum
3. Después de escribir, debe compilar y conectar pcakage.xml y agregar archivos dependientes:
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
4. Después de modificar el archivo package.xml, continuamos modificando el archivo CMakeList.txt y agregamos el último fragmento de código arriba de catkin_package: Tenga en cuenta que este fragmento de
código debe colocarse delante de generate_messages () antes de que pueda compilarse
add_service_files(
FILES
AddTwoInts.srv
)
5. Luego creamos un archivo de tipo cpp llamado server.cpp en el directorio / catkin_ws / learning_sun / src / e ingresamos el código:
#include "ros/ros.h"
//这里使用的头文件是learning_sun/AddTwoInts.h,改头文件根据我们之间创建的服务数据类型的描述文件AddTwoInts.srv自动生成
#include "learning_sun/AddTwoInts.h"
//service回调函数,输入参数req,输出参数res
bool add(learning_sun::AddTwoInts::Request &req,
learning_sun::AddTwoInts::Response &res)
{
//将参数中的请求数据相加,结果放入应答变量中
res.sum = req.a + req.b;
ROS_INFO("request: x=%1d,y=%1d" ,(long int)req.a,(long int)req.b);
ROS_INFO("sending back response: [%1d]" ,(long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
//ROS节点初始化,创建节点名称
ros::init(argc, argv, "add_two_ints_server");
//创建节点句柄
ros::NodeHandle n;
//创建一个名为add_two_ints的server,注册回调函数add()
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
//循环等待回调函数
ROS_INFO("Ready to add two ints!");
ros::spin();
return 0;
}
6. Después de escribir el servidor, también necesitamos un cliente Cliente. Creamos un archivo tipo cpp llamado Clinet.cpp en el directorio src e ingresamos el código:
#include <cstdlib>
#include "ros/ros.h"
#include "learning_sun/AddTwoInts.h"
int main(int argc, char **argv)
{
//ROS节点初始化
ros::init(argc, argv, "add_two_ints_client");
//从终端命令行获取两个加数,if(argc != 3)的意思是引导用户输入不超过三个参数,即输入两个参数
if(argc != 3)
{
ROS_INFO("usage: add_two_ints_client X and Y");
return 1;
}
//创建节点句柄
ros::NodeHandle n;
/*
*功能:创建一个add_two_ints的Client实例,指定服务类型为learning_sun::AddTwoInts
*/
ros::ServiceClient client = n.serviceClient<learning_sun::AddTwoInts>("add_two_ints");
/*
*功能:实例化一个服务类型数据的变量,该变量包含两个成员:request与response,
* 将节点运行时输入的两个参数作为需要相加的两个整数型存储到变量中
*/
learning_sun::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
//进行服务调用,如果调用过程会发生阻塞,如果调用成功则返回ture,调用失败则返回false.srv.response则不可用
if(client.call(srv))
{
ROS_INFO("Sum: %1d", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failed to call service add_two_ints");
return 1;
}
return 0;
}
7. Después de escribir el Cliente, necesitamos compilar estos dos archivos, necesitamos modificar el archivo CMakeList.txt, agregar o modificar el siguiente código en el archivo:
add_executable(server src/server.cpp)
add_executable(client src/client.cpp)
add_dependencies(server ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(client ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(server ${catkin_LIBRARIES} )
target_link_libraries(client ${catkin_LIBRARIES} )
8. Después de la modificación, regrese al directorio / catkin_ws, ingrese el comando catkin_make
para compilar y la compilación estará completa cuando el progreso alcance el 100%.
9. Abra el terminal, ingrese roscore para ingresar al sistema ROS, abra el segundo terminal para ejecutar el rosrun learning_sun server
comando para ejecutar el archivo del servidor del servidor, y luego abra el tercer terminal, ingrese y rosrun learning_sun client 3 5
ejecute el archivo del cliente (tenga en cuenta que se deben ingresar dos parámetros aquí), y el resultado de salida:
[ INFO] [1568978929.997013419]: Sum: 13
10. El experimento ya está completo.