模型对比

话题模型

服务模型

数据类型

两种数据在建立的时候都建议放在一个单独的文件夹内方便管理

话题消息

msg文件

服务数据

srv文件

自定义数据创建流程(统一)

1、定义对应的msg/srv文件
2、在package.xml中添加功能包依赖

//xml配置 位置在位于靠近xml结尾处的一串<build_depend>后
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

3、在CMakeLists.txt添加编译选项

//txt配置
find_package(
...
message_generation
)   //位置位于txt文件开头add_message_files(FILES person.msg)//person.msg是你定义的msg文件的名字,若为srv文件则改成srv文件名即可
generate_messages(DEPENDENCIES std_msgs)
//以上两条代码一同添加,位置在一串被注释掉的generate_messages下方catkin_package(
...
CATKIN_DEPENDS ... message_runtime
...
)
//该函数内所有内容均被注释,包括CATKIN_DEPENDS,添加message_runtime时需将包括CATKIN_DEPENDS的注释去除,位置在build上方

4、catkin_make重新编译文件

使用自定义数据类型的代码编译规则(统一)(对Cmakelists进行配置)

1、设置需要编译的代码和生成的可执行文件

2、设置连接库

3、添加依赖项

add_executable(person_publisher src/person_publisher.cpp)//将person_publisher.cpp文件编译成可执行文件
target_link_libraries(person_publisher ${catkin_LIBRARIES})//设置链接库
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)//添加依赖项
//若不使用自定义数据类型,则在编译配置时可省去添加依赖项这一步
//注意, ${catkin_LIBRARIES} ${PROJECT_NAME} 两个均为中括号,不是小括号,打错了编译会失败!!!!

话题模型实现

创建发布者

1、初始化ROS节点
2、向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型
3、创建消息数据
4、按照一定频率循环发布消息

