(C++)ROS 通信编程之服务编程

准备

先扯一下自定义的问题,后面service编程需要自定义srv文件。以msg为例。
自定义msg文件:新建一个msg文件夹,里面再新建一个Person.msg文件,文件里写上信息。

(C++)ROS 通信编程之服务编程_第1张图片

修改communication包的package.xml和CMakeList.txt,package.xml里面添加功能包依赖,CMakeList.txt 添加编译选项,之后回到catkin_ws用catkin_make编译。

  • package.xml

在这里插入图片描述

  • CMakeLists.txt

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • catkin_make

(C++)ROS 通信编程之服务编程_第2张图片

  • 终端中用rosmsg show Person查看msg信息。

(C++)ROS 通信编程之服务编程_第3张图片

服务编程service

(C++)ROS 通信编程之服务编程_第4张图片

如何自定义服务请求与应答

自定义srv文件
类似于之前的msg,package.xml里面添加功能包依赖,CMakeList.txt添加编译选项,之后回到catkin_ws用catkin_make编译。

(C++)ROS 通信编程之服务编程_第5张图片

(C++)ROS 通信编程之服务编程_第6张图片

(C++)ROS 通信编程之服务编程_第7张图片

以三条横线分割,上半部分是服务的请求数据,下半部分是应答数据,客户端发布a、b给服务端,服务器算完之后将sum发送给客户端。

package.xml跟之前msg一样。
在这里插入图片描述

CMakeList.txt略有不同

(C++)ROS 通信编程之服务编程_第8张图片

下面这一步的几行代码要注意顺序。
(C++)ROS 通信编程之服务编程_第9张图片
在这里插入图片描述

catkin_make…

服务编程流程

1.创建服务器

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

在下图中可以看到之前catkin_make 之后会在devel下面生成AddTwoints.h文件,这个在代码中会用到。

(C++)ROS 通信编程之服务编程_第10张图片

(C++)ROS 通信编程之服务编程_第11张图片

代码

//server.cpp
#include "ros/ros.h"
#include "communication/AddTwoints.h"

bool add(communication::AddTwoints::Request &req,
		communication::AddTwoints::Response &res)
{
	//将输入参数中的请求数据相加,结果放到应答变量中
	res.sum = req.a + req.b;
	ROS_INFO("request: x = %ld, y = %ld ",(long int)req.a,(long int)req.b);
	ROS_INFO("sending back response:[%ld]",(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;
}

(C++)ROS 通信编程之服务编程_第12张图片

2.创建客户端

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

代码

//client.cpp
#include
#include"ros/ros.h"
#include"communication/AddTwoints.h"

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

	//从终端命令行获取两个加数
	if(argc != 3)
	{
	ROS_INFO("usage: add_two_ints_client X Y");
	return 1;	
	}

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

	//创建一个client,请求add_two_ints service,service消息类型是communication::AddTwoints
	ros::ServiceClient client = n.serviceClient("add_two_ints");

	//创建communication::AddTwoints类型的service消息
	communication::AddTwoints srv;
	srv.request.a = atoll(argv[1]);
	srv.request.b = atoll(argv[2]);

	//发布service请求,等待加法运算的应答结果
	if(client.call(srv))
	{
		ROS_INFO("sum: %ld",(long int)srv.response.sum);	
	}
	else
	{
		ROS_ERROR("Failed to call service add_two_ints");
		return 1;
	}

	return 0;
}

(C++)ROS 通信编程之服务编程_第13张图片

3.添加编译选项

CMakeLists.txt

add_executable(server src/server.cpp)
target_link_libraries(server ${catkin_LIBRARIES})
add_dependencies(server ${PROJECT_NAME}_gencpp)

add_executable(client src/client.cpp)
target_link_libraries(client ${catkin_LIBRARIES})
add_dependencies(client ${PROJECT_NAME}_gencpp)

(C++)ROS 通信编程之服务编程_第14张图片
catkin_make后的结果。可执行文件位置如图。

(C++)ROS 通信编程之服务编程_第15张图片

4.运行可执行程序

同样是通过rosrun的方式

(C++)ROS 通信编程之服务编程_第16张图片

(C++)ROS 通信编程之服务编程_第17张图片
(C++)ROS 通信编程之服务编程_第18张图片

server收到服务调用后完成加法求解,并将结果反馈给client

你可能感兴趣的:(Linux,and,ROS)