ROS服务数据的定义与使用

如何自定义话题消息:

  • 定义srv文件;
//Person.srv
string name
uint8 age
uint8 sex

uint8 unknown=0
uint8 male =1
uint8 female =2
---
string result

  • 在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

  • 在CMakeLists.txt添加编译选项
find_package(...... message_generation)

add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(...... message_runtime)

  • 编译生成语言相关文件 

===============

如何实现一个服务端

  • 初始化ROS节点
  • 创建Server实例
  • 循环等待服务请求,进入回调函数
  • 在回调函数中完成服务功能的处理,并反馈应答数据。

person_server.cpp

//创建服务器代码(C++)
/**
* 该例程将执行 /show_person 服务,服务数据类型 learning_service::Person
*/
#include<ros/ros.h>
#include"learning_service/Person.h"

//service 回调函数,输入参数req,输出参数res
bool personCallback(learning_service::Person::Request &req,learning_service::Person::Response &res)
{
    //显示请求数据
    ROS_INFO("Person: name:%s age:%d sex:%d",req.name.c_str(),req.age,req.sex);

    //设置反馈数据
    res.result="OK";

    return true;
}   

int main(int argc,char **argv)
{
      //ROS节点初始化
      ros::init(argc,argv,"person_server");

      //创建节点句柄
      ros::NodeHandle n;
  

      //创建一个名为 /show_person 的server,注册回调函数personCallback
      ros::ServiceServer person_service=n.advertiseService("/show_person",personCallback);

      //循环等待回调函数
      ROS_INFO("Ready to show person information.");
      ros::spin();

      return 0;
}
      

==================

如何实现一个客户端

  • 初始化ROS节点
  • 创建一个Client实例
  • 发布服务请求数据
  • 等待Server处理之后的应答结果

person_client.cpp

//创建客户端代码(C++)
/**
* 该例程将请求 /show_person 服务,服务数据类型 learning_service::Person
*/
#include<ros/ros.h>
#include"learning_service/Person.h"

int main(int argc,char **argv)
{
      //ROS节点初始化
      ros::init(argc,argv,"person_client");

      //创建节点句柄
      ros::NodeHandle node;
  

      //发现 /spawn服务后,创建一个服务客户端,连接名为/spawn的service
      ros::service::waitForService("/show_person);
      ros::ServiceClient person_client=node.serviceClient<learning_service::Person>("/show_person");

      //初始化learning_service::Person的请求数据
      learning_service::Person srv;
      srv.request.name="Tom";
      srv.request.age=20;
      srv.request.sex=learning_service::Person::Request::male;

      //请求服务调用
      ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]",srv.request.name.c_str(),srv.request.age,srv.request.sex);

      person_client.call(srv);

      //显示服务调用结果
      ROS_INFO("Show person result : %s",srv.response.result.c_str());

      return 0;
}
      

 ==================

配置代码编译规则

如何配置CMakeList.txt中的编译规则

  • 设置需要编译的代码和生成的可执行文件
  • 设置链接库
  • 添加依赖项
    ## Declare a C++ executable
    ## With catkin_make all packages are built within a single CMake context
    ## The recommended prefix ensures that target names across packages don't collide
    # add_executables(${PROJECT_NAME}_node src/learning_topic_node.cpp)
    
    ## Specify libraries to link a library or executable target against
    # target_link_libraries(${PROJECT_NAME}_node
    #    ${catkin_LIBRARIES}
    # )
    
    ## Add cmake target dependencies of the executable
    ## same as for the library above
    # add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    
    add_executable(person_server src/person_server.cpp)
    target_link_libraries(person_server ${catkin_LIBRARIES})
    add_dependencies(person_server ${PROJECT_NAME}_gencpp)
    
    add_executable(person_client src/person_client.cpp)
    target_link_libraries(person_client ${catkin_LIBRARIES})
    add_dependencies(person_client ${PROJECT_NAME}_gencpp)
    

    ======================

    编译并运行服务端和客户端

cd ~/catkin_ws
catkin_make
source devel/setup.bash
roscore
rosrun learning_service person_server
rosrun learning_service person_client

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值