@[TOC](ROS实操入门系列(五)通过Service设置小乌龟的各种功能(位置、行走路线颜色、清除路线、生成新乌龟等))
小乌龟功能列表
-
开启小乌龟节点后,可以使用 rosservice 命令查询当前小乌龟的功能
rosservice list
-
清除功能(可以清理小乌龟走过的线路)
rosservice call /clear
-
杀死小乌龟,小乌龟默认名称为turtle1
rosservice 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()