ROS学习(二)——服务通信的C++实现

ROS学习(二)——服务通信的C++实现.

引言:本文分为三个部分,分别为服务通信的理论模型、自定义srv文件的导入以及服务端和响应端对应的C++实现。

一、服务通信理论模型

服务通信的理论模型与单片机的中断模式类似,我们先将服务端程序挂起,然后只有当客户端发出请求的时候,服务端才会响应,调用对应的回调函数。在这里我们也举一个比较简单的例子:服务端进行加和运算,把客户端发来的两个数字求和并输出。

二、自定义srv文件的导入

在本例子中,我们需要3个变量:即客户端要输入的2个数字num1,num2,以及服务端响应的求和结果sum,他们都是整形变量,步骤如下:

1.创建srv文件

在功能包下新建srv文件夹,在其中创建后缀为srv的文件,这里设置为srv.srv,并在其中写入需要用到的变量,上为客户端请求变量,下为服务端响应变量,中间用—分割。

int32 num1
int32 num2
---
int32 sum

2.编辑配置文件(package.xml与CMakeLists.txt)

  #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
)
add_service_files(
  FILES
  srv.srv
)
generate_messages(
  DEPENDENCIES
  std_msgs
)

3.编译

catkin_make

4.导入头文件路径

编译之后我们就可以在devel/include/test_link和devel/lib/python3/dist-packages/test_link/srv下看到供我们引用的srv.h和srv.py文件。

我们在.vscode/c_cpp_properties.json文件中导入头文件路径"/home/hqs/ros_demo/devel/include/**"完成C++头文件的导入。

#include "test_link/srv.h"

我们在.vscode/settings.json文件中导入头文件路经 "/opt/ros/noetic/lib/python3/dist-packages"完成Python文件的导入。

from test_link.srv import srv

三、C++服务通信实现

1.服务端实现:

(1)导入头文件

#include "ros/ros.h"
#include "test_link/srv.h"

(2)初始化节点,并创建节点句柄

 ros::init(argc,argv,"node_name_server");
 ros::NodeHandle nh;

(3)创建服务端对象

//nh.advertiseService("节点名称",回调函数名称);
ros::ServiceServer srv = nh.advertiseService("topic_name_server",callback);
spin()  					//官方建议

(4)回调函数编写

bool callback(test_link::srv::Request &request,
              test_link::srv::Response &response)
{
    int num1 = request.num1;
    int num2 = request.num2;
    ROS_INFO("受到的请求数据为:%d与%d",num1,num2);
    int sum = num1 + num2;
    response.sum = sum;
    return true;
}

(5)CMakeLists.txt配置

add_executable(demo_server src/demo_server.cpp)

target_link_libraries(demo_server
${catkin_LIBRARIES}
)

2.客户端实现

(1)导入头文件略

(2)初始化节点略,创建句柄略

(3)创建客户端对象

ros::ServiceClient client = nh.serviceClient<test_link::srv>("topic_name_server");

(4)创建响应对象并指定main函数输入

test_link::srv srv;
srv.request.num1 = atoi(argv[1]); 
srv.request.num2 = atoi(argv[2]);
上传数据,等待响应
client.call(srv)

(5)CMakeLists.txt配置略

(6)编译

3.结果演示

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ROS(机器人操作系统)是一款广泛应用于机器人领域的操作系统,其开发环境为C++,但也可以使用其他编程语言进行开发,例如Python、Java和Lua等。对于TCP对外通信实现ROS同样提供了基于C语言的API接口,用户可以通过ROS提供的TCP通信实现对外通信。 在ROS中,网络通信最常用的方法是ROS通信机制。ROS通信机制使用了ROS自己定义的一套TCP/IP协议,可以在不同节点之间进行通信ROS提供了很多通信协议,例如发布/订阅、服务和参数服务器等。其中,发布/订阅是ROS中最常用的通信方式之一,它允许一个节点将数据发布到话题中,其他节点则可以在需要的时候订阅这个话题,并接受到发布的数据。 在ROS中通过C语言实现TCP对外通信,首先需要使用ROS提供的ROS Transport库,该库提供了一个高效、可扩展的通信架构,支持多种传输类型,包括TCP、UDP、Shared Memory等。接下来,用户需要使用C语言编写节点,注册话题,并在话题中发布数据。在另一个节点中,用户则可以使用C语言编写服务节点,并在服务中监听指定的端口,以接受来自其他节点的TCP连接请求。一旦TCP连接建立,服务节点收到请求并处理后,可以向请求节点返回数据响应。 总的来说,通过ROS提供的C语言API,用户可以在ROS实现基于TCP的对外通信功能。这种方式可以实现高效、可扩展的通信架构,支持多种传输类型,同时也具有ROS本身的优点,例如跨平台、易于开发和调试等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

路人甲YYH

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

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

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

打赏作者

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

抵扣说明:

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

余额充值