1.サーバーとクライアントを作成する必要があります。CLIentは追加する必要がある2つのint変数を送信し、サーバーは追加後に追加された値を返します
2.ディレクトリcatkin_ws / src / learning_sun / srvの下にAddTwoInts.srvという名前のsrvタイプのファイルを作成し、次のように入力します。
int64 a
int64 b
---
int64 sum
3.書き込んだ後、pcakage.xmlをコンパイルして接続し、依存ファイルを追加する必要があります。
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
4. package.xmlファイルを変更した後、引き続きCMakeList.txtファイルを変更し、最後のコードをcatkin_packageの上に追加します。
このコードは、コンパイルする前に、generate_messages()の前に配置する必要があります。
add_service_files(
FILES
AddTwoInts.srv
)
5.次に、/ catkin_ws / learning_sun / src /ディレクトリにserver.cppという名前のcppタイプのファイルを作成し、コードを入力します。
#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.サーバーを作成した後、クライアントClientも必要です。srcディレクトリにClinet.cppという名前のcppタイプのファイルを作成し、コードを入力します。
#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.クライアントの作成後、これら2つのファイルをコンパイルする必要があります。CMakeList.txtファイルを変更し、ファイルに次のコードを追加または変更する必要があります。
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.変更後、/ catkin_wsディレクトリに戻り、コマンドcatkin_make
を入力してコンパイルします。進行状況が100%に達したらコンパイルが完了します。
9.ターミナルを開き、roscoreと入力してROSシステムに入り、2番目のターミナルを開いてrosrun learning_sun server
コマンドを実行し、サーバーサーバーファイルを実行してから、3番目のターミナルを開きrosrun learning_sun client 3 5
、クライアントファイルを入力して実行します(ここで2つのパラメーターを入力する必要があります)。結果を出力します。
[ INFO] [1568978929.997013419]: Sum: 13
10.実験が完了しました