跨机器ROS服务调用:在不同包名下实现分布式服务端和客户端节点
好的,我们将分别为服务端和客户端使用不同的包名,例如服务端使用robot_server_package
,客户端使用robot_client_package
。
一、服务端节点配置(robot_server)
创建包和定义服务类型
创建一个名为
robot_server_package
的包,并在srv
目录下创建一个名为AddTwoInts.srv
的文件:1
2
3
4int64 a
int64 b
---
int64 sum确保在
CMakeLists.txt
和package.xml
中正确配置,以便生成服务代码。CMakeLists.txt
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cmake_minimum_required(VERSION 3.0.2)
project(robot_server_package)
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS rospy std_msgs message_runtime
)
include_directories(
${catkin_INCLUDE_DIRS}
)package.xml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<package format="2">
<name>robot_server_package</name>
<version>0.0.0</version>
<description>The robot_server_package</description>
<maintainer email="your_email@example.com">Your Name</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<export>
</export>
</package>运行
catkin_make
生成消息和服务代码。
编写服务端节点
编写服务端节点add_two_ints_server.py
,并将其放在robot_server_package/scripts
目录下:
1 | #!/usr/bin/env python |
二、客户端节点配置(robot_client)
创建包和定义服务类型
创建一个名为
robot_client_package
的包,并在srv
目录下创建一个名为AddTwoInts.srv
的文件,与服务端的服务类型相同:1
2
3
4int64 a
int64 b
---
int64 sum确保在
CMakeLists.txt
和package.xml
中正确配置,以便生成服务代码。CMakeLists.txt
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26cmake_minimum_required(VERSION 3.0.2)
project(robot_client_package)
find_package(catkin REQUIRED COMPONENTS
rospy
std_msgs
message_generation
)
add_service_files(
FILES
AddTwoInts.srv
)
generate_messages(
DEPENDENCIES
std_msgs
)
catkin_package(
CATKIN_DEPENDS rospy std_msgs message_runtime
)
include_directories(
${catkin_INCLUDE_DIRS}
)package.xml
:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20<package format="2">
<name>robot_client_package</name>
<version>0.0.0</version>
<description>The robot_client_package</description>
<maintainer email="your_email@example.com">Your Name</maintainer>
<license>BSD</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>rospy</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<exec_depend>rospy</exec_depend>
<exec_depend>std_msgs</exec_depend>
<exec_depend>message_runtime</exec_depend>
<export>
</export>
</package>运行
catkin_make
生成消息和服务代码。
编写客户端节点
编写客户端节点add_two_ints_client.py
,并将其放在robot_client_package/scripts
目录下:
1 | #!/usr/bin/env python |
三、运行服务和客户端
- 在两台机器上设置ROS环境
确保/etc/hosts
文件包含彼此的IP地址和主机名。例如,在robot_server
和robot_client
机器上的/etc/hosts
文件应该包含:
1 | 192.168.1.2 robot_server |
在robot_server
上设置环境变量:
1 | export ROS_MASTER_URI=http://robot_server:11311 |
在robot_client
上设置环境变量:
1 | export ROS_MASTER_URI=http://robot_server:11311 |
- 启动ROS master
在robot_server
上运行:
1 | roscore |
3.在robot_server
上运行服务端节点
确保脚本是可执行的:
1 | chmod +x ~/catkin_ws/src/robot_server_package/scripts/add_two_ints_server.py |
运行服务端节点:
1 | rosrun robot_server_package add_two_ints_server.py |
- 在
robot_client
上运行客户端节点
确保脚本是可执行的:
1 | chmod +x ~/catkin_ws/src/robot_client_package/scripts/add_two_ints_client.py |
运行客户端节点:
1 | rosrun robot_client_package add_two_ints_client.py 2 3 |
如果配置正确,你应该会在robot_server
上看到服务端处理请求的输出,并在robot_client
上看到客户端请求的结果。
这样,你就可以在不同的机器上运行ROS节点,并调用共享的服务。