当前位置: 首页 > 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)行

相关文章:

  • MATLAB 训练CNN模型 yolo v4
  • 强化学习框架verl源码学习-快速上手之如何跑通PPO算法
  • Linux学习笔记协议篇(六):SPI FLASH设备驱动
  • 嵌入式人工智能应用-第三章 opencv操作8 图像特征之HOG 特征
  • 网络原理 - 3(UDP 协议)
  • 读文献先读图:韦恩图怎么看?
  • 设备、管道绝热(保冷)设计计算
  • Flutter路由模块化管理方案
  • 文件包含漏洞,目录遍历漏洞,CSRF,SSRF
  • 深度解析云计算:概念、优势与分类全览
  • 爬虫获取sku信息需要哪些库
  • 用银河麒麟 LiveCD 快速查看原系统 IP 和打印机配置
  • 网页下载的m3u8格式文件使用FFmpeg转为MP4
  • three.js中的instancedMesh类优化渲染多个同网格材质的模型
  • 你的大模型服务如何压测:首 Token 延迟、并发与 QPS
  • JavaScript — 总结
  • 基于XC7V690T的在轨抗单粒子翻转系统设计
  • 【数学建模】随机森林算法详解:原理、优缺点及应用
  • TensorFlow中使用Keras
  • Vscode开发STM32标准库
  • 中国旅游日主题月期间,东航将准备超51.9万套特惠机票
  • “6+2”小复式追加票!松江购彩者擒大乐透1672万头奖
  • 金价新高不断,上金所再发风险提示,黄金能否持续闪耀?
  • 被指违反代理协议遭南航暂停售票资格,去哪儿网:今起恢复
  • 加快从数量增长向品质跃升转变,促进生态空间与城市功能有机共生!龚正调研公园城市建设工作
  • 一代油画家的“色彩之诗”:周碧初捐赠艺术展上海举行