当前位置:网站首页>ROS 笔记(08)— 服务数据的定义与使用
ROS 笔记(08)— 服务数据的定义与使用
2022-06-28 07:58:00 【wohu1104】
1. 服务模型
我们要实现的话题模型如下:
2. 自定义服务实现
2.1 定义 srv 文件
在功能包 service_client 目录下创建一个 srv 文件夹,在该文件夹中创建一个 Person.srv 文件,如下图所示:
Person.srv 中有我们自定义的消息格式
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
---
string result
2.2 添加功能包依赖
在 package.xml 中添加以下 exec_depend 运行依赖:
<exec_depend>message_generation</exec_depend>
<exec_depend>message_runtime</exec_depend>
2.3 添加编译选项

find_package(catkin REQUIRED COMPONENTS
geometry_msgs
rospy
std_msgs
turtlesim
message_generation # 新增内容
add_message_files(
FILES
Person.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES topic_demo
CATKIN_DEPENDS geometry_msgs rospy std_msgs turtlesim message_runtime
# DEPENDS system_lib
)
2.4 编译生成语言相关的文件
到项目根目录下执行 catkin_make 命令
$ catkin_make
Base path: /home/wohu/project/ros/ros_demo
Source space: /home/wohu/project/ros/ros_demo/src
Build space: /home/wohu/project/ros/ros_demo/build
Devel space: /home/wohu/project/ros/ros_demo/devel
Install space: /home/wohu/project/ros/ros_demo/install
####
#### Running command: "make cmake_check_build_system" in "/home/wohu/project/ros/ros_demo/build"
####
####
#### Running command: "make -j12 -l12" in "/home/wohu/project/ros/ros_demo/build"
####
[ 0%] Built target std_msgs_generate_messages_nodejs
[ 0%] Built target std_msgs_generate_messages_lisp
[ 0%] Built target std_msgs_generate_messages_eus
[ 0%] Built target std_msgs_generate_messages_cpp
[ 0%] Built target std_msgs_generate_messages_py
[ 0%] Built target _topic_demo_generate_messages_check_deps_Person
[ 0%] Built target _service_client_generate_messages_check_deps_Person
[ 21%] Generating C++ code from service_client/Person.srv
[ 21%] Built target topic_demo_generate_messages_py
[ 28%] Generating Lisp code from service_client/Person.srv
[ 35%] Generating Python code from SRV service_client/Person
[ 42%] Built target topic_demo_generate_messages_lisp
[ 50%] Generating Javascript code from service_client/Person.srv
[ 57%] Generating EusLisp code from service_client/Person.srv
[ 71%] Built target topic_demo_generate_messages_eus
[ 78%] Built target topic_demo_generate_messages_nodejs
[ 85%] Built target topic_demo_generate_messages_cpp
[ 85%] Built target topic_demo_generate_messages
[ 85%] Built target service_client_generate_messages_lisp
[ 85%] Built target service_client_generate_messages_nodejs
[ 92%] Built target service_client_generate_messages_eus
[100%] Generating Python srv __init__.py for service_client
[100%] Built target service_client_generate_messages_cpp
[100%] Built target service_client_generate_messages_py
[100%] Built target service_client_generate_messages
可以看到会生成各种语言的代码文件。其中 Python 相关的代码文件在
/devel/lib/python2.7/dist-packages
目录下
2.5 运行代码
客户端代码 person_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将请求/show_person服务,服务数据类型learning_service::Person
import sys
import rospy
from service_client.srv import Person, PersonRequest
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())
服务端代码 person_server.py 代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将执行/show_person服务,服务数据类型learning_service::Person
import rospy
from service_client.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()
运行代码命令:
服务端代码:
$ cd ~/catkin_ws
$ catkin_make
$ source ./devel/setup.bash
$ rescore
$ rosrun service_client person_server.py
Ready to show person informtion.
[INFO] [1655723144.945655]: Person: name:Tom age:20 sex:1
[INFO] [1655723149.379382]: Person: name:Tom age:20 sex:1
[INFO] [1655723150.891466]: Person: name:Tom age:20 sex:1
客户端代码:
$ rosrun service_client person_client.py
response is result: "OK"
Show person result : OK
边栏推荐
- Redis uses sentinel master-slave switching. What should the program do?
- Is it reliable for flush to register and open an account? Is it safe?
- ES6 use of return in arrow function
- sql分析(查询截取分析做sql优化)
- Evaluation of inverse Polish expression < difficulty coefficient >
- At 19:00 on Tuesday evening, the 8th live broadcast of battle code Pioneer - how to participate in openharmony's open source contribution in multiple directions
- Study notes 22/1/11
- Redis cerebral fissure
- HJ21 简单密码
- asp. Net datalist to display product information and pictures
猜你喜欢
随机推荐
Dataset filling data, and the use of rows and columns
ZYNQ_ IIC read / write m24m01 record board status
Evaluation of inverse Polish expression < difficulty coefficient >
Tencent continued to lay off staff in the second half of the year, and all business groups reduced by at least 10%. What do you think of this? Followers
【js】-【DFS、BFS应用】-学习笔记
【尚品汇】项目笔记
Three step problem of leetcode
HJ delete the character with the least number of occurrences in the string
Cloud native: cloud computing technology is upgraded again to open an era of comprehensive cloud development
Hj21 simple password
Llvm and clang
asp. Net to search products and realize paging function
Disposition Flex
sql主从复制搭建
股票炒股注册开户靠谱吗?安全吗?
异或的应用。(提取出数字中最右侧的1,面试中经常用的到)
【js】-【节流、防抖函数】
SLAM中常用的雅克比矩阵J
[JS] - [throttling and anti shake function]
Software testing and quality final review








