赞
踩
用python来编写ros话题、服务方面常用的几个点:
话题topic
1、初始化节点
rospy.init_node("节点名字")
pub = rospy.Publisher(话题名称,话题数据类型,话题数据队列大小)
rospy.Subscriber(话题名称,话题数据类型,回调函数名称)
举例:rospy.Subscriber('/cmd_vel', Twist, velCallback)
4、 设置循环频率以及按照循环频率延时
- rate = rospy.Rate(频率大小)
- rate.sleep()
举例:rate = rospy.Rate(50)
以50Hz的频率发布消息
5、发布消息
发布者对象.publish(消息数据)
举例:vel_pub.publish(vel_msg),这里的msg要与发布者规定的一致。
6、判断节点是否关闭
rospy.is_shutdown()
常用在循环里边,节点开启,进入循环,节点关闭,退出循环。
7、导入自定义的msg/srv文件
from PackageName.msg import Defmsg
举例:功能包名字是School_Information,自定义的msg文件是Student且放在School_Information功能包的msg文件夹下,则导入Student类型的msg文件时候,可以写
from School_Information.msg import Student
服务service
1、服务消息
服务消息由请求数据和应答数据组成,请求数据可以理解成函数输入参数,应答数据可以理解成
函数的返回值。需要注意的是,请求数据与应答数据之间,用---间隔开来。
举例,定义一个服务数据,请求数据为两个整型数据,应答数据也是一个整数据,
- int32 requets_a
- int32 request_b
- ---
- int response_c
2、定义一个服务端
def_service = rospy.Service("服务的名字",服务数据类型,服务函数名称)
举例,定义一个服务,名字是Add_int,服务数据类型是Two_Int,服务内容函数名字是Add_proc是把两个请求数据相加后返回它们的和,
- s = rospy.Service("Add_int",Two_Int,Add_proc)
- def Add_proc(req):
- result = req.request_a + req.request_b;
- return Two_IntRespone(result)
这里的服务函数参数名字必须是req,在调用了该服务时候,会把参数赋值给req.
3、引用请求服务的数据
req.定义服务消息的请求数据的名字
举例,我们定义了一个服务消息类型数据,其中,服务数据的变量名字是request_a,那么再调用这个服务请求数据的时候,就是,
req.request_a
4、返回服务函数服务结果
return 服务数据类型Responese(返回的具体内容)
返回时候需要指定服务数据的类型名字,也就是自定义的服务类型数据的名字,返回的具体内容就是期望返回的数据,这里的数据类型需要与定义服务数据时候定义的应答数据类型一致。举例,
- result = req.a + req.b
- return Two_IntResponse(result)
5、等待服务
rospy.wait_for_service("服务名称")
举例,
rospy.wait_for_service("Add_int")
6、创建一个客户端
client = rospy.ServiceProxy("服务名称",服务数据类型)
在创建客户端时,我们需要说明我们需要请求的服务是什么,也就是服务名称,以及我们的服务数据类型,举例,
c = rospy.ServiceProxy("Add_int",Two_int)
7、客户端调用服务
使用函数call,会返回应答数据response,这是是指定的名字,
response = 客户端.call(服务请求数据)
举例,
response = c.call(100,200)
把请求数据发到服务端后作为函数参数传入服务函数,服务端就会计算出应答数据,并且返回,赋值给response,这是个关键词,并不是一个变量的名字。
8、调用服务返回的应答数据
respone.服务数据中的应答数据的变量名字
举例,
response.response_c
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。