#include <ros/ros.h>
#include "test_pkg/person.h"int main(int argc,char **argv)
{
//ros节点初始化ros::init(argc,argv,"person_publisher");
//创建节点句柄    ros::NodeHandle n;
//创建一个Publisher,发布名为/person_info的topic,消息类型为test_pkg::person,队列长度10 ros::Publisher person_info_pub=n.advertise<test_pkg::person>("/person_info",10);
//设置循环频率   ros::Rate loop_rate(1);int count=0;while (ros::ok()){
//初始化test_pkg::person类型的消息test_pkg::person person_msg;person_msg.name="TOM";person_msg.age=18;person_msg.sex=test_pkg::person::male;
//发布消息person_info_pub.publish(person_msg);ROS_INFO("Publish Person Info : name:%s age:%d sex:%d",person_msg.name.c_str(),person_msg.age,person_msg.sex);
//按照循环频率计时loop_rate.sleep();}}

创建接收者

1、初始化ROS节点
2、订阅需要的话题
3、循环等待话题消息,接收到消息后进入回调函数
4、在回调函数中完成消息处理

#include <ros/ros.h>
#include "test_pkg/person.h"
//回调函数声明,因为将回调函数放在main之前后编译报错,故将函数实现放在main之后
void personInfoCallbak(const test_pkg::person::ConstPtr& msg);int main(int argc,char **argv)
{
//初始化ros节点ros::init(argc,argv,"person_subscriber");
//创建节点句柄ros::NodeHandle n;
//创建一个subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallbakros::Subscriber person_info_sub = n.subscribe("/person_info",10,personInfoCallbak);
//循环等待回调函数ros::spin();return 0;
}void personInfoCallbak(const test_pkg::person::ConstPtr& msg)
{
//打印接收到的消息ROS_INFO("Subscribe Person Info: name :%s age : %d sex : %d",msg->name.c_str(),msg->age,msg->sex);
}

代码编译配置

参照上一部分对Cmakelists进行配置即可

服务模型实现

创建服务器

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

#include <ros/ros.h>
#include "learning_service/person.h"bool personCallback(learning_service::person::Request &req,learning_service::person::Response &res)
{
//显示请求数据ROS_INFO("Person::name:%s age:%d sex:%d ",req.name.c_str(),req.age,req.sex);
//设置反馈数据res.result="OK";return true;}int main(int argc,char **argv)
{
//ROS节点初始化ros::init(argc,argv,"person_server");
//创建节点句柄ros::NodeHandle n;
//创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer person_service=n.advertiseService("/show_person",personCallback);
//循环等待回调函数 ROS_INFO("Ready to show person information.");ros::spin();return 0;}

创建客户端

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

#include <ros/ros.h>
#include "learning_service/person.h"int main(int argc,char** argv)
{
//初始化ROS节点ros::init(argc,argv,"person_client");
//创建节点句柄ros::NodeHandle node;
//发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/show_person");ros::ServiceClient person_client=node.serviceClient<learning_service::person>("/show_person");
//初始化learning_service::person的请求数据learning_service::person srv;srv.request.name="hubery";srv.request.age=20;srv.request.sex=learning_service::person::Request::male;
//  请求服务调用ROS_INFO("Call service to show person[name:%s,age:%d,sex:%d]",srv.request.name.c_str(),srv.request.age,srv.request.sex);person_client.call(srv);
//显示服务调用结果ROS_INFO("Show person result :%s",srv.response.result.c_str());return 0;}

代码编译配置

参照上一部分对Cmakelists进行配置即可

实操经验

1、当没有提前配好环境变量时,在运行个人功能包时需提前配置环境变量
2、${catkin_LIBRARIES} ${PROJECT_NAME} 两个均为中括号,不是小括号,打错了编译会失败!!!!

古月居21讲学习笔记 10—15讲总结 话题VS服务相关推荐

  1. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-三角测量和实践

     专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第 ...

  2. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  3. 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-对极几何和对极约束、本质矩阵、基础矩阵

    专栏系列文章如下:  专栏汇总 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLA ...

  4. 视觉SLAM十四讲学习笔记-第六讲学习笔记总结(1)---非线性优化原理

    第六讲学习笔记如下: 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题_goldqiu的博客-CSDN博客 ​​​​​​视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题_ ...

  5. 视觉SLAM十四讲学习笔记-第四讲---第五讲学习笔记总结---李群和李代数、相机

    第四讲---第五讲学习笔记如下: 视觉SLAM十四讲学习笔记-第四讲-李群与李代数基础和定义.指数和对数映射_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第四讲-李代数求导与扰动模 ...

  6. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的实践-高斯牛顿法和曲线拟合

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  7. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的非线性最小二乘问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  8. 视觉SLAM十四讲学习笔记-第六讲-非线性优化的状态估计问题

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

  9. 视觉SLAM十四讲学习笔记-第四讲-Sophus实践、相似变换群与李代数

    专栏系列文章如下: 视觉SLAM十四讲学习笔记-第一讲_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习笔记-第二讲-初识SLAM_goldqiu的博客-CSDN博客 视觉SLAM十四讲学习 ...

最新文章

  1. 【数据结构】顺序栈的实现(C语言)
  2. CentOS升级Python2到Python3
  3. 深度报文检测 linux,DPI-深度报文检测
  4. andriod的apk文件相关的编译反编译工具
  5. F. Cheap Robot(kruskal 重构树)
  6. 机加工程序工时程序_准终工时、人工工时、机器工时,十个工程师九个会弄错...
  7. 大数据职业理解_大数据带给我们职业三大根本改变
  8. python提取txt字符串,教你一招!Python读取文件内容为字符串的方法
  9. 基于tkinter模块创建GUI程序(python)
  10. 使用 .NET 平台,如何玩转 Universal Windows 应用? 1
  11. redisconnectionfactory 没有这个bean_浅析Spring中bean的作用域
  12. 寄存器、锁存器和触发器的区别与联系
  13. 计算机软件工程专业研究生大学排名,软件工程研究生院校排名
  14. 阿里飞天云平台架构简介
  15. sql中字符串转换成日期
  16. 马云将成全球第11大富豪,很好奇第一位是谁?
  17. Android Scroller
  18. 如何俘获一个 IT 男的心
  19. 新手刚开始运营shopee,要做什么有利于店铺发展?
  20. 基于云开发模式的评分小程序总结!二维码、导出excel表格等实用干货!

热门文章

  1. 合工大计算机组成原理ppt,合工大 计算机组成原理 计算机组成原理提纲.pdf
  2. 物联卡中心:物联卡用不了4G怎么办?答案在这
  3. 初中计算机考试浏览器,初中信息技术《浏览网页-使用IE浏览器》教案
  4. zkServer.cmd点击无反应,报错:JAVA_HOME is not set
  5. linux向日葵控制软件下载链接(有些情况下打不开向日葵官方网站)
  6. 晶赞科技喜获中国互联网大数据营销服务最具影响力企业大奖
  7. 创建hive表,指定存储和压缩格式
  8. 用PHP开发企业Wifi网络Web认证系统(附源码)
  9. swift 使用Kingfisher进行网络图片的下载
  10. AR宇航员互动体验软件:虚拟与现实叠加增强体验感