ROS之service编程的学习和理解

近期由于工作需要,需要学习service编成,故写该博客记录一下,以便日后查询方便,也可以方便各位网友的学习。
下面开始正题。。。。

创建工作空间

  mkdir -p ros_practice/src
  cd ros_practice/src/
  catkin_init_workspace 
  cd ../
  catkin_make
  //添加环境变量
  echo "source  ~ros_practice/devel/setup.bash" >> ~/.bashrc
  source ~/.bashrc

创建Ros功能包和元功能包

cd ros_practice/src/
catkin_create_pkg learn_service roscpp rospy std_msgs  // catkin_create_pkg [package_name] [dependency1] [dependency1] ...
cd ../    //回退到ros_prctice目录下
catkin_make	//编译

创建服务

  • 在元功能包文件夹下创建名为srv的文件夹
  • 在srv文件夹下创建multnum.srv文件
    multnum.srv内容:
float32 a
float32 b
---
float32 c
string d

package.xml内容更改

在这里插入图片描述
以上三行取消注释

CMakeLists.txt内容修改

cmake_minimum_required(VERSION 3.0.2)
project(learn_service)

## Compile as C++11, supported in ROS Kinetic and newer
# add_compile_options(-std=c++11)


find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation  //添加

)

## System dependencies are found with CMake's conventions
# find_package(Boost REQUIRED COMPONENTS system)

## Generate messages in the 'msg' folder
# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

## Generate services in the 'srv' folder
add_service_files(
   FILES
   multnum.srv      //添加
 )

## Generate actions in the 'action' folder
# add_action_files(
#   FILES
#   Action1.action
#   Action2.action
# )

## Generate added messages and services with any dependencies listed here
generate_messages(
   DEPENDENCIES
   std_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learn_service
  CATKIN_DEPENDS roscpp rospy std_msgs message_generation   //添加
#  DEPENDS system_lib
)

include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

add_executable(service src/service.cpp)
target_link_libraries(service ${catkin_LIBRARIES})
add_dependencies(service learn_service_gencpp)
 
add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client learn_service_gencpp)

编译:

cd 到learn_service目录下
catkin_make

查看服务:

ubuntu@ubuntu-virtual-machine:~/ros_practice$ rossrv show learn_service/multnum 
float32 a
float32 b
---
float32 c
string d

以上就说明编译成功,接下来就可以写节点实现自己的功能了。

节点的编写:

client.cpp

#include <cstdlib>
#include "ros/ros.h"
#include "learn_service/multnum.h"
 
int main(int argc, char **argv)
{
  // ROS节点初始化
  ros::init(argc, argv, "lient");
  
  // 从终端命令行获取两个加数
  if (argc != 3)
  {
    ROS_INFO("usage: add_two_ints_client X Y");
    return 1;
  }
 
  // 创建节点句柄
  ros::NodeHandle n;
  
  // 创建一个client,请求add_two_int service,service消息类型是learning_communication::AddTwoInts
  ros::ServiceClient client = n.serviceClient<learn_service::multnum>("add_two_ints");
  
  // 创建learning_communication::AddTwoInts类型的service消息
  learn_service::multnum addsrv;
  addsrv.request.a = atoll(argv[1]);
  addsrv.request.b = atoll(argv[2]);
  
  // 发布service请求,等待加法运算的应答结果
  if (client.call(addsrv))
  {
    ROS_INFO("Sum: %ld", (long int)addsrv.response.c);
  }
  else
  {
    ROS_ERROR("Failed to call service add_two_ints");
    return 1;
  }
 
  return 0;
}

service.cpp

#include "ros/ros.h"
#include "learn_service/multnum.h"
#include "std_msgs/String.h"
 
// service回调函数,输入参数req,输出参数res
bool AddCallback(learn_service::multnum::Request  &req,
         learn_service::multnum::Response &res)
{
  // 将输入参数中的请求数据相加,结果放到应答变量中

  std::stringstream ss;
  ss << "hello world ";

  res.c = req.a + req.b;
  res.d = ss.str();
  ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
  ROS_INFO("sending back response: [%ld]", (long int)res.c);
  ROS_INFO("%s", res.d.c_str());
  return true;
}
 
int main(int argc, char **argv)
{
  // ROS节点初始化
  ros::init(argc, argv, "service");
  
  // 创建节点句柄
  ros::NodeHandle n;
 
  // 创建一个名为add_two_ints的server,注册回调函数add()
  ros::ServiceServer service = n.advertiseService("add_two_ints", AddCallback);
  
  // 循环等待回调函数
  ROS_INFO("Ready to add two ints.");
  ros::spin();
 
  return 0;
}

编译完成就可以运行啦!

启动服务端后运行以下代码就可以得到反馈。

rosrun learn_service client 3 4
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xp_fangfei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值