当前位置:网站首页>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
边栏推荐
- LeetCode Review Diary: 153. Find the Minimum Value in a Rotated Sort Array
- FOFAHUB usage test
- oracle查询扫描全表和走索引
- swift project, sqlcipher3 -> 4, cannot open legacy database is there a way to fix it
- 2022-08-01 反思
- LeetCode 213. Robbery II (2022.08.01)
- Analysis of the status quo of digital transformation of manufacturing enterprises
- openGauss切换后state状态显示不对
- [Unity entry plan] 2D Game Kit: A preliminary understanding of the composition of 2D games
- LeetCode刷题日记:74. 搜索二维矩阵
猜你喜欢

2022-08-01 mysql/stoonedb slow SQL-Q18 analysis

2023年起,这些地区软考成绩低于45分也能拿证

Good News | AR opens a new model for the textile industry, and ALVA Systems wins another award!

Use DBeaver for mysql data backup and recovery

拼多多借力消博会推动国内农产品品牌升级 看齐国际精品农货

AI target segmentation capability for fast video cutout without green screen

"NetEase Internship" Weekly Diary (3)

【Unity入门计划】2D Game Kit:初步了解2D游戏组成

Scheduled tasks for distributed applications in Golang

Nanoprobes免疫测定丨FluoroNanogold试剂免疫染色方案
随机推荐
局部敏感哈希:如何在常数时间内搜索Embedding最近邻
Can Youxuan database import wrongly be restored?
51. 数字排列
Scheduled tasks for distributed applications in Golang
Data transfer at the data link layer
【 wheeled odometer 】
【LeetCode每日一题】——103.二叉树的锯齿形层序遍历
Check if IP or port is blocked
优炫数据库导库导错了能恢复吗?
2022-08-01 安装mysql监控工具phhMyAdmin
Redis 底层的数据结构
Unable to log in to the Westward Journey
拼多多借力消博会推动国内农产品品牌升级 看齐国际精品农货
Service discovery of kubernetes
Install mysql using docker
Safety (2)
to-be-read list
"NetEase Internship" Weekly Diary (1)
bool框架::PosInGrid (const简历:关键点kp, int &posX, int诗句)
Handwriting a blogging platform ~ Day 3