当前位置:网站首页>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
边栏推荐
猜你喜欢

Software testing Interface automation testing Pytest framework encapsulates requests library Encapsulates unified request and multiple base path processing Interface association encapsulation Test cas

The principle and code implementation of intelligent follower robot in the actual combat of innovative projects

Hiring a WordPress Developer: 4 Practical Ways

The state status is displayed incorrectly after the openGauss switch

oracle查询扫描全表和走索引

BioVendor人俱乐部细胞蛋白(CC16)Elisa试剂盒研究领域

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

Nanoprobes免疫测定丨FluoroNanogold试剂免疫染色方案
![[Server data recovery] Data recovery case of server Raid5 array mdisk disk offline](/img/08/d693c7e2fff8343b55ff3c1f9317c6.jpg)
[Server data recovery] Data recovery case of server Raid5 array mdisk disk offline
![[ORB_SLAM2] void Frame::ComputeImageBounds(const cv::Mat & imLeft)](/img/ed/ffced88c9d23c20ccf380494051381.jpg)
[ORB_SLAM2] void Frame::ComputeImageBounds(const cv::Mat & imLeft)
随机推荐
Garbage Collector CMS and G1
Rasa 3 x learning series - Rasa - 4873 dispatcher Issues. Utter_message study notes
Nanoprobes丨1-mercapto-(triethylene glycol) methyl ether functionalized gold nanoparticles
Safety (2)
Golang分布式应用之定时任务
【web】理解 Cookie 和 Session 机制
CodeTon Round 2 D. Magical Array
cocos中使用async await异步加载资源
20. 用两个栈实现队列
Data transfer at the data link layer
"NetEase Internship" Weekly Diary (3)
"NetEase Internship" Weekly Diary (1)
【web】Understanding Cookie and Session Mechanism
使用DBeaver进行mysql数据备份与恢复
个人博客系统项目测试
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?
nacos启动报错,已配置数据库,单机启动
messy website
Service discovery of kubernetes
【 wheeled odometer 】