8.ROS编程学习:自定义服务数据python调用

2023-05-16

目录

一、准备工作——vscode配置

二、服务端实现

1.创建demo01_server_p.py

2.添加可执行权限

3.配置CMakeList.txt(melodic不用配置也行,noetic需要配置)

4.测试服务端

三、客户端实现

1.创建demo01_client_p.py

2.添加可执行权限+CMakeList.txt配置

3.测试客户端

4.客户端优化

参考:赵虚左课程+古月的ROS机器人开发实践

一、准备工作——vscode配置

 选择在集成终端中打开,输入:

pwd

 输出一个路径。

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws/devel/lib/python2.7/dist-packages$ pwd
/home/rosmelodic/catkin_ws/devel/lib/python2.7/dist-packages

将输出的路径加入.vscode文件夹中的setting.json文件

{
    "python.autoComplete.extraPaths": [
        "/opt/ros/melodic/lib/python2.7/dist-packages",
        "/home/rosmelodic/catkin_ws/devel/lib/python2.7/dist-packages"
    ],
    "python.analysis.extraPaths": [
        "/opt/ros/melodic/lib/python2.7/dist-packages"
    ]
}

这是为了vscode开发时能够找到自定义服务数据类型的库。

二、服务端实现

1.创建demo01_server_p.py

 demo01_server_p.py

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse

def huidiao(request):
#    request = AddIntsRequest()
   num11 = request.num1
   num22 = request.num2
   sum12 = num11 + num22
   response = AddIntsResponse()
   response.sum = sum12
   rospy.loginfo("服务器解析数据:num11 = %d, num22 = %d, 响应结果为:sun12 = %d", num11, num22, sum12)
   return response

if __name__ == "__main__":
    rospy.init_node("jiafa_server_p")
    server = rospy.Service(name="add_ints", service_class=AddInts, handler=huidiao)
    rospy.loginfo("服务器已经启动了")
    rospy.spin()

相较于c++实现精简了很多。

python版本声明,和utf-8编码,不声明编码格式默认ascii码,防止程序中有中文出现报错。

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

 调用rospy库,和之前自定义的服务数据类型库,自定义的服务数据类型库中包含了这三个类。

import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse

 /home/rosmelodic/catkin_ws/devel/lib/python2.7/dist-packages/server_client/srv

 

 回调函数部分

def huidiao(request):
#    request = AddIntsRequest()
   num11 = request.num1
   num22 = request.num2
   sum12 = num11 + num22
   response = AddIntsResponse()
   response.sum = sum12
   rospy.loginfo("服务器解析数据:num11 = %d, num22 = %d, 响应结果为:sun12 = %d", num11, num22, sum12)
   return response
def huidiao(request):

回调函数部分,由于request只是个形参,而且没有声明request的数据类型,导致num1没有代码的自动补齐。尝试了加上request = AddIntsRequest(),但是会导致回调函数接受不到请求request的数值,这个方法失败了,只能在没有代码补齐的情况下硬着去编写。而在c++代码中,转入的形参通过指针的方式给了数据类型,自然有了代码补齐,但是python没有指针功能。

   num11 = request.num1
   num22 = request.num2
   sum12 = num11 + num22
   response = AddIntsResponse()
   response.sum = sum12
   rospy.loginfo("服务器解析数据:num11 = %d, num22 = %d, 响应结果为:sun12 = %d", num11, num22, sum12)
   return response

首先解析请求的两个参数,再将两个参数相加,再将得到的结果赋值给应答,此时的request的num1和num2和response的sum实现着存放请求和应答数据的功能,这些数据是可以通过ROS服务通信去操作的,而num11、num22、sum12只是个符合自定义服务数据类型的数。

if __name__ == "__main__":
    rospy.init_node("jiafa_server_p")
    server = rospy.Service(name="add_ints", service_class=AddInts, handler=huidiao)
    rospy.loginfo("服务器已经启动了")
    rospy.spin()

初始化节点,相较于c++不用再初始化句柄操作。

创建服务端,name为服务名,service_class服务参数的数据类型,handler回调函数。

设置回头函数,不断循环。

2.添加可执行权限

3.配置CMakeList.txt(melodic不用配置也行,noetic需要配置)

