SLAM从入门到精通(服务通信)

2023-09-22 11:55:12

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        前面我们谈到了消息通信,但是这种通信是单向的。也就是一个人发送消息,一个人接收消息,仅此而已。在ros当中,还有一种通信,称之为服务通信。它和单项通信最大的区别就是,我们把数据发送给对方,还能得到对方的反馈结果。这在很多场合下都是非常适合的。

1、创建srv文件

        和消息传递一样,服务通信也需要创建脚本文件。首先在package目录下面创建一个srv文件加,里面添加PassWord.srv文件,内容如下,

int64 password
---
bool result

        内容是比较简单的。这个时候cd到workspace顶层,输入catkin_make,就可以生成对应的头文件,当然CMakeLists.txt也是需要修改的。

2、修改CMakeLists.txt


cmake_minimum_required(VERSION 2.8.3)
project(beginner_tutorials)

## Find catkin and any catkin packages
find_package(catkin REQUIRED COMPONENTS message_generation roscpp rospy std_msgs genmsg)
add_message_files(FILES Student.msg)
add_service_files(FILES PassWord.srv)

## Generate added messages and services
generate_messages(DEPENDENCIES std_msgs)

## Declare a catkin package
catkin_package()

## Build talker and listener
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})
add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})
add_dependencies(listener beginner_tutorials_generate_messages_cpp)

        通过make编译以及查找,我们发现生成的.h文件都被放到了devel目录下了,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws$ find . -name "*.h"
./devel/include/beginner_tutorials/PassWordResponse.h
./devel/include/beginner_tutorials/PassWordRequest.h
./devel/include/beginner_tutorials/Student.h
./devel/include/beginner_tutorials/PassWord.h

3、重写talker.cpp文件


#include "ros/ros.h"
#include "beginner_tutorials/PassWord.h"
#include <cstdlib>

using namespace std;

int main(int argc, char** argv)
{
	ros::init(argc, argv, "node_client");
	if(argc < 2)
	{
		cout << "Error param, please run eg: rosrun beginner_tutorials talker 123456" << endl;
		return 1;
	}

	ros::NodeHandle nh;
	ros::ServiceClient client = nh.serviceClient<beginner_tutorials::PassWord>("pswserver", 100);
	beginner_tutorials::PassWord srv;

	srv.request.password = atoi(argv[1]);
	if(client.call(srv))
	{
		ROS_INFO("client connect success!");
		if(srv.response.result)
		{
			ROS_INFO("Welcom, correct password!");
		}
		else
		{
			ROS_INFO("Sorry, password error");
		}
	}
	else
	{
		ROS_INFO("client connect fail");
	}
	return 0;
}

        代码中唯一需要注意的就是client.call这个用法。

4、重写listener.cpp文件


#include "ros/ros.h"
#include "beginner_tutorials/PassWord.h"

bool serverCallback(beginner_tutorials::PassWord::Request& req,
		beginner_tutorials::PassWord::Response& res)
{
	res.result = (req.password == 123456) ? true :false;
	return true;
}

int main(int argc, char* argv[])
{
	ros::init(argc, argv, "server_node");
	ros::NodeHandle nh;
	ros::ServiceServer serv = nh.advertiseService("pswserver", &serverCallback);
	ros::spin();
	return 0;
}

        这里的回调函数注意一下,也就是serverCallback的用法。

5、启动和测试

        准备了节点之后就可以开始编译。编译的方法也比较简单,就是输入catkin_make。确认没有问题之后,就是启动roscore和source ~/devel/setup.sh。依次打开listener和talker,

rosrun beginner_tutorials listener

        不出意外,打开talker之后,就可以看到这样的打印信息,

feixiaoxing@feixiaoxing-VirtualBox:~/Desktop/catkin_ws$ rosrun beginner_tutorials talker 123456
[ INFO] [1695354474.608237290]: client connect success!
[ INFO] [1695354474.608742554]: Welcom, correct password!

更多推荐

