当前位置:   article > 正文

ros2客户端——ubuntu20.04_ros2 client call

ros2 client call

自定义客户端的数据类型

客户端的数据类型和服务端的数据类型相同,即客户端和服务端定义和使用自定义数据类型的方式相同

创建sev目录和文件

服务的接口类型由两部分组成,请求和相应

在包的src的同级目录下创建sev文件夹,在sev文件夹里添加Xxx.srv文件(文件名首字母必须大写,不能有下划线)

  • 请求和相应用—隔离开,上面是请求的数据类型,下面是相应的数据类型
# 文件名Borrow.srv
#request
string name
uint32 money
---
# response
bool success
uint32 money

# 文件名SellNovel.srv
uint32 money
---
string[] novel

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

修改包的CMakeLists.txt文件

需要在CMakeLists.txt文件中添加rosidl_generate_interfaces表明srv文件所在的目录,如果有添加的数据类型需要添加find_package

# 如果有添加的数据类型需要添加find_package
find_package(std_msgs REQUIRED)

# rosidl_generate_interfaces表明srv文件所在的目录
rosidl_generate_interfaces(${PROJECT_NAME}
  "srv/Borrow.srv"
  "srv/SellNovel.srv"
  DEPENDENCIES 
)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

修改包的package.xml文件

需要添加的

  <!-- 下面两项是需要添加的东西 -->
  <!-- <buildtool_depend>rosidl_default_generators</buildtool_depend> -->
  <exec_depend>rosidl_default_runtime</exec_depend>
  <member_of_group>rosidl_interface_packages</member_of_group>
  • 1
  • 2
  • 3
  • 4

客户端

声明客户端并实例化这个客户端

// 类中声明客户端
  // 声明一个客户端
  rclcpp::Client<service_interface::srv::SellNovel>::SharedPtr client_pub;

// 构造函数定义客户端
  client_pub=this->create_client<service_interface::srv::SellNovel>("service_name");
	// 参数可以只填写一个即服务的名称  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

客户端发送请求

    // 1. 等待服务上线,while判断的括号中为 判断客户端等待服务端上线时间是否超过了一秒
    while (!client_pub->wait_for_service(std::chrono::seconds(1)))
    {
      RCLCPP_INFO(this->get_logger(),"等待客户端上线");
    }
    // 当服务端上线之后就回跳出循环,到下一步
    // 2.构造请求数据
    auto request = std::make_shared<service_interface::srv::SellNovel_Request>();
    request->money = 5;
    // 3. 发送异步请求
    client_pub->async_send_request(request,std::bind(&my_client::client_callback,this,_1) );
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

全部代码

#include <cstdio>

#include "rclcpp/rclcpp.hpp"
#include "service_interface/srv/borrow.hpp"
#include "service_interface/srv/sell_novel.hpp"

using std::placeholders::_1;
using std::placeholders::_2;

class my_client : public rclcpp::Node
{
private:
  // 声明一个客户端
  rclcpp::Client<service_interface::srv::SellNovel>::SharedPtr client_pub;
public:
  // 回调函数
  void client_callback(rclcpp::Client<service_interface::srv::SellNovel>::SharedFuture response)
  {
    auto result = response.get();

    RCLCPP_INFO(this->get_logger(),"收到了:%d章的小说,现在开始阅读",result->novel.size() );

    for(std::string novel:result->novel)
    {
      RCLCPP_INFO(this->get_logger(),"%s",novel.c_str() );
    }
    RCLCPP_INFO(this->get_logger(),"小说读完了");
  }
  // 发送数据函数
  void buy_novel()
  {
    RCLCPP_INFO(this->get_logger(),"准备去买小说");
    // 1. 等待服务上线,while判断的括号中为 判断客户端等待服务端上线时间是否超过了一秒
    while (!client_pub->wait_for_service(std::chrono::seconds(1)))
    {
      RCLCPP_INFO(this->get_logger(),"等待客户端上线");
    }
    // 当服务端上线之后就回跳出循环,到下一步
    // 2.构造请求数据,当有数
    auto request = std::make_shared<service_interface::srv::SellNovel_Request>();
    request->money = 5;
    // 3. 发送异步请求
    client_pub->async_send_request(request,std::bind(&my_client::client_callback,this,_1) );
  }

  my_client(std::string name);
  ~my_client();
};

my_client::my_client(std::string name):Node(name)
{
  RCLCPP_INFO(this->get_logger(),"构造 client");
  client_pub=this->create_client<service_interface::srv::SellNovel>("service_name");
  
}

my_client::~my_client()
{
}


int main(int argc, char ** argv)
{
    //2.初始化客户端库
    rclcpp::init(argc,argv);
    //3.使用智能指针创建新的节点对象,在面相对象的这节点声明,智能指针就要输入类的类型,而不是rclcpp::Node
    auto node = std::make_shared<my_client>("client_ros2");

    node->buy_novel();
    
    //4.使用spin循环节点
    rclcpp::spin(node);
    //5. 关闭客户端库
    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
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Guff_9hys/article/detail/797839
推荐阅读
相关标签
  

闽ICP备14008679号