catkin_install_python(PROGRAMS
  scripts/demo01_server_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

melodic不用配置也行,noetic需要配置,在melodic中这个配置也是生效的,如果打错了路径会出现找不到文件。

4.测试服务端

roscore
rosrun server_client demo01_server_p.py 
rosservice call add_ints "num1: 0
num2: 0" 

通过调整num1和num2数值,观察结果:

 

三、客户端实现

1.创建demo01_client_p.py

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse

if __name__ == "__main__":
    rospy.init_node("jiafa_client_p")
    client = rospy.ServiceProxy(name="add_ints", service_class=AddInts)
    response = client.call(AddIntsRequest(10, 30))
    # response = client.call(10, 30)
    rospy.loginfo("响应的数据为:%d",response.sum)

 初始化ROS节点→创建客户端(不用回调函数,同时注意服务名称必须相同)→组织请求数据,并发布请求→控制台输出

2.添加可执行权限+CMakeList.txt配置

与之前方法相同

chmod +x *.py
catkin_install_python(PROGRAMS
  scripts/demo01_client_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

3.测试客户端

rosrun server_client demo01_server_p.py 
rosrun server_client demo01_client_p.py

4.客户端优化

修改的部分:

import sys
import logging
logging.basicConfig()

sys为system的库,通过这个能导入argv,与c++不同,此处没有argc,其中argc就为argv数组的长度,用过len(sys.argv)来使用。

import logging
logging.basicConfig()此处是一个为了rospy.logerr("提交参数个数有误")能正常输出,如果不加上这个库会报错:

No handlers could be found for logger "rosout"

这部分是判断输入参数的长度,其中第一个参数为文件名,第二个和第三个为请求的数值 ,当长度不等于3,返回警告。

    if len(sys.argv) != 3:
        rospy.logerr("提交参数个数有误")
        sys.exit(1)

 这部分注意system返回的输入值为字符串类型,需要强制转换为int类型,才能参与计算。

    req = AddIntsRequest()
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2])
    response = client.call(req.num1, req.num2)
    # response = client.call(AddIntsRequest(10, 30))

修改后:

#! /usr/bin/env python
# -*- coding: UTF-8 -*-

import rospy
from server_client.srv import AddInts,AddIntsRequest,AddIntsResponse
import sys
import logging
logging.basicConfig()

if __name__ == "__main__":
    if len(sys.argv) != 3:
        rospy.logerr("提交参数个数有误")
        sys.exit(1)
    rospy.init_node("jiafa_client_p")
    client = rospy.ServiceProxy(name="add_ints", service_class=AddInts)
    req = AddIntsRequest()
    req.num1 = int(sys.argv[1])
    req.num2 = int(sys.argv[2])
    response = client.call(req.num1, req.num2)
    # response = client.call(AddIntsRequest(10, 30))
    rospy.loginfo("响应的数据为:%d",response.sum)

测试:

rosrun server_client demo01_server_p.py
rosrun server_client demo01_client_p.py 10 20

rosrun server_client demo01_client_p.py 10 20 30

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

