当前位置:网站首页>Ros Learning (23) Action Communication Mechanism
Ros Learning (23) Action Communication Mechanism
2022-07-07 01:47:00 【Crème glacée avec Code】
Catalogue des articles
Préface
ROSLes mécanismes de communication couramment utilisés sont les sujets et les services,Mais beaucoup de scénarios,Ces deux mécanismes de communication ne répondent souvent pas à tous les besoins.
actionMécanismes de communication,Est un mécanisme de communication de haut niveau avec rétroaction continue,Le niveau inférieur est basé surROSCommunication thématique.
Un.、Qu'est - ce queaction
ROSDansactionlibPack de fonctions,Pour réaliseractionMécanisme de communication.actionSimilaire au mécanisme de communication de service,La différence est queactionAvec rétroaction continue,Possibilité de rétroaction continue sur l'avancement des tâches,Vous pouvez également interrompre l'exécution pendant la tâche.
2.、actionMécanismes de travail
actionUtiliser le client/Mode de fonctionnement du serveur,Comme suit:
ActionClients etActionPasser entre les serveursactionlibDéfiniaction protocolPour communiquer,Cet accord est basé surROSMise en œuvre du mécanisme de message pour.
Le client publie la cible de la tâche au serveur et annule la tâche si nécessaire , Le serveur affiche l'état actuel au client 、 Rétroaction en temps réel et résultats de l'exécution des tâches .Comme le montre la figure:
Trois、actionDéfinitions
actionAdoption.actionDéfinition du fichier, Placé dans le pack de fonctions actionSous le dossier,Le format est le suivant::
# Définir l'information cible
uint32 dishwasher_id
# Définir l'information sur les résultats
uint32 total_dishes_cleaned
# Message définissant la rétroaction périodique
float32 percent_complete
Visible,Unaction La définition de :goal、result、feedback.
Quatre、Mise en œuvre du Code
Principales réalisationsaction Noeud client et serveur pour ,Nouveau nomaction_tutorialsPack de fonctions.
1、Créer un client
InactionDans la définition de, Décrit une tâche de lavage de vaisselle . Le noeud client est responsable de l'émission actionDemande,DoDishes_client.cppLe contenu du document est le suivant::
#include <actionlib/client/simple_action_client.h>
#include "action_tutorials/DoDishesAction.h"
typedef actionlib::SimpleActionClient<action_tutorials::DoDishesAction> Client;
// Quandaction Cette fonction de rappel est appelée une fois terminée
void doneCb(const actionlib::SimpleClientGoalState& state,
const action_tutorials::DoDishesResultConstPtr& result)
{
ROS_INFO("Yay! The dishes are now clean");
ros::shutdown();
}
// Quandaction Cette fonction de rappel est appelée une fois activée
void activeCb()
{
ROS_INFO("Goal just went active");
}
// Bien reçu.feedback Appelez la fonction de rappel après
void feedbackCb(const action_tutorials::DoDishesFeedbackConstPtr& feedback)
{
ROS_INFO(" percent_complete : %f ", feedback->percent_complete);
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "do_dishes_client");
// Définir un client
Client client("do_dishes", true);
// Attente côté serveur
ROS_INFO("Waiting for action server to start.");
client.waitForServer();
ROS_INFO("Action server started, sending goal.");
// Créer unactionDegoal
action_tutorials::DoDishesGoal goal;
goal.dishwasher_id = 1;
// EnvoyeractionDegoalCôté serveur, Et définir la fonction de rappel
client.sendGoal(goal, &doneCb, &activeCb, &feedbackCb);
ros::spin();
return 0;
}
2、Créer un serveur
Le noeud serveur est chargé de faire la vaisselle , Et la rétroaction sur les progrès en temps réel de la vaisselle ,DoDishes_server.cppLe contenu du document est le suivant::
#include <ros/ros.h>
#include <actionlib/server/simple_action_server.h>
#include "action_tutorials/DoDishesAction.h"
typedef actionlib::SimpleActionServer<action_tutorials::DoDishesAction> Server;
// Bien reçu.actionDegoal Appelez la fonction de rappel après
void execute(const action_tutorials::DoDishesGoalConstPtr& goal, Server* as)
{
ros::Rate r(1);
action_tutorials::DoDishesFeedback feedback;
ROS_INFO("Dishwasher %d is working.", goal->dishwasher_id);
// Supposons que la vaisselle avance ,Et selon1hz Fréquence de publication Progrès feedback
for(int i=1; i<=10; i++)
{
feedback.percent_complete = i * 10;
as->publishFeedback(feedback);
r.sleep();
}
// QuandactionUne fois terminé, Retourner les résultats au client
ROS_INFO("Dishwasher %d finish working.", goal->dishwasher_id);
as->setSucceeded();
}
int main(int argc, char** argv)
{
ros::init(argc, argv, "do_dishes_server");
ros::NodeHandle n;
// Définir un serveur
Server server(n, "do_dishes", boost::bind(&execute, _1, &server), false);
// Le serveur commence à fonctionner
server.start();
ros::spin();
return 0;
}
3、Configuration
InCMakeLists.txt Ajouter la règle suivante :
find_package(catkin REQUIRED genmsg actionlib_msgs actionlib)
add_action_files(DIRECTORY action FILES DoDishes.action)
generate_messages(DEPENDENCIES actionlib_msgs)
Dans le pack de fonctionspackage.xmlAjouter la configuration suivante au fichier:
<build_depend>actionlib</build_depend>
<build_depend>actionlib_msgs</build_depend>
<build_depend>roscpp</build_depend>
<run_depend>actionlib</run_depend>
<run_depend>actionlib_msgs</run_depend>
<run_depend>roscpp</run_depend>
Puis compilez le paquet de fonctions ,Comme suit:
À partir de ces fichiers générés après la compilation ,action C'est vraiment une sorte de message 、 Un mécanisme de communication plus élevé .
4、Exécution
Commencez parmasterNoeud,Les ordres sont les suivants::
roscore
Démarrer le noeud côté service ,Les ordres sont les suivants::
rosrun action_tutorials DoDishes_server
Redémarrer le noeud client ,Les ordres sont les suivants::
rosrun action_tutorials DoDishes_client
Les effets sont les suivants:
边栏推荐
- AcWing 345. Cattle station solution (nature and multiplication of Floyd)
- The difference between Tansig and logsig. Why does BP like to use Tansig
- AcWing 361. Sightseeing cow problem solution (SPFA seeking positive ring)
- Ds-5/rvds4.0 variable initialization error
- AcWing 1140. 最短网络 (最小生成树)
- Clickhouse fields are grouped and aggregated, and SQL is queried according to the granularity of any time period
- 增加 pdf 标题浮窗
- Compile command line terminal swift
- 盒子拉伸拉扯(左右模式)
- AI automatically generates annotation documents from code
猜你喜欢
百度飞将BMN时序动作定位框架 | 数据准备与训练指南 (上)
Appium自动化测试基础 — uiautomatorviewer定位工具
Make Jar, Not War
Can't you understand the code of linked list in C language? An article allows you to grasp the secondary pointer and deeply understand the various forms of parameter passing in the function parameter
对C语言数组的再认识
The difference between Tansig and logsig. Why does BP like to use Tansig
Yunna - work order management system and process, work order management specification
今日问题-2022/7/4 lambda体中修改String引用类型变量
Shell script quickly counts the number of lines of project code
The cradle of eternity
随机推荐
字符串转成日期对象
Comparison of picture beds of free white whoring
Instructions for using the domain analysis tool bloodhound
LeetCode:1175. Prime permutation
刨析《C语言》【进阶】付费知识【一】
Gin 入门实战
Public key \ private SSH avoid password login
The difference between Tansig and logsig. Why does BP like to use Tansig
AcWing 361. Sightseeing cow problem solution (SPFA seeking positive ring)
Google released a security update to fix 0 days that have been used in chrome
AcWing 346. Solution to the problem of water splashing festival in the corridor (deduction formula, minimum spanning tree)
What does security capability mean? What are the protection capabilities of different levels of ISO?
736. LISP syntax parsing: DFS simulation questions
各种语言,软件,系统的国内镜像,收藏这一个仓库就够了: Thanks-Mirror
AcWing 1140. 最短网络 (最小生成树)
C语言【23道】经典面试题【下】
How to prevent overfitting in cross validation
Shortcut keys commonly used in idea
Yunna | work order management measures, how to carry out work order management
WCF Foundation