@[TOC](ROS实操入门系列(五)通过Service设置小乌龟的各种功能(位置、行走路线颜色、清除路线、生成新乌龟等))

小乌龟功能列表

  1. 开启小乌龟节点后,可以使用 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

重置小乌龟

小乌龟行走路线的颜色

设置绝对位置

生成新的小乌龟

需求

  1. 实现图形化界面,来控制小乌龟的运行

小乌龟的模拟器,其实是一个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坐标转换等技术要点。每个技术点都会结合例子先把原理讲解清楚,为了达到学以致用的目的,我们会再进行知识拓展,针对每个技术点实现对应的生动有趣的需求,保证学完后会有很大的收获。