西宁网站建设天锐科技,厦门网站建设企,wordpress 虚拟浏览量,医院网站php源码ROS2 入门应用 请求和应答#xff08;C#xff09;1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包
在《ROS2 入门应用 工作空间》中已创建和加载了…
ROS2 入门应用 请求和应答C1. 创建功能包2. 创建源文件2.1. 服务端2.2. 客户端3. 添加依赖关系4. 添加编译信息4.1. 添加搜索库4.2. 增加可执行文件4.3. 增加可执行文件位置5. 编译和运行1. 创建功能包
在《ROS2 入门应用 工作空间》中已创建和加载了ros2_ws工作空间 在《ROS2 入门应用 元功能包C》中已创建和加载了my_package功能包 那么就创建一个独立的cpp_srvcli功能包来做服务的请求和应答的功能
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces--dependencies可选参数将会自动在package.xml和CMakeLists.txt中添加必要的依赖行
依赖example_interfaces包将会使用到example_interfaces的srv文件两位整数求和服务
int64 a
int64 b
---
int64 sum2. 创建源文件
进入cpp_srvcli功能包的src文件夹
cd ~/ros2_ws/src/cpp_srvcli/src2.1. 服务端
新建add_two_ints_server.cpp服务端源文件
nano add_two_ints_server.cpp复制以下内容到文件中
#include rclcpp/rclcpp.hpp
#include example_interfaces/srv/add_two_ints.hpp#include memory/* 求和函数 */
void add(const std::shared_ptrexample_interfaces::srv::AddTwoInts::Request request,std::shared_ptrexample_interfaces::srv::AddTwoInts::Response response)
{/* 从请求中添加两个整数并将总和提供给响应 */response-sum request-a request-b;/* 使用日志通知控制台其服务状态 */RCLCPP_INFO(rclcpp::get_logger(rclcpp), Incoming request\na: %ld b: %ld, request-a, request-b);RCLCPP_INFO(rclcpp::get_logger(rclcpp), sending back response: [%ld], (long int)response-sum);
}int main(int argc, char **argv)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 定义服务端节点add_two_ints_server */std::shared_ptrrclcpp::Node node rclcpp::Node::make_shared(add_two_ints_server);/* 创建服务名为add_two_ints服务函数为add的service服务端 */rclcpp::Serviceexample_interfaces::srv::AddTwoInts::SharedPtr service node-create_serviceexample_interfaces::srv::AddTwoInts(add_two_ints, add);/* 通知准备就绪 */RCLCPP_INFO(rclcpp::get_logger(rclcpp), Ready to add two ints.);/* 运行节点 */rclcpp::spin(node);/* 退出ROS2 */rclcpp::shutdown();
}2.2. 客户端
新建add_two_ints_client.cpp客户端源文件
nano add_two_ints_client.cpp复制以下内容到文件中
#include rclcpp/rclcpp.hpp
#include example_interfaces/srv/add_two_ints.hpp#include chrono
#include cstdlib
#include memory/* 方便表示时间 */
using namespace std::chrono_literals;int main(int argc, char **argv)
{/* 初始化ROS2 */rclcpp::init(argc, argv);/* 校验 */if (argc ! 3) {RCLCPP_INFO(rclcpp::get_logger(rclcpp), usage: add_two_ints_client X Y);return 1;}/* 定义客户端节点add_two_ints_client */std::shared_ptrrclcpp::Node node rclcpp::Node::make_shared(add_two_ints_client);/* 创建服务名为add_two_ints的client客户端 */rclcpp::Clientexample_interfaces::srv::AddTwoInts::SharedPtr client node-create_clientexample_interfaces::srv::AddTwoInts(add_two_ints);/* 创建请求request */auto request std::make_sharedexample_interfaces::srv::AddTwoInts::Request();request-a atoll(argv[1]);request-b atoll(argv[2]);/* 搜索服务节点间隔1s */while (!client-wait_for_service(1s)) {if (!rclcpp::ok()) {RCLCPP_ERROR(rclcpp::get_logger(rclcpp), Interrupted while waiting for the service. Exiting.);return 0;}/* 如果找不到将会继续等待 */RCLCPP_INFO(rclcpp::get_logger(rclcpp), service not available, waiting again...);}/* 获得应答并显示其状态 */auto result client-async_send_request(request);// Wait for the result.if (rclcpp::spin_until_future_complete(node, result) rclcpp::FutureReturnCode::SUCCESS){RCLCPP_INFO(rclcpp::get_logger(rclcpp), Sum: %ld, result.get()-sum);} else {RCLCPP_ERROR(rclcpp::get_logger(rclcpp), Failed to call service add_two_ints);}/* 退出ROS2 */rclcpp::shutdown();return 0;
}3. 添加依赖关系
创建功能包时已通过--dependencies可选参数自动在package.xml中添加必要的依赖行
dependrclcpp/depend
dependexample_interfaces/depend4. 添加编译信息
在CMakeLists.txt编译文件中 4.1. 添加搜索库
创建功能包时已通过--dependencies可选参数自动在CMakeLists.txt中添加必要的搜索库依赖行
find_package(rclcpp REQUIRED)
find_package(example_interfaces REQUIRED)4.2. 增加可执行文件
然后再增加可执行文件 src/add_two_ints_server.cpp命名为server可执行文件 src/add_two_ints_client.cpp命名为client可执行文件 并添加目标依赖关系
add_executable(server src/add_two_ints_server.cpp)
ament_target_dependencies(server rclcpp example_interfaces)add_executable(client src/add_two_ints_client.cpp)
ament_target_dependencies(client rclcpp example_interfaces)4.3. 增加可执行文件位置
最后增加可执行文件位置这样ROS2就可以找到现在的可执行文件
install(TARGETSserverclientDESTINATION lib/${PROJECT_NAME})5. 编译和运行
进入工作空间根目录
cd ~/ros2_ws在编译之前检查缺失的依赖项可跳过
rosdep install -i --from-path src --rosdistro humble -y编译
colcon build --packages-select cpp_srvcli打开一个新终端运行服务端节点
ros2 run cpp_srvcli server# [INFO] [rclcpp]: Ready to add two ints.打开一个新终端运行客户端节点
ros2 run cpp_srvcli client 1 2# [INFO] [rclcpp]: Sum: 3谢谢