2.5 自定义srv C++
功能介绍
以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出
1、工作空间
1.1 创建工作空间lee_ws
mkdir -p ~/lee_ws/src
cd ~/lee_ws/src/
catkin_init_workspace
cd ~/lee_ws/
catkin_make
echo "source ~/lee_ws/devel/setup.bash" >> ~/.bashrc
source devel/setup.bash
1.2 创建功能包lee_srv
cd ~/lee_ws/src
catkin_create_pkg lee_srv std_msgs rospy roscpp
cd ~/lee_ws/
catkin_make
source ~/lee_ws/devel/setup.bash
1.3 创建srv文件
路径: /home/lee/lee_ws/src/lee_srv/srv/AddTwoInts.srv
int64 num1
int64 num2
---
int64 sum
1.4 package.xml配置
在package.xml最下面的build_depend
和exec_depend
附近添加即可
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
1.5 CMakeLists.txt配置
在CMakeLists.txt中配置下面相应的代码
# 需要加入 message_generation,必须有 std_msgs
find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)# 配置 srv 源文件
add_service_files(FILESAddTwoInts.srv
)# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs
)#执行时依赖
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES leeCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
# DEPENDS system_lib
)
1.6 编译后的中间文件查看
C++ 需要调用的中间文件(…/工作空间/devel/include/包名/xxx.h)
1.7 总结步骤1.3-1.5
- 1.3建立的自定义srv文件
- 需要通过1.4和1.5两个步骤的配置才能通过catkin_make对1.3的文件进行编译
- 1.6为通过编译自定义文件生成的python、C++和js等头文件,用于相应编程代码的头文件调用
1.8 VScode编辑ros参数配置
快捷键 ctrl + shift + B 调用编译,选择:catkin_make:build这一行,点击小齿轮配置设置,修改.vscode/tasks.json 文件,将下面复制进去即可
这么配置的原因:下一次快捷键 ctrl + shift + B直接进行代码编译
路径:/home/lee/lee_ws/.vscode/tasks.json
{"version": "2.0.0","tasks": [{//代表提示的描述性信息"label": "catkin_make:debug", //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行"type": "shell", //这个是我们需要运行的命令"command": "catkin_make","args": [],"group": {"kind":"build","isDefault":true},//可选always或者silence,代表是否输出信息 "presentation": {"reveal": "always"},"problemMatcher": "$msCompile"}]
}
1.9 vscode 头文件配置
为了方便代码提示以及避免误抛异常,需要先配置 vscode,将1.3-1.5生成的 head 中间文件路径配置进 c_cpp_properties.json 的 includepath属性,如果不配置vscode会报错代码,但是编译不受影响
路径: /home/lee/lee_ws/.vscode/c_cpp_properties.json
{"configurations": [{"browse": {"databaseFilename": "","limitSymbolsToIncludedHeaders": true},"includePath": ["/opt/ros/noetic/include/**","/home/lee/catkin_ws/src/lee/include/**","/usr/include/**","/home/lee/catkin_ws/devel/include/**" //配置 head 文件的路径 ],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "c++17"}],"version": 4
}
2、服务端代码 C++
路径: /home/lee/lee_ws/src/lee_srv/src/lee_srv_add_server.cpp
2.1 代码部分
#include "ros/ros.h"
#include "lee_srv/AddTwoInts.h"//接收到订阅的消息后,进入回调函数
bool chatterCallback(lee_srv::AddTwoInts::Request& req,lee_srv::AddTwoInts::Response& resp){int num1 = req.num1;int num2 = req.num2;ROS_INFO("服务器接收到的请求数据为:num1 = %d, num2 = %d",num1, num2);//逻辑处理if (num1 < 0 || num2 < 0){ROS_ERROR("提交的数据异常:数据不可以为负数");return false;}//如果没有异常,那么相加并将结果赋值给 respresp.sum = num1 + num2;return true;
}int main(int argc, char *argv[])
{ //解决在终端上打印中文不会出现乱码,二选一或两个一起选都行setlocale(LC_CTYPE, "zh_CN.utf8");setlocale(LC_ALL, "");//初始化节点:命名(唯一)//参数1和参数2 为节点传值使用//参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"lee_srv_add_server");//实例化节点句柄ros::NodeHandle nh;//创建一个ServiceServer,服务名为chatter_srv的topic,注册回调函数chatterCallbackros::ServiceServer server = nh.advertiseService("chatter_srv",chatterCallback);ROS_INFO("服务已经启动....");//设置循环回调函数ros::spin();return 0;
}
2.2 CMakeLists.txt部分
在install上面直接添加如下代码即可
add_executable(lee_srv_add_server src/lee_srv_add_server.cpp)
add_dependencies(lee_srv_add_server ${PROJECT_NAME}_gencpp)
target_link_libraries(lee_srv_add_server ${catkin_LIBRARIES})
3、客户端代码 C++
路径: /home/lee/lee_ws/src/lee_srv/src/lee_srv_add_client.cpp
3.1 代码部分
#include "ros/ros.h"
#include "lee_srv/AddTwoInts.h"int main(int argc, char *argv[])
{//解决在终端上打印中文不会出现乱码,二选一或两个一起选都行setlocale(LC_CTYPE, "zh_CN.utf8");setlocale(LC_ALL, "");//调用时动态传值,如果通过 launch 的 args 传参,需要传递的参数个数 +3if (argc != 3)//if (argc != 5)//launch 传参(0-文件路径 1传入的参数 2传入的参数 3节点名称 4日志路径){ROS_ERROR("请提交两个整数");return 1;}//初始化节点:命名(唯一)//参数1和参数2 为节点传值使用//参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"lee_srv_add_client");//实例化节点句柄ros::NodeHandle nh;//创建一个ServiceClient,客户端名为chatter_srv的topic,消息类型为lee_srv::AddTwoIntsros::ServiceClient client = nh.serviceClient<lee_srv::AddTwoInts>("chatter_srv");//等待服务启动成功,如服务器没启动则一直在此等待ros::service::waitForService("chatter_srv");//组织请求数据//atoi函数:将字符串转化为int类型//atol函数:将字符串转化为long类型//atoll函数:将字符串转化为long long类型//atof函数:将字符串转化为double类型lee_srv::AddTwoInts add;add.request.num1 = atoi(argv[1]);add.request.num2 = atoi(argv[2]);//发送请求,返回 bool 值,标记是否成功bool flag = client.call(add);//处理响应if (flag){ROS_INFO("请求成功,响应结果为:%d",(int)add.response.sum);}else{ROS_ERROR("请求处理失败....");return 1;}return 0;
}
3.2 CMakeLists.txt部分
在install上面直接添加如下代码即可
add_executable(lee_srv_add_client src/lee_srv_add_client.cpp)
add_dependencies(lee_srv_add_client ${PROJECT_NAME}_gencpp)
target_link_libraries(lee_srv_add_client ${catkin_LIBRARIES})
4、代码测试
4.1 启动rosmaster
roscore
4.2 启动 lee_srv_add_server 节点
rosrun lee_srv lee_srv_add_server
4.3 启动 lee_srv_add_client 节点,并带参数
rosrun lee_srv lee_srv_add_client 1 2
5、结果
2.5 自定义srv C++相关推荐
- 2.6 自定义srv python
功能介绍 以自定义数据类型为基础,完成一个节点作为服务器,另一个节点接收传送两个数字到服务端,服务端计算后反馈到客户端进行打印输出 1.工作空间 1.1 创建工作空间lee_ws mkdir -p ~ ...
- 【服务通信自定义srv调用3----客户端的优化】
客户端的优化 服务通信自定义srv调用,客户端随意提交两个数,完成数的相加.也就是实现参数的动态提交: 1.格式:rosrun xxxx xxxx 12 34 2.节点执行时候,需要获取命令中的参数, ...
- #自定义srv消息:实现四则运算
#自定义srv消息:实现四则运算 tips:养成良好习惯,新建工作包之前,先把工作空间编译一下,确保之前建好的工作包没有错误,再新建新的工作包,以免后续编译出现错误一直找不到原因. 1.在工作空间下创 ...
- 自定义srv消息之ros
自定义消息 前言 在Ros中,如果没有现成的消息类型来描述要去传递的消息时,我们会自定义消息. 我们会新建一个Package来去自定义消息,通常这个Package写任何的业务逻辑,只是用来声明自定义的 ...
- ROS学习之自定义srv类型
1. 创建srv文件 cd ~/catkin_ws/src/my_package mkdir srv echo "int64 a int64 b --- int64 sum" &g ...
- 服务通信:自定义srv文件以及服务端的编写
首先新建功能包,可利用VS Code或者 catkin_create_pkg server_client roscpp rospy std_msgs 在其下建立srv文件夹,再建立Addints.sr ...
- 服务通信—自定义srv
1.创建工作空间并初始化与生成srv文件 1.创建工作空间并初始化 mkdir -p demo02_ws/src cd demo03_ws catkin_make 2.进入 src 创建 ros 包并 ...
- 【ROS学习笔记】11.服务数据(srv)的定义与使用
基于B站ROS公开课:[古月居]古月·ROS入门21讲 基于Ubuntu 20.04.1.Noetic版本 修正错误,并详述Python版本部署 文章目录 1 模型图 2 创建功能包 3 自定义服务数 ...
- ROS:服务数据(srv)的定义与使用
目录 一.服务模型 二.创建功能包 三.自定义服务数据 3.1定义srv文件 3.2在package.xml中添加功能包依赖 3.3在CMakeLists.txt中添加编译选项 3.4编译生成语言相关 ...
最新文章
- 机器学习 —— 基础整理(三)生成式模型的非参数方法: Parzen窗估计、k近邻估计;k近邻分类器...
- HTML中三维特性,前端进阶系列(三):HTML5新特性
- 1102示波器使用方法_使用示波器进行故障诊断的方法(1):常见传感器波形分析-汽车用品行业...
- java 接口式自定义回调函数
- php mysql xa事务_XA mysql php 分布式事务
- 【LeetCode笔记】124. 二叉树中的最大路径和(Java、二叉树、DFS)
- Windows Mobile下使用Native C++开发日志类
- linux java执行_linux下运行java
- 基于JAVA+SpringBoot+Mybatis+MYSQL的后台医疗管理系统
- 商业认知,你每天出门看天气吗?
- 纯干货:手把手教你用Python做数据可视化(附代码)
- QQ音乐JS逆向爬虫,获取调皮的sign参数,我用python全都爬!
- c# redies 安装 和使用
- 读《MySQL是怎样运行的》笔记记录
- [1] DevOps 自动化运维工具Chef----入门
- 不要用PS啦,python+opencv代码给证件照换底色
- 华为手机助手 android,华为手机助手(安卓版)
- Linux系统下7个好用的PDF编辑器推荐
- 时间序列预测的评估指标补遗
- git branch分支创建、切换、合并,git tag标签