编写简单的服务和客户端(C++)
**目标:**使用 C++ 创建并运行服务节点和客户端节点。
**教程关卡:**初学者
**时间:**20 分钟
背景
当节点通过服务通信时,发送数据请求的节点称为客户端节点,响应请求的节点称为服务节点。请求和响应的结构由 .srv 文件确定。
这里使用的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点则以结果回应。
前提条件
在之前的教程中,你学过如何创建工作区和包。
1 创建包
打开一个新终端,获取你的 ROS 2 安装源代码,这样 ROS2 命令才能正常工作。
进入之前教程创建的 ros2_ws 目录。
记住,包应该在 src 目录里创建,而不是在工作空间的根目录里。进入 ros2_ws/src 并创建一个新包:
ros2 pkg create --build-type ament_cmake --license Apache-2.0 cpp_srvcli --dependencies rclcpp example_interfaces
你的终端会返回一条消息,验证你的包 cpp_srvcli 及其所有必要的文件和文件夹的创建。
--dependencies 参数会自动为 package.xml 和 CMakeLists.txt 添加必要的依赖项。example_interfaces 是包含你用来结构化请求和响应所需的 .srv 文件的包:
int64 a
int64 b
---
int64 sum
前两行是请求的参数,破折号下方是响应。
1.1 更新 package.xml
因为你在创建包时用了 --dependencies 选项,所以你不需要手动在 package.xml 或 CMakeLists.txt 添加依赖。
不过,一如既往,请务必在 package.xml 中添加说明、维护者邮箱和姓名,以及许可信息。
<description>C++ client server tutorial</description>
<maintainer email="[email protected]">Your Name</maintainer>
<license>Apache-2.0</license>
2 写入服务节点
在 ros2_ws/src/cpp_srvcli/src 目录内,创建一个名为 add_two_ints_server.cpp 的新文件,并粘贴以下代码:
#include "rclcpp/rclcpp.hpp"
{
response->sum = request->a + request->b;
(rclcpp::(), , request->a, request->b);
(rclcpp::(), , ( )response->sum);
}
{
rclcpp::(argc, argv);
std::shared_ptr<rclcpp::Node> node = rclcpp::Node::();
rclcpp::Service<example_interfaces::srv::AddTwoInts>::SharedPtr service =
node-><example_interfaces::srv::AddTwoInts>(, &add);
(rclcpp::(), );
rclcpp::(node);
rclcpp::();
}

