编写第一个ros service

注意:代码可在github中找到
https://github.com/heyanwei/rosdemo

  • 在工程目录下增加srv的文件夹,并创建add_srv.srv文件,在里面定义请求参数和返回结果
wilson@ubuntu:~/code/catkin/src/hello_demo$ ls
CMakeLists.txt  include  package.xml  src  srv
wilson@ubuntu:~/code/catkin/src/hello_demo$ cd srv/
wilson@ubuntu:~/code/catkin/src/hello_demo/srv$ ls
add_srv.srv
wilson@ubuntu:~/code/catkin/src/hello_demo/srv$ cat add_srv.srv 
int32 A
int32 B
int32 C
---
int32 sum
  • 在package.xml中增加以下两行定义
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • 在CMakeLists.txt中添加以下定义
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

## Generate services in the 'srv' folder
add_service_files(
   FILES
   add_srv.srv
)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES hello_demo
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)
  • 返回工作空间进行编译
wilson@ubuntu:~/code/catkin$ catkin_make
Base path: /home/wilson/code/catkin
Source space: /home/wilson/code/catkin/src
Build space: /home/wilson/code/catkin/build
Devel space: /home/wilson/code/catkin/devel
Install space: /home/wilson/code/catkin/install
  • 此时,会产生请求信息的头文件
wilson@ubuntu:~/code/catkin/devel/include/hello_demo$ ls
add_srv.h  add_srvRequest.h  add_srvResponse.h
  • 编写service代码
#include "ros/ros.h"
#include "hello_demo/add_srv.h"

bool add(hello_demo::add_srv::Request &req, 
    hello_demo::add_srv::Response &resp)
{
    resp.sum = req.A+req.B;
    ROS_INFO("service add handle...");

    return true;
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "service_add");

    ros::NodeHandle n;

    ros::ServiceServer service = n.advertiseService("serviceadd", add);
    ros::spin();

    return 0;
}
  • 编写客户端代码
#include "ros/ros.h"
#include "hello_demo/add_srv.h"

int main(int argc, char **argv)
{
    ros::init(argc, argv, "client_add");

    ros::NodeHandle n;
    ros::ServiceClient client = n.serviceClient<hello_demo::add_srv>("serviceadd");

    hello_demo::add_srv srv;

    srv.request.A = 1;
    srv.request.B = 2;

    if(client.call(srv))
    {
        ROS_INFO("client_add success, result: %d", srv.response.sum);
        return 1;
    }
    else
    {
        ROS_INFO("client_add failed...");
        return 0;
    }
}
  • 在CMakeLists.txt中添加以下定义
include_directories(
 include
  ${catkin_INCLUDE_DIRS}
)

add_executable(calcadd src/calcadd.cpp)
target_link_libraries(calcadd ${catkin_LIBRARIES})
add_dependencies(calcadd hello_demo_generate_messages_cpp)

add_executable(clientadd src/clientadd.cpp)
target_link_libraries(clientadd ${catkin_LIBRARIES})
add_dependencies(clientadd hello_demo_generate_messages_cpp)
  • 返回工作空间进行编译
wilson@ubuntu:~/code/catkin$ catkin_make
Base path: /home/wilson/code/catkin
Source space: /home/wilson/code/catkin/src
Build space: /home/wilson/code/catkin/build
Devel space: /home/wilson/code/catkin/devel
Install space: /home/wilson/code/catkin/install
  • 运行roscore
wilson@ubuntu:~/code/catkin$ roscore
... logging to /home/wilson/.ros/log/d5fa44f2-3d2e-11ea-ba87-000c29eec410/roslaunch-ubuntu-21874.log
  • 激活并运行服务
wilson@ubuntu:~/code/catkin$ source devel/setup.bash 
wilson@ubuntu:~/code/catkin$ rosrun hello_demo calcadd 
[ INFO] [1579708280.921439498]: service add handle...
  • 激活并运行客户端
wilson@ubuntu:~/code/catkin$ rosrun hello_demo clientadd 
[ INFO] [1579708288.662391813]: client_add success, result: 3
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值