步骤 1: 安装 ROS
首先,需要在虚拟机中安装ROS。可以按照ROS官方文档提供的安装指南进行操作,选择适合虚拟机操作系统的安装方式。
步骤 2: 创建工作空间
在虚拟机中创建一个ROS工作空间,用于存放ROS包。
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/
catkin_make
source devel/setup.bash
步骤 3: 编写服务端代码
在 ~/catkin_ws/src 目录下创建一个ROS包,然后在该包中创建服务端节点的源文件。
cd ~/catkin_ws/src
catkin_create_pkg my_package rospy std_srvs
cd my_package
mkdir scripts
服务端代码:
#!/usr/bin/env python
import rospy
from std_srvs.srv import SetBool, SetBoolResponse
def service_callback(request):
a = request.data // 10
b = request.data % 10
result = a + b
rospy.loginfo("Received request: {}. Sending response: {}".format(request.data, result))
return SetBoolResponse(success=True, message="Sum of {} and {} is {}".format(a, b, result))
def service_server():
rospy.init_node('service_server')
service = rospy.Service('sum_service', SetBool, service_callback)
rospy.loginfo("Service server is ready.")
rospy.spin()
if __name__ == '__main__':
service_server()
客户端代码(Python):
#!/usr/bin/env python
import rospy
from std_srvs.srv import SetBool
def service_client(data):
rospy.wait_for_service('sum_service')
try:
sum_service = rospy.ServiceProxy('sum_service', SetBool)
response = sum_service(data)
rospy.loginfo("Received response: {}".format(response.message))
except rospy.ServiceException as e:
rospy.logerr("Service call failed: {}".format(e))
if __name__ == '__main__':
rospy.init_node('service_client')
data = 39
rospy.loginfo("Sending request: {}".format(data))
service_client(data)
将上文提供的服务端代码保存为 service_server.py,放入 ~/catkin_ws/src/my_package/scripts 目录中。
步骤 4: 编写客户端代码
同样,在 ~/catkin_ws/src/my_package/scripts 目录下创建客户端节点的源文件。
将上文提供的客户端代码保存为 service_client.py,放入 ~/catkin_ws/src/my_package/scripts 目录中。
步骤 5: 编译
在 ~/catkin_ws 目录下编译ROS包。
cd ~/catkin_ws
catkin_make
步骤 6: 运行
现在可以运行服务端和客户端了。
在一个终端中运行服务端:
cd ~/catkin_ws
source devel/setup.bash
rosrun my_package service_server.py
在另一个终端中运行客户端:
cd ~/catkin_ws
source devel/setup.bash
rosrun my_package service_client.py
客户端会发送请求给服务端,服务端计算并返回结果,客户端接收并输出结果。
注意事项
确保服务端和客户端的文件权限设置正确,使其可执行。
在运行节点之前,确保ROS环境已正确设置,可以通过执行
source devel/setup.bash
或将其添加到 .bashrc 文件中来设置。
确保ROS Master已正确启动,否则节点之间无法通信。(roscore指令来执行)