ROS Learning-009 beginner_Tutorials ROS服务 和 ROS参数

ROS Indigo beginner_Tutorials-08 ROS服务 和 ROS参数

我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo

1. 理解 ROS 服务 和 ROS 参数:

服务(services)是节点之间通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response
( 节点之间通讯的方式 : 话题(rostopic) 和 服务(rosservice) )

我们先来启动一个小海龟节点: ( 开3个终端分别运行下面三个命令 )

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

2. rosservice : ROS 服务命令

2.1 list :

我们使用下面的命令来看一下当前有哪些服务在运行: (重新开一个终端(Ctrl+Alt+T))

$ rosservice  list

输出:

/clear
/kill
/reset
/rosout/get_loggers
/rosout/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level

这里写图片描述

如果你没事先执行 roscore 命令来启动 /rosout 主节点,那么当你执行 rosservice list 命令,会输出下面的提示信息:

ERROR: Unable to communicate with master!

你需要先执行 roscore 命令。


2.2 type :

很多服务在运行:我们来看看 /clear 这个服务的类型:

$ rosservice type /clear 

输出:

std_srvs/Empty

这里写图片描述

服务的类型为空(std_srvs/Empty)。这个std_srvs/Empty是ROS系统自定义的一个变量类型或者说是一个结构体。我们如何查看这个std_srvs/Empty内究竟是什么:

$ rosmsg show std_msgs/Empty 

这里写图片描述

std_srvs/Empty 这个变量类型里面什么都没有,表示你在调用 /clear 服务时,不需要参数。 什么意思呢,下面举个例子:


2.3 call :

第一个例子: 清空小海龟窗口背景里的运行轨迹:

我们使用rosservice call 命令来调用服务:

$ rosservice call [服务名] [需要的参数] 

我们来调用上面的/clear这个服务:(因为 /clear 这个服务的类型是 std_srvs/Empty (空),所以对于 /clear 这个服务,不需要参数)

$ rosservice call /clear 

调用之后,回去看一看小海龟窗口的背景里的运行轨迹都没有了。 (如果你之前使用方向键让小海龟移动过。)

再来一个例子:再生一个小海龟

我们来看看再生(/spawn)这个服务:
先看看调用这个服务需要什么参数:。执行下面的组合命令:

$ rosservice type  /spawn | rossrv show 

输出:

float32 x
float32 y
float32 theta
string name
---
string name

这里写图片描述

现在知道调用 /spawn 服务需要什么参数,我们就来再产生一个小海龟: (如果你将 nane 设为""(空),那么系统会自动生成一个新名字)

$ rosservice call /spawn 2 2 0.2 "" 

这时,服务返回了新产生的乌龟的名字(“turtle2”)。 新产生的乌龟,如下图:

这里写图片描述

这里写图片描述


3. rosparam : ROS 参数命令 :

下面再介绍一个命令:rosparam 参数服务器
使用方法和上面的命令(rosservice)都类似:

3.1 list :

先来看一下,当前 ROS 里面有哪些参数 :

$ rosparam list 

这里写图片描述

3.2 setget :

3.2.1 set

$ rosparam set [参数名]
$ rosparam get [参数名]

如何使用,举例说明:

比如现在我改变小海龟窗口背景的颜色:

$ rosparam set /background_r 150 

现在还是小海龟窗口的背景颜色不会改变的, 你必须要先 clear 一下:

$ rosservice call /clear 

这里写图片描述

3.2.2 get

我们使用get关键字 来得到当前参数的信息:

$ rosparam get /background_r

这里写图片描述

得到全部参数的信息:

$ rosparam get / 

这里写图片描述



小结:
因为一个ROS机器人的启动,等同于要启动多个节点程序。也就是说,我们每次想使用键盘的方向键控制小海龟时,我们必须在3个终端中启动3个节点:

$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key

这样做很麻烦,我们可不可以写一个脚本程序,将我们要运行的命令都写在一个启动脚本程序中,这样,每当我们想启动一个机器人的时候,就不需要记住一堆启动节点的命令,我们直接运行这个启动脚本程序,就可以了。所以我们下一节讲: 如何编写一个简单的启动脚本程序

