ros2 服务——ubuntu20.04——自定义数据类型

ROS2自定义服务接口及多线程服务端实现,
该文章介绍了如何在ROS2中自定义服务数据类型,包括创建srv文件定义请求和响应,修改CMakeLists.txt和package.xml文件以包含新接口,并展示了如何创建服务端回调函数处理请求。此外,还提到了使用多线程执行器和回调组来实现服务端的异步处理。

自定义一个服务数据类型接口

创建sev目录和文件

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

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

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

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

修改包的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 
)

修改包的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>

查看是否成功

使用命令来查看ros2 interface list,命令查看看到三个数据类型,表示在service_interface包里面srv目录下的Borrow类型

在这里插入图片描述

服务

  • 同一个服务(名称相同)只能由有一个节点来提供
  • 同一个服务可以被多个客户端调用
  1. 导入自定义的服务接口(需先在package.xml中添加自定义包的依赖)
  • 修改packag.xml文件
  <!-- 添加数据类型所在包名,即依赖,自定义数据类型在service_interface包中 -->
  <depend>service_interface</depend> 
  • 修改CMakeLists.txt文件
//添加service_interface
find_package(service_interface REQUIRED)

// 添加service_interface
ament_target_dependencies(
  my_services
  "std_msgs"
  "rclcpp"
  service_interface
)

// 添加数据类型的头文件
// service_interface包的srv目录下有两个数据类型文件Borrow.srv和Buy.srv

// 导入的头文件都必须是小写
// srv文件名:Borrow.srv SellNovel.srv
#include "service_interface/srv/borrow.hpp"
#include "service_interface/srv/sell_novel.hpp"
  1. 创建服务端回调函数

对调函数是当服务端接受到数据做出反应的函数,参数是两个之只能指针

#include "service_interface/srv/sell_novel.hpp"

  // 声明一个回调函数,用于接受导数据并做出相应
  // 参数有两个一个是请求,一个是回应
  //类型是共享指针类型,书写格式如下
  void callback(const service_interface::srv::SellNovel::Request::SharedPtr request,
                const service_interface::srv::SellNovel::Response::SharedPtr response
  )
  {
   
   
    unsigned int num = (int)request->money/(1.0);
    if(num>novel_queue.size())
    {
   
   
      // 等待
      RCLCPP_INFO(this->get_logger(),"书不够,书库有:%d,要卖出:%d",novel_queue.size(),num);

      // 设置睡眠的时间为一秒
      rclcpp::Rate 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值