ROS第 9 课 编写简单的服务端 Server

文章目录

  • 第 9 课 编写简单的服务端 Server
    • 1.创建服务器代码
    • 2.运行服务器节点

第 9 课 编写简单的服务端 Server

1.创建服务器代码


注意:在创建服务器代码之前,需要先创建工作空间和功能包,具体操作过程可前往目录“第4课 创建工作空间与功能包”查看文档。


  1. 输入指令“cd catkin_ws/src/beginner_hiwonder/scripts/”,回车。
    在这里插入图片描述
  2. 输入指令“vi turtle_command_server.py”编辑程序,复制下面程序。如需修改,再按下“i”即可修改。修改完成,按下“Esc”,输入“:wq”保存并退出。
    在这里插入图片描述
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# 导入ROS的python接口模块
import rospy
# 导入thread模块用于创建新线程,time模块用于休眠
import thread, time
# 从geometry_msgs.msg导入Twist消息类型,该消息定义了线性和角速度
from geometry_msgs.msg import Twist
# 从std_srvs.srv导入Trigger服务类型,该服务用于简单的触发请求
from std_srvs.srv import Trigger, TriggerResponse

# 初始化全局变量pubCommand,用于确定是否发布速度命令
pubCommand = False;

# 定义一个Publisher,发布消息到'/turtle1/cmd_vel'话题,消息类型为Twist,队列长度为10
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)

# 定义一个线程函数,用于连续发布速度命令
def command_thread():
    while True:  # 持续运行
        if pubCommand:  # 如果pubCommand为True,则发布速度命令
            vel_msg = Twist()  # 创建Twist类型的消息
            # 设置线速度为0.5m/s,角速度为0.2rad/s
            vel_msg.linear.x = 0.5
            vel_msg.angular.z = 0.2
            # 使用Publisher发布速度命令
            turtle_vel_pub.publish(vel_msg)

        time.sleep(0.1)  # 每次循环等待0.1秒

# 定义服务的回调函数,当有服务请求时调用
def commandCallback(req):
    global pubCommand  # 使用全局变量pubCommand
    pubCommand = bool(1-pubCommand)  # 切换pubCommand的值
    # 在ROS日志中记录信息
    rospy.loginfo("Publish turtle velocity command![%d]", pubCommand)
    # 返回服务响应
    return TriggerResponse(1, "Change turtle command state!")

# 定义一个函数用于设置ROS节点和服务
def turtle_command_server():
    rospy.init_node('turtle_command_server')  # 初始化ROS节点,名称为'turtle_command_server'
    # 创建一个服务'/turtle_command',服务类型为Trigger,服务请求时调用commandCallback
    s = rospy.Service('/turtle_command', Trigger, commandCallback)
    print "Ready to receive turtle command."
    # 创建一个新线程运行command_thread函数
    thread.start_new_thread(command_thread, ())
    # spin()保持python脚本不会退出,直到节点被显式关闭
    rospy.spin()

# 当脚本被执行时
if __name__ == "__main__":
    turtle_command_server()  # 调用turtle_command_server函数

在这里插入图片描述
3) 输入指令“chmod +x turtle_command_server.py”,并按下回车,为保存的turtle_command_server.py赋予可执行权限。
在这里插入图片描述

2.运行服务器节点

  1. 输入指令“roscore”,启动节点管理器。
    在这里插入图片描述
    若已开启,则会出现以下提示:
    在这里插入图片描述
  2. 输入指令“rosrun turtlesim turtlesim_node”,并按下回车,启动小乌龟仿真器。
    在这里插入图片描述
  3. 打 开 一 个 新 的 命 令 行 终 端 , 输 入 指 令 “ rosrun beginner_hiwonder turtle_command_server.py”,并按下回车,运行服务器节点。如需停止节点的运行,可按下快捷键“Ctrl+C”。
    在这里插入图片描述
  4. 再次打开一个新的命令行终端,输入指令“rosservice call /turtle_command “{}””,并按下回车,令小乌龟沿着圆形轨迹移动。
    在这里插入图片描述
    在这里插入图片描述