<think>嗯,用户问的是关于`beginner_tutorials/AddTwoInts`的介绍,我需要先确定这个是什么。听起来像是ROS(机器人操作系统)中的一个基础教程,可能涉及到服务的创建使用。因为ROS里常见的例子比如发布者、订阅者、服务动作,而AddTwoInts可能是一个简单的服务示例,客户端发送两个整数,服务端返回它们的。 首先,我应该回忆一下ROS服务的基本结构。服务包含一个请求响应,通常用.srv文件定义。AddTwoInts.srv可能定义了两个int64的请求参数ab,然后响应是sum。接下来,服务端会等待客户端的请求,处理后将结果返回。客户端则发送请求并接收响应。 接下来,我需要组织回答的结构。先介绍这个示例的用途,属于哪个框架(ROS),然后解释服务客户端的工作原理,可能还要提到如何定义.srv文件以及如何运行节点。同时要注意用户可能是ROS的初学者,所以需要用简单易懂的语言,避免太专业的术语,但也不能遗漏关键步骤。 还要检查是否需要提到ROS版本,比如这个示例是否在ROS1ROS2中有所不同。不过用户没有指定版本,可能默认是ROS1,因为AddTwoInts是经典例子。此外,要确保提到的命令正确,比如catkin_make,rosrun,rosservice call这些常用命令是否正确。 可能需要注意用户的问题中是否存在拼写错误,比如`beginner_tutorials`是否正确,是否需要说明这是用户自己创建的包还是ROS的标准包。比如,通常beginner_tutorials可能是一个自定义的包名,用户在学习教程时创建的,所以需要指导如何创建srv文件,修改package.xmlCMakeLists.txt,然后编译运行。 另外,要确保回答中的LaTeX格式正确,比如变量用$符号包裹,独立公式用$$。例如,服务请求的ab可以用$a$$b$,响应是$a + b$的。虽然可能不需要复杂的数学公式,但如果有数值运算的话,可以适当使用。 还要考虑用户可能遇到的问题,比如服务没有启动,客户端无法连接,或者编译失败,是否需要给出排查建议?不过用户的问题主要是介绍,可能不需要深入问题解决,但可以稍微提一下常见问题,比如确保roscore运行,服务端节点已启动等。 总结回答的结构应该是:概述、服务端、客户端、定义srv文件、编译运行、示例命令,可能最后加上注意事项。确保每个部分简明扼要,步骤清晰,用户能按照步骤操作。同时,用中文表达,保持口语化,但不过于随意,确保专业性。</think>让我们以ROS为例逐步解析`AddTwoInts`服务的基本原理: $$ \begin{aligned} \text{服务名称} & : \text{AddTwoInts} \\ \text{请求参数} & : a \ (\text{int}), \ b \ (\text{int}) \\ \text{响应结果} & : \text{sum} = a + b \end{aligned} $$ 1. **服务定义** 创建`.srv`文件定义接口格式: ``` int64 a int64 b --- int64 sum ``` 2. **服务端实现** 核心逻辑伪代码: ```python def add_two_ints(req): sum = req.a + req.b # 计算$a + b$ return AddTwoIntsResponse(sum) ``` 3. **客户端调用** 典型调用过程: ```python client = rospy.ServiceProxy('add_two_ints', AddTwoInts) response = client.call(3, 5) # 返回$3 + 5 = 8$ ``` 4. **通信流程** 节点间通过RPC协议交互: ``` 客户端节点 ROS Master 服务端节点 | --- 注册服务 ---> | | | <-- 服务地址 --- | <--- 注册服务 --- | | --- 请求数据 ---------------------> | | <-- 响应结果 ------------------------ ``` 常见调试命令: ```bash rosservice list # 显示所有服务 rosservice info /add # 查看服务详情 rossrv show AddTwoInts # 显示服务数据结构 ``` 注意事项: ⚠️ 需先启动`roscore`核心节点 ⚠️ 服务端必须早于客户端启动 ⚠️ 使用`catkin_make`编译包含服务的功能包
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值