自定义一个服务数据类型接口
创建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类型

服务
- 同一个服务(名称相同)只能由有一个节点来提供
- 同一个服务可以被多个客户端调用
- 导入自定义的服务接口(需先在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"
- 创建服务端回调函数
对调函数是当服务端接受到数据做出反应的函数,参数是两个之只能指针
#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

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

被折叠的 条评论
为什么被折叠?



