Diretório do artigo
Escrever Serviço Node
Aqui, vamos criar um nó serviço simples ( "add_two_ints_server"), o nó receberá duas figuras de plástico, e retorna a soma deles.
Beginner_tutorials pacote para o diretório que você criou anteriormente no catkin espaço de trabalho tutorial aqui:
cd ~/catkin_ws/src/beginner_tutorials
Certifique-se de criar as etapas do tutorial AddTwoInts.srv srv criou este tutorial necessário (não se esqueça de selecionar o sistema compilador correspondente "catkin" e "rosbuild").
código
Criando src / add_two_ints_server.cpp arquivo de pacote beginner_tutorials, e copie e cole o seguinte código:
1 #include "ros/ros.h"
2 #include "beginner_tutorials/AddTwoInts.h"
3
4 bool add(beginner_tutorials::AddTwoInts::Request &req,
5 beginner_tutorials::AddTwoInts::Response &res)
6 {
7 res.sum = req.a + req.b;
8 ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]", (long int)res.sum);
10 return true;
11 }
12
13 int main(int argc, char **argv)
14 {
15 ros::init(argc, argv, "add_two_ints_server");
16 ros::NodeHandle n;
17
18 ros::ServiceServer service = n.advertiseService("add_two_ints", add);
19 ROS_INFO("Ready to add two ints.");
20 ros::spin();
21
22 return 0;
23 }
explicação código
Agora, vamos análise passo a passo do código.
1 #include "ros/ros.h"
2 #include "beginner_tutorials/AddTwoInts.h"
3
beginner_tutorials / AddTwoInts.h automaticamente de acordo com o arquivo srv arquivo de cabeçalho que criou anteriormente a ser gerado pelo sistema de arquivos SRV compilador.
4 bool add(beginner_tutorials::AddTwoInts::Request &req,
5 beginner_tutorials::AddTwoInts::Response &res)
Estes valores int função são somadas para fornecer dois serviços, pedido de aquisição de valor int a partir do interior, e retorna os dados carregados no Response, estes tipos de dados são definidos no arquivo srv interior, a função retorna um valor booleano.
6 {
7 res.sum = req.a + req.b;
8 ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]", (long int)res.sum);
10 return true;
11 }
Agora, foram adicionados dois valores int e armazenados na resposta. Em seguida, algumas das informações sobre a solicitação ea resposta é gravado. Finalmente, o serviço retorna um valor verdadeiro após a conclusão do cálculo.
18 ros::ServiceServer service = n.advertiseService("add_two_ints", add);
Aqui, o serviço foi estabelecida, e publicá-lo no ROS.
nó write cliente
código
Criando src / add_two_ints_client.cpp arquivo de pacote beginner_tutorials, e copie e cole o seguinte código:
1 #include "ros/ros.h"
2 #include "beginner_tutorials/AddTwoInts.h"
3 #include <cstdlib>
4
5 int main(int argc, char **argv)
6 {
7 ros::init(argc, argv, "add_two_ints_client");
8 if (argc != 3)
9 {
10 ROS_INFO("usage: add_two_ints_client X Y");
11 return 1;
12 }
13
14 ros::NodeHandle n;
15 ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
16 beginner_tutorials::AddTwoInts srv;
17 srv.request.a = atoll(argv[1]);
18 srv.request.b = atoll(argv[2]);
19 if (client.call(srv))
20 {
21 ROS_INFO("Sum: %ld", (long int)srv.response.sum);
22 }
23 else
24 {
25 ROS_ERROR("Failed to call service add_two_ints");
26 return 1;
27 }
28
29 return 0;
30 }
explicação código
Agora, vamos análise passo a passo do código.
15 ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
Esse código cria um cliente é o serviço add_two_ints. objetos ros :: ServiceClient pode ser usado para chamar o serviço.
16 beginner_tutorials::AddTwoInts srv;
17 srv.request.a = atoll(argv[1]);
18 srv.request.b = atoll(argv[2]);
Aqui, nós instanciar um compilador gerado automaticamente por classe de serviço do sistema ROS, e seu pedido aos membros da missão. A classe de serviço inclui dois membros do pedido e resposta. Ele também inclui duas definições de classe Request e Response.
19 if (client.call(srv))
Este código está chamando serviço. Desde que a chamada de serviço é o processo modal (um processo chamado quando a ocupação impedir a execução de outro código), assim que a chamada for concluída, os resultados vão retornar a chamada. Se o serviço de chamada for bem sucedida, ligue para () função retorna TRUE, srv.response dentro dos valores são valores legais. Se a chamada falhar, ligue para () devolve falsa, srv.response dentro do valor seria ilegal.
nó de compilação
Editá-lo novamente beginner_tutorials dentro CMakeLists.txt, arquivos localizados em ~ / catkin_ws / src / beginner_tutorials / CMakeLists.txt, e adicione o seguinte código no final do arquivo:
https://raw.github.com/ros/catkin_tutorials/master/create_package_srvclient/catkin_ws/src/beginner_tutorials/CMakeLists.txt
27 add_executable(add_two_ints_server src/add_two_ints_server.cpp)
28 target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
29 add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
30
31 add_executable(add_two_ints_client src/add_two_ints_client.cpp)
32 target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
33 add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
Este código irá gerar dois "add_two_ints_server" executável e "add_two_ints_client", os dois executáveis são colocados no diretório padrão de seu espaço devel pacote, o padrão é ~ / catkin_ws / devel / lib / share / . Você pode chamar programa diretamente executável ou usar o comando rosrun de chamá-los. Eles não são instalados no diretório / bin, porque quando você instalar este pacote no seu sistema, isso vai contaminar a variável PATH. Se você sempre quis instalar um programa executável na sua variável PATH dentro, você precisa configurar instalar alvo, consulte: catkin / CMakeLists.txt
Sobre o arquivo de CMakeLists.txt uma descrição mais detalhada, por favor consulte: catkin / CMakeLists.txt
Agora execute catkin_make comando:
# In your catkin workspace
cd ~/catkin_ws
catkin_make
Se o seu processo de compilação falhar por algum motivo:
Para garantir que o anterior criando as etapas do tutorial AddTwoInts.srv você cumpridos em conformidade com a operação.
Agora que você aprendeu como escrever um servidor e um cliente simples serviço ao cliente, iniciar um teste simples e serviço ao cliente, certo.