ROS学习笔记(七)(自定义服务数据)

1.我们需要创建一个Server与Client,CLient发送两个需要相加的int变量,由Server相加后返回相加的值

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.编写好server之后,我们还需要一个客户端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.Client编写好之后,我们需要编译这两个文件,就需要修改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系统,开第二个终端运行rosrun learning_sun server命令运行server服务器文件,然后开第三个终端,输入rosrun learning_sun client 3 5运行客户端文件,(此处注意要输入两个参数),输出结果:

[ INFO] [1568978929.997013419]: Sum: 13

10.实验到此完成

猜你喜欢

转载自blog.csdn.net/weixin_41407439/article/details/101068383
今日推荐