Linux CentOS7 tree命令

tree就是树,是文件或文件名输出到控制台的一种显示形式。tree命令作用:以树状图列出目录的内容,包括文件、子目录及子目录中的文件和目录等。我们使用ll命令显示只能显示一个层级的普通文件和目录的名称。而使用tree则可以树的形式将指定目录下的普通文件和目录全部显示出来。相对于ll或者ls命令,tree就高效很多。一、

微信开放平台第三方开发,实现代小程序备案申请

大家好,我是小悟微信小程序备案整体流程总共分为五个环节:备案信息填写、平台初审、工信部短信核验、通管局审核和备案成功。服务商可以代小程序发起备案申请。在申请小程序备案之前,需要确保小程序基本信息已填写完成、小程序至少存在一个审核通过的类目。备案操作过程如下。将备案信息做成模板化管理,这样如果给其他同主体、同负责人等信息

《Playing repeated games with Large Language Models》全文翻译

《PlayingrepeatedgameswithLargeLanguageModels》-使用大型语言模型玩重复游戏论文信息摘要1.介绍2.相关工作3.一般方法4.分析不同游戏系列的行为5.囚徒困境5.1性别之战6.讨论论文信息题目:《PlayingrepeatedgameswithLargeLanguageMode

数据仓库介绍及应用场景

数据仓库(DataWarehouse)是一个用于存储、管理、检索和分析大量结构化数据的集中式数据库系统。与传统的事务处理数据库不同,数据仓库是为了支持决策支持系统(DecisionSupportSystems,DSS)和业务智能(BusinessIntelligence,BI)应用而设计的。数据仓库的核心概念事实表(F

mininum_snap

位置速度加速度====角度jerk=======角速度==========驱动力snap=====角加速度=========推力的导数凸优化算法convexoptimization凸优化(ConvexOptimization)是数学和计算机科学领域的一个重要分支,主要研究如何有效地解决凸优化问题。凸优化问题的主要目标是

LeetCode 接雨水 木桶理论、dp预处理

原题链接:力扣(LeetCode)官网-全球极客挚爱的技术成长平台题面:给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示

一文搞定Postman(菜鸟必看)

什么是Postman?Postman是一个可扩展的API测试工具,可以快速集成到CI/CD管道中。它于2012年作为AbhinavAsthana的一个副项目启动,旨在简化测试和开发中的API工作流程。API代表应用程序编程接口,它允许软件应用程序通过API调用相互通信。为什么使用Postman?如今,Postman软件

微软推出统一 Copilot AI 助手;谷歌拟自主研发 AI 芯片;苹果拟在国内引进新的 OLED 供应商丨RTE开发者日报 Vol.55

开发者朋友们大家好:这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(RealTimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,欢迎大家留言、跟帖、讨论。本期编辑:@Asu

【MySQL】数据类型

前言在前一篇文章中,我们介绍了数据库的基本操作,而在插入表时涉及了许多关于表的数据类型,接下来就一起来学习一下MySQL常见的一些文件类型吧。整形类型数据类型字节最小值最大值TINYINT1-128127UNSIGNEDTINYINT10255SMALLINT2-3276832767UNSIGNEDSMALLINT20

JUC第六讲:关键字volatile详解

JUC第六讲:关键字volatile详解相比Sychronized(重量级锁,对系统性能影响较大),volatile提供了另一种解决可见性和有序性问题的方案,本文是JUC第六讲,volatile关键字详解。文章目录JUC第六讲:关键字volatile详解1、带着BAT大厂的面试问题去理解volatile2、volati

安装Anaconda与pytorch,在IDEA中配置环境进行编程

1.官网下载与自己python版本匹配的Anaconda(注意,要想成功安装pytorch,python版本也要对应pytorch的相关版本)Anaconda官网最新版本与自己python版本不否请查找自己版本anaconda版本对应清华大学镜像下载2.安装时勾选添加环境变量或者手动添加(手动添加过程请自行查询)3.检

热文推荐