赞
踩
ROS2创建server client
创建节点通讯使用service时,在工作空间如何快速创建一个项目package,使用如下命令:
#首先进入dev_ws/src
cd src
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces
输入结果如下:
bot@foxy:~/dr_ws/BingRosTest/src$ ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp my_interfaces going to create a new package package name: cpp_srvcli destination directory: /home/bot/dr_ws/BingRosTest/src package format: 3 version: 0.0.0 description: TODO: Package description maintainer: ['bot <bot@todo.todo>'] licenses: ['TODO: License declaration'] build type: ament_cmake dependencies: ['rclcpp', 'my_interfaces'] creating folder ./cpp_srvcli creating ./cpp_srvcli/package.xml creating source and include folder creating folder ./cpp_srvcli/src creating folder ./cpp_srvcli/include/cpp_srvcli creating ./cpp_srvcli/CMakeLists.txt
在src目录下新建两个文件,文件目录如下:
bot@foxy:~/dr_ws/BingRosTest/src$ tree cpp_srvcli/
cpp_srvcli/
|-- CMakeLists.txt
|-- include
| `-- cpp_srvcli
|-- package.xml
`-- src
|-- add_two_ints_client.cpp
`-- add_two_ints_server.cpp
在上层目录创建my_interfaces
文件夹,新建service:
bot@foxy:~/dr_ws/BingRosTest/src$ tree my_interfaces/
my_interfaces/
|-- CMakeLists.txt
|-- package.xml
`-- srv
`-- AddTwoInts.srv
# AddTwoInts.srv
int32 a
int32 b
---
int32 sum
Server的代码如下:
#include "rclcpp/rclcpp.hpp" #include "my_interfaces/srv/add_two_ints.hpp" // CHANGE #include <memory> void add(const std::shared_ptr<my_interfaces::srv::AddTwoInts::Request> request, // CHANGE std::shared_ptr<my_interfaces::srv::AddTwoInts::Response> response) // CHANGE { response->sum = request->a + request->b; // CHANGE RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Incoming request\na: %ld" " b: %ld", // CHANGE request->a, request->b); // CHANGE RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "sending back response: [%ld]", (long int)response->sum); } int main(int argc, char **argv) { rclcpp::init(argc, argv); std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_server"); // CHANGE rclcpp::Service<my_interfaces::srv::AddTwoInts>::SharedPtr service = // CHANGE node->create_service<my_interfaces::srv::AddTwoInts>("add_two_ints", &add); // CHANGE RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "Ready to add two ints."); // CHANGE rclcpp::spin(node); rclcpp::shutdown(); }
Client代码如下:
#include "rclcpp/rclcpp.hpp" #include "my_interfaces/srv/add_two_ints.hpp" // CHANGE #include <chrono> #include <cstdlib> #include <memory> using namespace std::chrono_literals; int main(int argc, char **argv) { rclcpp::init(argc, argv); if (argc != 3) { // CHANGE RCLCPP_INFO(rclcpp::get_logger("rclcpp"), "usage: add_two_ints_client X Y"); // CHANGE return 1; } std::shared_ptr<rclcpp::Node> node = rclcpp::Node::make_shared("add_two_ints_client"); // CHANGE rclcpp::Client<my_interfaces::srv::AddTwoInts>::SharedPtr client = // CHANGE node->create_client<my_interfaces::srv::AddTwoInts>("add_two_ints"); // CHANGE auto request = std::make_shared<my_interfaces::srv::AddTwoInts::Request>(); // CHANGE request->a = atoll(argv[1]); request->b = atoll(argv[2]); 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::executor::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_three_ints"); // CHANGE } rclcpp::shutdown(); return 0; }
编译代码:
bot@foxy:~/dr_ws/BingRosTest$ colcon build --packages-up-to cpp_srvcli
Starting >>> my_interfaces
Finished <<< my_interfaces [15.0s]
Starting >>> cpp_srvcli
Finished <<< cpp_srvcli [6.79s]
Summary: 2 packages finished [22.0s]
source编译结果,并运行server:
. install/setup.bash
ros2 run cpp_srvcli server
新开一个窗口运行client:
. install/setup.bash
ros2 run cpp_srvcli client 2 9
结果如下:
#server
bot@foxy:~/dr_ws/BingRosTest$ ros2 run cpp_srvcli server
[INFO] [1645010392.336248184] [rclcpp]: Ready to add two ints.
[INFO] [1645010405.618361568] [rclcpp]: Incoming request
a: 2 b: 9
[INFO] [1645010405.618427575] [rclcpp]: sending back response: [11]
#client
bot@foxy:~/dr_ws/BingRosTest$ ros2 run cpp_srvcli client 2 9
[INFO] [1645010405.619089609] [rclcpp]: Sum: 11
如果运行client,server不响应,可以尝试检测ROS_DOMAIN_ID是否一致,
#输出domain_id
echo $ROS_DOMAIN_ID
#设置domain_id,注意两个窗口均需要设置
export ROS_DOMAIN_ID=1
源码如下:
下载链接
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。