当前位置:   article > 正文

ROS2 编写运行简单server client_ros2 srv client

ros2 srv client

ROS2创建server client

正本

创建package

创建节点通讯使用service时,在工作空间如何快速创建一个项目package,使用如下命令:

#首先进入dev_ws/src
cd src
ros2 pkg create --build-type ament_cmake cpp_srvcli --dependencies rclcpp example_interfaces
  • 1
  • 2
  • 3

输入结果如下:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

创建interface

在上层目录创建my_interfaces文件夹,新建service:

bot@foxy:~/dr_ws/BingRosTest/src$ tree my_interfaces/
my_interfaces/
|-- CMakeLists.txt
|-- package.xml
`-- srv
    `-- AddTwoInts.srv
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
# AddTwoInts.srv

int32 a
int32 b
---
int32 sum
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

Server代码

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();
}
  • 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
  • 26
  • 27
  • 28

Client代码

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;
}
  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

编译运行

编译代码:

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]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

source编译结果,并运行server:

. install/setup.bash
ros2 run cpp_srvcli server
  • 1
  • 2

新开一个窗口运行client:

. install/setup.bash
ros2 run cpp_srvcli client 2 9
  • 1
  • 2

运行结果

结果如下:

#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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

注意

如果运行client,server不响应,可以尝试检测ROS_DOMAIN_ID是否一致,

#输出domain_id
echo $ROS_DOMAIN_ID 
#设置domain_id,注意两个窗口均需要设置
export ROS_DOMAIN_ID=1
  • 1
  • 2
  • 3
  • 4

源码如下:
下载链接

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/982439
推荐阅读
相关标签
  

闽ICP备14008679号