文章目录
- 第 9 课 编写简单的服务端 Server
-
- 1.创建服务器代码
- 2.运行服务器节点
第 9 课 编写简单的服务端 Server
1.创建服务器代码
注意:在创建服务器代码之前,需要先创建工作空间和功能包,具体操作过程可前往目录“第4课 创建工作空间与功能包”查看文档。
- 输入指令“cd catkin_ws/src/beginner_hiwonder/scripts/”,回车。
- 输入指令“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.运行服务器节点
- 输入指令“roscore”,启动节点管理器。
若已开启,则会出现以下提示:
- 输入指令“rosrun turtlesim turtlesim_node”,并按下回车,启动小乌龟仿真器。
- 打 开 一 个 新 的 命 令 行 终 端 , 输 入 指 令 “ rosrun beginner_hiwonder turtle_command_server.py”,并按下回车,运行服务器节点。如需停止节点的运行,可按下快捷键“Ctrl+C”。
- 再次打开一个新的命令行终端,输入指令“rosservice call /turtle_command “{}””,并按下回车,令小乌龟沿着圆形轨迹移动。