当前位置:网站首页>Ros Learning (23) Action Communication Mechanism

Ros Learning (23) Action Communication Mechanism

2022-07-07 01:47:00 Crème glacée avec Code


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:
Insérer la description de l'image ici
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:
Insérer la description de l'image ici

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:
Insérer la description de l'image ici
Insérer la description de l'image ici
À 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:
Insérer la description de l'image ici

原网站

版权声明
本文为[Crème glacée avec Code]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207061812139005.html