8.ROS编程学习:自定义服务数据python调用 的相关文章

  • 编写一个算法,实现一维数组a输入任意n个整数,假设n=7,输入7个数字为3,7,6,8,9,4,1

    问题描述 编写一个算法 xff0c 实现一维数组a输入任意n个整数 xff0c 假设n 61 7 xff0c 输入7个数字为3 7 6 8 9 4 1 xff0c 然后建立一个具有如图所示的方阵 xff0c 并输出打印 1 3 7 6 8
  • 1.0 DS1302-外部RTC

    一 综述 DS1302是美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片 xff0c 因为应用非常广泛 xff0c 结果就导致了大量的国产仿制品 xff0c GC1302是一款国产DS1302仿制芯片 xff0c 使用方法
  • 现代C++语言

    include lt iostream gt include lt limits gt include lt future gt include lt string gt include lt map gt using namespace
  • ubuntu 解压 打包 命令全集

    tar 解包 xff1a tar xvf FileName tar 打包 xff1a tar cvf FileName tar DirName xff08 注 xff1a tar是打包 xff0c 不是压缩 xff01 xff09 gz 解
  • 在IDEA中解决进行有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    springboot默认的打包是如下 xff1a lt build gt lt plugins gt lt plugin gt lt groupId gt org springframework boot lt groupId gt lt
  • Jetson Nano更换软件源

    Nano的镜像默认是国外的源 xff0c 速度很慢 xff0c 国内的源有的上不去 xff0c 有的包无法安装 xff0c 经过测试清华大学的源完美可用 xff0c 现放上教程 首先备份原本的source list文件 sudo cp et
  • prometheus在k8s中的部署

    1 k8s的监控指标 监控指标具体实现举例Pod性能cAdvisor容器CPU xff0c 内存利用率Node性能node exporter节点CPU xff0c 内存利用率K8S资源对象kube state metricsPod Depl
  • vue前端

    span class token operator lt span span class token operator span DOCTYPE html span class token operator gt span span cla
  • VueCli 脚手架的安装

    配置淘宝npm仓库 xff1a span class token function npm span config span class token builtin class name set span registry https re
  • vue进阶知识

    Vue单文件组件 xff08 又名 vue文件 xff0c 缩写为SFC xff09 是一种特殊 的文件格式 xff0c 它允许讲Vue组件的模板 逻辑与样式封装在 单个文件中 正如所见 xff0c Vue SFC 是经典的 HTML CS
  • ssh@host:""ssh切换到其他机器上执行多条命令;Pseudo-terminal will not be allocated because stdin is not a terminal.

    1 背景 xff1a shell脚本在主机器上执行kafka的启动命令 其他机器也会起这个进程 之前的脚本每次执行的时候出现卡住的现象 xff0c 不能回到命令行 解决方法 xff1a 第一种 span class hljs comment
  • centos升级glibc(升级到 2.17版)

    1 原先的系统glibc库的版本是2 12 xff0c 需要升级到2 17版本 下载地址 xff1a http ftp gnu org gnu glibc glibc 2 17 tar gz 这里可以选择你所需要的版本 2 安装部署 roo
  • u盘启动盘安装centos7.4操作系统

    1 使用UltraISO软件将ISO镜像刻录到U盘 xff0c 然后用u盘安装操作系统 制作好的u盘如下所示 xff1a 2 启动华为h3c服务器 xff0c 出现下面的界面 按照提示按住Ctrl 43 A制作raid 继续点击下一步 xf
  • redis一主一从两台机器高可用

    目录 1 机器规划 2 redis的部署安装 2 1配置文件内容 2 2 启动2台机器上的redis服务 2 3 查看2台机器上redis数据信息 3 redis主从之间手动切换 3 1 停掉22上的redis进程 xff0c 到23从re
  • cumulusclips的部署

    描述 xff1a CumulusClips是一个开源的视频分享 xff08 内容管理 xff09 平台 xff0c 能够提供最佳的视频分享功能之一类似YouTube 在CumulusClips的帮助下 xff0c 您可以开始自己的视频分享网
  • Linux安装nodejs和npm

    最近window系统转向linux系统开发 xff0c linux系统的确适合程序员的开发 作为前端安装了nodejs和npm xff0c 遇到了一些坑 xff0c 赶紧记录下来 第一种安装方法 xff1a 安装nodejs xff1a s
  • python 编写的DHT Crawler 网络爬虫

    1 安装boost依赖和编译环境 yum install y boost boost devel yum install y make gcc gcc c 43 43 kernel devel python devel 2 装 libtor
  • nginx location proxy_pass详解

    在nginx中配置proxy pass时 xff0c 如果在proxy pass后面的url加 xff0c 相当于是绝对根路径 xff0c 则nginx不会把location中匹配的路径部分代理走 如果没有 xff0c 则会把匹配的路径部分
  • hbase代码说明(通话记录查询)

    Hbase的项目 xff08 通话记录查询 xff09 写java的包 导入jar包 Hbase的包 xff0c hadoop的包 xff0c 驱动包 配置文件 xff08 hbase hdfs regionserver backup xf
  • SysTick 定时器详细学习笔记并兼容FreeRTOS

    文章目录 一 xff1a 基础知识二 xff1a SysTick 的时钟频率三 xff1a SysTick 的配置四 xff1a SysTick 实现精准延时并兼容 FreeRTOS五 xff1a 参考 一 xff1a 基础知识 SysTi

随机推荐