当前位置:网站首页>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
边栏推荐
- [shangpinhui] project notes
- Flex layout
- [JS] - [throttling and anti shake function]
- Spark 离线开发框架设计与实现
- HJ明明的随机数
- XML serialization backward compatible
- GPIO configuration of SOC
- asp. Net datalist when there are multiple data displays
- Flutter realizes the function of "shake"
- 7-2 Finnish wooden chess structure Sorting
猜你喜欢

MySQL tablespace parsing

你了解TCP协议吗(一)?

Idea package together, using compact middle packages to solve &

【js】-【DFS、BFS应用】-学习笔记

Airflow2.1.1 summary of the pits stepped on in actual combat!!

nlp序列完全可以模拟人脑智能

GPIO configuration of SOC

asp. Net to search products and realize paging function

Ambari (VIII) --- ambari integrated impala document (valid for personal test)

Recommended system series (Lecture 5): Optimization Practice of sorting model
随机推荐
A single node obtains the lock lock of the order number
你了解TCP协议吗(二)?
Kubernetes理论基础
Software design of resistance test board
【尚品汇】项目笔记
Ambari (VIII) --- ambari integrated impala document (valid for personal test)
SQL analysis (query interception analysis for SQL optimization)
"Three routines" of digital collection market
22/02/14 study notes
ACM notes
HJ成绩排序
Sword finger offer|: linked list (simple)
HJ character count
Airflow2.1.1 ultra detailed installation document
ACM笔记
[shangpinhui] project notes
Section 8: DMA of zynq
Study notes 22/1/19 and 22/1/20
flex布局
推荐系统系列精讲(第五讲): 排序模型的调优实践