当前位置: 首页 > news >正文

7. 服务通信 ---- 使用自定义srv,服务方和客户方cpp,python文件编写

1.使用自定义srv

        1)   在功能包下新建文件夹srv,

              在srv文件夹下新建Add.srv文件,

              在Add.srv 文件写入:

int32 num1
int32 num2-------
int32 sum

ps:其中-------是必须要有的

        2)修改功能包下的package.xml 和 CMakeLists.txt文件

package.xml 修改如下:(两处)

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend><!-- exce_depend 以前对应的是 run_depend 现在非法-->

CMakeLists.txt文件修改如下:(四处)

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgsmessage_generation
)
# 需要加入 message_generation,必须有 std_msgs
add_service_files(FILESAddInts.srv
)
generate_messages(DEPENDENCIESstd_msgs
)
#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

然后,catkin_make(Ctrl + shift +B),编译

在目录下查看自定义srv的C++和python路径

c_cpp_properties.json修改如下:

"includePath": ["/opt/ros/noetic/include/**","/usr/include/**","/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径

settings.json修改如下:

{"python.autoComplete.extraPaths": ["/opt/ros/noetic/lib/python3/dist-packages",]
}

知道了路径,就可以在C++和python的头文件包含这个路径

 

2. 服务方和客户方的文件编写

        2.1 C++服务方编写

#include "ros/ros.h"
#include "service_com/Add.h"bool doReq(service_com::Add::Request& req,service_com::Add::Response& resp)
{int num1 =req.num1;int num2 =req.num2;ROS_INFO("接受到数据为%d %d",num1,num2);resp.sum = num1+ num2;return true;
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"server_c");ros::NodeHandle nh;ros::ServiceServer server = nh.advertiseService("Ad",doReq);ROS_INFO("begin");ros::spin();return 0;
}

        2.2 C++客户方编写

#include "ros/ros.h"
#include "service_com/Add.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");if(argc != 3){ROS_INFO("输入两个整数");return 1;}ros::init(argc,argv,"client_c");ros::NodeHandle nh;ros::ServiceClient client =nh.serviceClient<service_com::Add>("Ad");ros::service::waitForService("Ad");service_com::Add ai;ai.request.num1 = atoi(argv[1]);ai.request.num2 = atoi(argv[2]);bool flag =client.call(ai);if(flag){ROS_INFO("sum = %d",ai.response.sum);}else{ROS_INFO("error");return 1;}return 0;
}

        2.3 Python服务方编写

#! /usr/bin/env python
import rospy
from service_com.srv import Add,AddRequest,AddResponse
def doReq(req):sum = req.num1 +req.num2rospy.loginfo("接受数据为%d %d sum=%d",req.num1,req.num2,sum)resp =AddResponse(sum)return respif __name__ == "__main__":rospy.init_node("server_p")server = rospy.Service("Add",Add,doReq)rospy.loginfo("begin____")rospy.spin()

        2.4 Python客户方编写

#! /usr/bin/env pythonimport rospy
import sys
from service_com.srv import Add,AddRequest,AddResponseif __name__ == "__main__":if len(sys.argv) != 3 :rospy.logerr("error")sys.exit(1)rospy.init_node("client_p")client = rospy.ServiceProxy("Add",Add)rospy.wait_for_service("Add")req =AddRequest()req.num1 = int(sys.argv[1])req.num2 = int(sys.argv[2])resp=client.call(req)rospy.loginfo("sum = %d",resp.sum)

3.执行

在CMakeLists.txt 添加执行依赖

C++ 136)149)行

Python 162)行

http://www.xdnf.cn/news/65485.html

相关文章:

  • 操作指南:在vue-fastapi-admin上增加新的功能模块
  • 江湖密码术:Rust中的 bcrypt 加密秘籍
  • 算法 | 成长优化算法(Growth Optimizer,GO)原理,公式,应用,算法改进研究综述,matlab代码
  • QLisview 实现model deletage,并且在不需要编辑的情况下自定义UI
  • 【Redis】Jedis与Jedis连接池
  • Oracle数据库和PLSQL安装配置
  • 基于单片机的BMS热管理功能设计
  • 实验四 Java图形界面与事件处理
  • 如何对只能有一个`public`顶层类这句话的理解
  • 【解决】Vue + Vite + TS 配置路径别名成功仍爆红
  • Unreal Engine中FRotator与FQuat在赛车游戏方向盘控制中的协同应用解析
  • 【C++编程入门】:从零开始掌握基础语法
  • CENTOS 7 安装VNC
  • 【Java面试笔记:基础】1.谈谈你对Java平台的理解?
  • 移动端动态滑动拨盘选择器【Axure元件库】
  • 自注意力机制、多头自注意力机制、填充掩码 Python实现
  • 如何在白平衡标定种构建不同类型的白平衡色温坐标系
  • Android 音悦适配-v4.3.3-可在线播放可下载音乐的第三方APP
  • 【解决方法】关于解决QGC地面站4.4.3中文BUG,无法标注航点的问题
  • 模型检测技术的发展历史简介
  • Redis基础知识
  • 山东大学软件学院创新项目实训开发日志(21)之小问题修复之对话方向修改
  • 工厂模式:简单工厂模式
  • 免费送源码:ava+springboot+MySQL 基于springboot 宠物医院管理系统的设计与实现 计算机毕业设计原创定制
  • 修改IP地址能否精确到地级市的县?——全面解析
  • 第39讲|决策树与作物分布建模:可解释的AI助力农业智能推演
  • WINDOWS下使用命令行读取本地摄像头FFMPEG+DirectShow,ffplay直接播放摄像头数据
  • arkTs:使用Refresh实现下拉刷新功能(含状态提示与动画控制)
  • MySQL知识点讲解
  • n2n 搭建虚拟局域网,实现内网穿透