Skip to content

Commit

Permalink
fix: 修订:ROS2-005-通信机制:服务通信-两个分支内相关描述修订
Browse files Browse the repository at this point in the history
  • Loading branch information
JeacsonSnake committed Oct 11, 2024
1 parent ee2e88e commit 5e19ac6
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 7 deletions.
35 changes: 31 additions & 4 deletions docs/learningNote/Ros2_Note/2024_10_03_003.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,14 +114,37 @@ int main(int argc, char *argv[])

```
编写完服务端之后,我们可以使用以下方法对其进行调试,测试其是否可以使用:
在该工作空间内编译完功能包后,开启该服务端:
```shell
colcon build --packages-select cpp02_service
. install/setup.bash
ros2 run cpp02_service demo01_server
```

新建另一个终端,cd进入该工作空间后:

```shell
. install/setup.bash
ros2 service call add_ints base_interfaces_demo/srv/AddInts "{'num1': 10, 'num2': 30}"
```

关键指令 `ros2 service call add_ints base_interfaces_demo/srv/AddInts "{'num1': 10, 'num2': 30}"` 中的相关参数含义如下:

1. **add_ints** 为该服务端内的话题名称;
2. **base_interfaces_demo/srv/AddInts** 为声明(指定)需要提交的数据的类型;
3. **"{'num1': 10, 'num2': 30}"** 为一个JSON格式的、使用英文双引号包裹的`字符串`,其中需要包含需要提交给服务端的相关数据,在这里为两个整型数据。

### 2. 编写客户端实现

功能包 `cpp02_service``src` 目录下,新建 C++ 文件 `demo02_client.cpp`,并编辑文件,输入如下内容:

```cpp
/*
  需求:编写客户端,发送两个整型变量作为请求数据,并处理响应结果。   
  需求:编写客户端,在校验个数后,发送两个整型变量作为请求数据,并处理响应结果。   
  步骤:
      1. 包含头文件;
      2. 初始化 ROS2 客户端;
Expand Down Expand Up @@ -227,6 +250,10 @@ int main(int argc, char *argv[])

```
::: tip 为什么这里的客户端不使用spin函数进行之前的挂起操作了?
在本节**这个**服务通信的案例中,客户端针对相关请求只需发送一次,因此在这执行逻辑上,再次挂起客户端意义不大。并且该客户端没有在自定义类中定义相关需要使用`spin()`函数进行操作的回调函数,实现中也并不需要使用除`spin_unitl_future_complete()`函数外的其他回调函数进行数据处理,因此在这里不必要再在请求结束后继续使用spin函数进行之前的挂起操作。这会与之前的相关操作有些不同,还请注意。
:::
### 3. 编辑配置文件
在 C++ 功能包中,配置文件需要关注 `package.xml` 与 `CMakeLists.txt` 。如果是自建的文件,需要针对各个文件进行附加配置。
Expand Down Expand Up @@ -290,7 +317,7 @@ colcon build --packages-select cpp02_service

### 5. 执行

当前工作空间下,启动两个终端,终端1执行发布程序,终端2执行订阅程序
当前工作空间下,分别启动两个终端,先在终端1执行服务端,然后在终端2执行客户端

终端1输入如下指令:

Expand All @@ -310,8 +337,8 @@ ros2 run cpp02_service demo02_client

![C++实现简单服务通信运行结果](./assets/Service_Comm_Running_Result_Cpp.png)

::: tip spin函数的作用
主函数中执行 `spin` 函数会使主程序挂起,通过之前传入的节点对象指针进入该节点对象,并执行其内部的回调函数。因此简言之,spin函数可用于调用节点对象内的回调函数,如果没有 `spin` 函数,则该回调函数不会被执行
::: tip 必须要先开启服务端!
在进行服务通信时必须保证客户端能够正常连接到服务端,才能够使得客户端在发送请求时相关数据不会丢失。因此必须先开启服务端,再开启客户端
:::

## 总结
Expand Down
37 changes: 34 additions & 3 deletions docs/learningNote/Ros2_Note/2024_10_03_004.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,13 +110,36 @@ if __name__ == '__main__':    

```

编写完服务端之后,我们可以使用以下方法对其进行调试,测试其是否可以使用:

在该工作空间内编译完功能包后,开启该服务端:

```shell
colcon build --packages-select py02_service
. install/setup.bash
ros2 run py02_service demo01_server
```

新建另一个终端,cd进入该工作空间后:

```shell
. install/setup.bash
ros2 service call add_ints base_interfaces_demo/srv/AddInts "{'num1': 10, 'num2': 30}"
```

关键指令 `ros2 service call add_ints base_interfaces_demo/srv/AddInts "{'num1': 10, 'num2': 30}"` 中的相关参数含义如下:

1. **add_ints** 为该服务端内的话题名称;
2. **base_interfaces_demo/srv/AddInts** 为声明(指定)需要提交的数据的类型;
3. **"{'num1': 10, 'num2': 30}"** 为一个JSON格式的、使用英文双引号包裹的`字符串`,其中需要包含需要提交给服务端的相关数据,在这里为两个整型数据。

### 2. 编写客户端实现

功能包 `py02_service``py02_service` 目录下,新建 `Python` 文件 `demo02_client_py.py` ,并编辑文件,输入如下内容:

```python
"""
  需求:编写客户端,发送两个整型变量作为请求数据,并处理响应结果。     
  需求:编写客户端,在校验个数后,发送两个整型变量作为请求数据,并处理响应结果。     
  步骤:      
      1. 导包;        
      2. 初始化 ROS2 客户端;        
Expand Down Expand Up @@ -151,7 +174,7 @@ class MinimalClients(Node):
返回值:订阅对象
"""
     self.cli_ = self.create_client(AddInts, "topic_add_ints")
     self.cli_ = self.create_client(AddInts, "add_ints")
# 3-2. 等待服务连接。
while not self.cli_.wait_for_service(timeout_sec=1.0):
self.get_logger().info("服务连接中,请稍后。。。")
Expand Down Expand Up @@ -192,6 +215,10 @@ if __name__ == '__main__':    

```

::: tip 为什么这里的客户端不使用spin函数进行之前的挂起操作了?
在本节**这个**服务通信的案例中,客户端针对相关请求只需发送一次,因此在这执行逻辑上,再次挂起客户端意义不大。并且该客户端没有在自定义类中定义相关需要使用`spin()`函数进行操作的回调函数,实现中也并不需要使用除`spin_unitl_future_complete()`函数外的其他回调函数进行数据处理,因此在这里不必要再在请求结束后继续使用spin函数进行之前的挂起操作。这会与之前的相关操作有些不同,还请注意。
:::

### 3. 编辑配置文件

`Python` 功能包中,配置文件需要关注 `package.xml``setup.py` 。如果是自建的文件,需要针对各个文件进行附加配置。
Expand Down Expand Up @@ -246,7 +273,7 @@ colcon build --packages-select py02_service

### 5. 执行

当前工作空间下,启动两个终端,终端1执行发布程序,终端2执行订阅程序
当前工作空间下,分别启动两个终端,先在终端1执行服务端,然后在终端2执行客户端

终端1输入如下指令:

Expand All @@ -266,6 +293,10 @@ ros2 run py02_service demo02_client_py 100 200

![Python实现简单服务通信运行结果](./assets/Service_Comm_Running_Result_Py.png)

::: tip 必须要先开启服务端!
在进行服务通信时必须保证客户端能够正常连接到服务端,才能够使得客户端在发送请求时相关数据不会丢失。因此必须先开启服务端,再开启客户端。
:::

## 总结

尝试使用 Python 实现 **服务通信** 后,你可以尝试 [使用 C++ 实现服务通信](./2024_10_03_003.md),或者 回到 [ROS2-005-通信机制:服务通信](./2024_10_03.md#总结) 以查看本节的总结。

0 comments on commit 5e19ac6

Please sign in to comment.