ROS学习笔记(15)服务数据的定义与使用

系统Ubuntu 18.04

ROS版本: Melodic

1 定义服务数据

1.1创建srv文件夹

1.2创建Person.srv文件

touch Person.srv   #“P”为大写

数据定义:

string name
uint8  age
uint8  sex

uint8 unknown = 0
uint8 male    = 1
uint8 female  = 2

---
string result

1.3配置package.xml文件

package.xml 也是一个catkin的package必备文件, 它是这个软件包的描述文件,包含了package的名称、版本号、内容描述、维护人员、软件许可、编译构建工具、编译依赖、运行依赖等信息。

这是为了保证srv文件能够转换成C+,Python和其他语言的源文件代码,需要在package.xml中添加功能包依赖

  <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>

函数功能如下:

1.4 配置CMakeList.txt

//添加包依赖
find_package( ...... message_generation)
//添加自定义的类型
add_service_files(FILES Person.srv)//根据哪一个srv文件创建头文件
generate_messages(DEPENDENCIES std_msgs)//根据文件定义产生头文件

//添加编译依赖
catkin_package(.......message_runtime)

添加位置如下:

1.5 编译生成头文件

回到工作空房间根目录,catkin_make编译

编译完成后生成头文件存储在devel/include内

2创建Python文件

2.1 创建scripts文件夹和.py文件

touch person_client.py
touch person_server.py

修改.py文件属性(允许作为执行文件)

2.2 编写客户端(person_client.py)

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

# 该例程将请求/show_person服务,服务数据类型learning_service::Person

import sys
import rospy
from learning_service.srv import Person, PersonRequest
//可以直接import learning_service.srv 

def person_client():
    # ROS节点初始化
    rospy.init_node('person_client')

    # 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的service
    rospy.wait_for_service('/show_person')
    try:
        person_client = rospy.ServiceProxy('/show_person', Person)

        # 请求服务调用,输入请求数据
        response = person_client("Tom", 20, PersonRequest.male)
        return response.result
    except rospy.ServiceException, e:
        print "Service call failed: %s"%e

if __name__ == "__main__":
    #服务调用并显示调用结果
    print "Show person result : %s" %(person_client())

2.3 编写服务端(person_server.py)

# -*- coding: utf-8 -*-

# 该例程将执行/show_person服务,服务数据类型learning_service::Person

import rospy
from learning_service.srv import Person, PersonResponse

def personCallback(req):
    # 显示请求数据
    rospy.loginfo("Person: name:%s  age:%d  sex:%d", req.name, req.age, req.sex)

    # 反馈数据
    return PersonResponse("OK")

def person_server():
    # ROS节点初始化
    rospy.init_node('person_server')

    # 创建一个名为/show_person的server,注册回调函数personCallback
    s = rospy.Service('/show_person', Person, personCallback)

    # 循环等待回调函数
    print "Ready to show person informtion."
    rospy.spin()

if __name__ == "__main__":
    person_server()

2.4 运行客户端和服务端

source devel/setup.bash
rosrun rosrun learning_service person_client.py 

source devel/setup.bash
rosrun rosrun learning_service person_server.py

2.5 效果

3 代码解释

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值