@[TOC](ROS实操入门系列(五)通过Service设置小乌龟的各种功能(位置、行走路线颜色、清除路线、生成新乌龟等))
小乌龟功能列表
-
开启小乌龟节点后,可以使用 rosservice 命令查询当前小乌龟的功能
rosservice list
清除功能(可以清理小乌龟走过的线路)
rosservice call /clear
杀死小乌龟,小乌龟默认名称为turtle1rosservice call /kill "name: 'turtle1'"
重置小乌龟rosservice call /reset
通过设置x,y来设置新乌龟的位置。通过设置theta来设置小乌龟头的朝向。通过设置name来设置小乌龟的名称。
设置小乌龟行走路线的颜色rosservice call /turtle1/set_pen "{r: 255, g: 0, b: 0, width: 10, 'off': 0}"
r,g,b控制画笔的颜色值。取值范围为0-255.
with控制的是画笔的粗细。
off表示是否使用画笔,0代表是使用,1为不使用。不使用时看不见行走的路线
设置绝对位置rosservice call /turtle1/teleport_absolute "x: 3.0
y: 4.0
theta: 1.57"通过设置x,y来设置小乌龟的位置。通过设置theta来设置小乌龟头的朝向。
生成新的小乌龟rosservice call /spawn "x: 0.0
y: 0.0
theta: 0.0
name: ''"通过设置x,y来设置新的小乌龟的位置。通过设置theta来设置小乌龟头的朝向。通过name设置小乌龟名字
工具调试
使用调试工具进行下面的调试
rosrun rqt_service_caller rqt_service_caller
清除功能,先控制乌龟走一段路线,然后清除
清除掉小乌龟,小乌龟默认名称为turtle1
重置小乌龟
小乌龟行走路线的颜色
设置绝对位置
生成新的小乌龟
需求
-
实现图形化界面,来控制小乌龟的运行
小乌龟的模拟器,其实是一个Service的Server端,我们要对小乌龟进行一些列的操作,我们就去创建一系列的Client端, 按照对应的服务数据题规范进行服务访问。
总结起来,我们要干的事情就是:
(1)创建QT UI
(2)创建 Service通讯
(3)整合QT UI 和 Service通讯
主要代码实现
清理画布
def click_clear(self):
# 访问小乌龟的服务 /clear
# 查看该服务的类型: std_srvs/Empty
service_name = '/clear'
client = rospy.ServiceProxy(service_name, Empty)
client.wait_for_service()
client.call(EmptyRequest())
client.close()
重置小乌龟
def click_reset(self):
service_name = '/reset'
client = rospy.ServiceProxy(service_name, Empty)
client.wait_for_service()
client.call(EmptyRequest())
client.close()
创建新的小乌龟
def click_spawn(self):
service_name = '/spawn'
client = rospy.ServiceProxy(service_name, Spawn)
client.wait_for_service()
x = float(self.le_spawn_x.text())
y = float(self.le_spawn_y.text())
# 输入为角度值
theta = float(self.le_spawn_theta.text())
name = self.le_spawn_name.text()
request = SpawnRequest()
request.x = x
request.y = y
request.theta = radians(theta)
request.name = name
client.call(request)
client.close()
清除掉小乌龟
def click_kill(self):
service_name = '/kill'
client = rospy.ServiceProxy(service_name,Kill)
client.wait_for_service()
request = KillRequest()
request.name = self.le_kill_name.text()
client.call(request)
client.close()
设置小乌龟行走路线的颜色
def click_pen(self):
name = self.le_pen_name.text()
r = int(self.le_pen_r.text())
g = int(self.le_pen_g.text())
b = int(self.le_pen_b.text())
width = int(self.le_pen_width.text())
checked = self.cb_pen.isChecked()
off = 1 if checked else 0
service_name = '/{}/set_pen'.format(name)
client = rospy.ServiceProxy(service_name, SetPen)
client.wait_for_service()
request = SetPenRequest()
request.r = r
request.g = g
request.b = b
request.width = width
request.off = off
client.call(request)
client.close()
设置小乌龟的绝对路径
def click_absolute(self):
name = self.le_absolute_name.text()
x = float(self.le_absolute_x.text())
y = float(self.le_absolute_y.text())
theta = float(self.le_absolute_theta.text())
service_name = '/{}/teleport_absolute'.format(name)
client = rospy.ServiceProxy(service_name, TeleportAbsolute)
client.wait_for_service()
request = TeleportAbsoluteRequest()
request.x = x
request.y = y
request.theta = radians(theta)
client.call(request)
client.close()
https://www.lanqiao.cn/courses/2947,提供准备好的云主机ros环境,进行实操,课程包括了 Topic 通讯, Service 通讯,ROS 自定义消息,URDF可视化,TF坐标转换等技术要点。每个技术点都会结合例子先把原理讲解清楚,为了达到学以致用的目的,我们会再进行知识拓展,针对每个技术点实现对应的生动有趣的需求,保证学完后会有很大的收获。
评论(0)
您还未登录,请登录后发表或查看评论