当前位置:网站首页>ros多客户端请求服务
ros多客户端请求服务
2022-08-02 02:20:00 【诺有缸的高飞鸟】
写在前面
1、本文内容
一个节点的多个服务被请求时产生消息阻塞,使用多线程来解决
2、平台
ubuntu1804, ros melodic
3、转载请注明出处:
https://blog.csdn.net/qq_41102371/article/details/125846107
代码
Service.srv
string client_name
---
string result
service_5.cpp
#include <ros/ros.h>
#include "service_5/Service.h"
#include <thread>
bool func_in=false;
// service回调函数,输入参数req,输出参数res
bool serviceCallback1(service_5::Service::Request &req,
service_5::Service::Response &res)
{
// 显示请求数据
ROS_INFO("client: name:%s\n", req.client_name.c_str());
for(int i=0;i<5;++i){
std::cout<<req.client_name<<": "<<i<<std::endl;
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
// // sleep(1);
// std::this_thread::sleep_for(std::chrono::milliseconds(1000));
// 设置反馈数据
res.result = "OK";
return true;
}
int main(int argc, char **argv)
{
// ROS节点初始化
ros::init(argc, argv, "server_5");
// 创建节点句柄
ros::NodeHandle n;
// 创建server,注册回调函数
ros::ServiceServer service1 = n.advertiseService("/my_server1", serviceCallback1);
ros::ServiceServer service2 = n.advertiseService("/my_server2", serviceCallback1);
ros::ServiceServer service3 = n.advertiseService("/my_server3", serviceCallback1);
ros::ServiceServer service4 = n.advertiseService("/my_server4", serviceCallback1);
ros::ServiceServer service5 = n.advertiseService("/my_server5", serviceCallback1);
// // 循环等待回调函数
ROS_INFO("Ready.");
//方法1
// ros::MultiThreadedSpinner s(5);
// s.spin();
// // ros::spin(s);
//方法2
ros::AsyncSpinner spinner(5); // Use4 threads
spinner.start();
ros::waitForShutdown();
//直接spin消息阻塞
//ros::spin();
return 0;
}
使用
在不同命令行窗口请求服务
rosservice call /my_server3 "client_name: 'client3'"
rosservice call /my_server2 "client_name: 'client2'"
直接spin消息阻塞,client2等client3完了才开始
多线程结果(方法2)

参考
ROS多线程订阅消息(ros::asyncspinner) https://blog.csdn.net/weixin_28900531/article/details/79431192
rosspin、rosspinOnce及多线程订阅 https://blog.csdn.net/yaked/article/details/50776224
边栏推荐
- Electronic Manufacturing Warehouse Barcode Management System Solution
- 永磁同步电机36问(三)——SVPWM代码实现
- 2022-08-01 mysql/stoonedb慢SQL-Q18分析
- Moonbeam and Project integration of the Galaxy, bring brand-new user experience for the community
- BI - SQL 丨 WHILE
- cocos中使用async await异步加载资源
- The principle and code implementation of intelligent follower robot in the actual combat of innovative projects
- LeetCode刷题日记: 33、搜索旋转排序数组
- TKU remembers a single-point QPS optimization (I wish ITEYE is finally back)
- leetcode / anagram in string - some permutation of s1 string is a substring of s2
猜你喜欢

ofstream,ifstream,fstream read and write files

Remember a pit for gorm initialization

Remember a gorm transaction and debug to solve mysql deadlock

Redis 底层的数据结构

Nanoprobes多组氨酸 (His-) 标签标记:重组蛋白检测方案

LeetCode刷题日记:74. 搜索二维矩阵

记一次gorm事务及调试解决mysql死锁

极大似然估计

Outsourcing worked for three years, it was abolished...

列表常用方法
随机推荐
TKU remembers a single-point QPS optimization (I wish ITEYE is finally back)
Coding Experience Talk
Redis Subscription and Redis Stream
oracle query scan full table and walk index
MySQL8 download, start, configure, verify
Safety (2)
Safety (1)
leetcode / anagram in string - some permutation of s1 string is a substring of s2
【web】理解 Cookie 和 Session 机制
[Unity entry plan] 2D Game Kit: A preliminary understanding of the composition of 2D games
Reflex WMS Intermediate Series 7: What should I do if I want to cancel the picking of an HD that has finished picking but has not yet been loaded?
用位运算为你的程序加速
【web】Understanding Cookie and Session Mechanism
Project Background Technology Express
Force buckle, 752-open turntable lock
From 2023 onwards, these regions will be able to obtain a certificate with a score lower than 45 in the soft examination.
拼多多借力消博会推动国内农产品品牌升级 看齐国际精品农货
极大似然估计
软件测试 接口自动化测试 pytest框架封装 requests库 封装统一请求和多个基础路径处理 接口关联封装 测试用例写在yaml文件中 数据热加载(动态参数) 断言
字典常用方法