17. Erlernen der ROS-Programmierung: Verschiedene fortgeschrittene Kommunikationsanwendungen verwenden C++

Inhaltsverzeichnis

1. Erweiterte Verwendung der C++-Initialisierungsknoten-API für die Themenkommunikation

1. Initialisieren Sie Knotencode-Eingabeaufforderungen und C++-Themenkommunikationsroutinen

2. Initialisieren Sie den Knoten für die Verwendung von Advanced

3. Interpretation der Initialisierungsknotenparameter

4. Initialisieren Sie den Knoten und fügen Sie den Optionsparametereffekt hinzu

2. Themenkommunikations-Publisher-Objekt erweitert

1. Erstellen Sie Hinweise zum Herausgebercode und Kommunikationsroutinen für C++-Themen

2. Erstellen Sie eine erweiterte Publisher-API

3. Analyse der Ergebnisse nach Verbesserung

3. Vertiefen Sie das Verständnis der Rückenfunktion

1.ros::spinOnce();

2.ros::spin();

Referenz-Lernmaterialien: Zhao Xuzuos ROS-Kurs an Station B

1. Erweiterte Verwendung der C++-Initialisierungsknoten-API für die Themenkommunikation

1. Initialisieren Sie Knotencode-Eingabeaufforderungen und C++-Themenkommunikationsroutinen

Codehinweise für Initialisierungsfunktionen: (Codehinweise können über Strg+Umschalt+Leertaste angezeigt werden)

void init(int &argc, char **argv, const std::string& name, uint32_t options = 0);

Die C++-Implementierungsroutine der zuvor praktizierten Themenkommunikation:
2. ROS-Programmierlernen: Themenkommunikation C++_ Mechanischer Blog für professionelle Computeranfänger - CSDN-Blog https://blog.csdn.net/wzfafabga/article/details/ 127081895

2. Initialisieren Sie den Knoten für die Verwendung von Advanced

pub.cpp

Änderungen:

ros::init(argc,argv,"publisher");
ros::init(argc,argv,"publisher",ros::init_options::AnonymousName);
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL, "");
    // ros::init(argc,argv,"publisher";
    ros::init(argc,argv,"publisher",ros::init_options::AnonymousName);
    ros::NodeHandle n;
    ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000);
    std_msgs::String msg;
    ros::Rate rate(10);
    int count = 0;
    while (ros::ok())
    {
        count++;
        std::stringstream ss;
        ss << "hello -->" << count;
        msg.data = ss.str();
        pub.publish(msg);
        ROS_INFO("发布数据:%s", msg.data.c_str());
        rate.sleep();
        ros::spinOnce();
    }
    return 0;
}

3. Interpretation der Initialisierungsknotenparameter

1. Konzept

1. ROS-Initialisierungsfunktion

void init(int &argc, char **argv, const std::__cxx11::string &name, uint32_t options = 0U)
ros::init(argc,argv,"publisher");

2. Der Parameter
argc kapselt die Anzahl der tatsächlichen Parameter, n+1, da der erste Parameter der Dateiname ist, der nicht der Parameter ist, den Sie konfigurieren möchten. argv
kapselt das Array der tatsächlichen Parameter und das 0. Element ist die Datei Name.
Name ist ein Knotenname. Dieser muss eindeutig sein. Wenn ein Knoten gestartet wird, wird der vorherige Knoten heruntergefahren, bevor derselbe Knoten gestartet wird. Nach
dem Knotennamen wird automatisch eine Zufallszahl hinzugefügt, um den Knotennamen zu unterscheiden.
3. Rückgabewert : leer, void

2. Verwendung von
argc+argv: ① Übergeben Sie die tatsächlichen Parameter über int argc, char *argv[] in der Hauptfunktion. ② Übergeben Sie die tatsächlichen Parameter in einem bestimmten Format. ROS verwendet sie, um globale Parameter festzulegen und Knoten umzubenennen.
Optionen: Implementieren Sie denselben Knoten, um ihn mehrmals zu starten. ros::init(argc, argv,"publisher", ros::init_options::AnonymousName);

Informationen zur Verwendung von argc und argv in der Hauptfunktion finden Sie im folgenden Abschnitt zur Optimierung des Clients. Das folgende Beispiel für die Dienstkommunikation ruft die Anzahl der tatsächlichen Parameter und ein Array tatsächlicher Parameter auf.

7. ROS-Programmierlernen: C++ -Aufruf für benutzerdefinierte Servicedaten

4. Initialisieren Sie den Knoten und fügen Sie den Optionsparametereffekt hinzu

Das Ergebnis des Hinzufügens von Optionen zum Initialisierungsknoten:

Starten Sie ROS Master

roscore

 Starten Sie den Publisher-Knoten

rosrun sub_pub pub

Starten Sie denselben Herausgeberknoten erneut 

rosrun sub_pub pub

 Zwei Knoten können zusammen laufen

Alle Knotennamen anzeigen 

rosnode list
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosnode list
/publisher_1666695811703949824
/publisher_1666695832571769067
/rosout

Es wurde festgestellt, dass dem erstellten Herausgeberknotennamen/Herausgeber automatisch eine Zufallszahl folgt, sodass die Knoten nicht denselben Namen haben und gemeinsam ausgeführt werden können.

2. Themenkommunikations-Publisher-Objekt erweitert

1. Erstellen Sie Hinweise zum Herausgebercode und Kommunikationsroutinen für C++-Themen

.Erstellen Sie einen Herausgeber-Codehinweis (Sie können den Codehinweis mit Strg+Umschalt+Leertaste anzeigen)

ros::Publisher advertise<M>(const std::__cxx11::string &topic, uint32_t queue_size, bool latch = false)

Verwendung des von C++ implementierten Teils der Erstellung von Publishern in der Themenkommunikation

(1 Nachricht) 2. ROS-Programmierlernen: Thema Kommunikation C++-Implementierung_Blog für mechanische professionelle Computeranfänger-CSDN-Blog https://blog.csdn.net/wzfafabga/article/details/127081895

2. Erstellen Sie eine erweiterte Publisher-API

pub.cpp

Geänderter Teil:

ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000);
ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000,true);
#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL, "");
    // ros::init(argc,argv,"publisher";
    ros::init(argc,argv,"publisher",ros::init_options::AnonymousName);
    ros::NodeHandle n;
    // ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000);
    ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000,true);
    std_msgs::String msg;
    ros::Rate rate(10);
    int count = 0;
    while (ros::ok())
    {
        count++;
        std::stringstream ss;
        ss << "hello -->" << count;
        msg.data = ss.str();
        pub.publish(msg);
        ROS_INFO("发布数据:%s", msg.data.c_str());
        rate.sleep();
        ros::spinOnce();
    }
    return 0;
}

Einführung in die Latch-Parameter:

Der letzte Parameter ist Latch, ein boolescher Wert. Seine Funktion besteht darin, die zuletzt veröffentlichte Nachricht für den Abonnenten aufzubewahren, wenn der Herausgeber die Veröffentlichung der Nachricht beendet. Dadurch soll verhindert werden, dass der Herausgeber kontinuierlich Nachrichten veröffentlicht und die Leistung belegt. Statische Daten erfordern dies Parameter wahr sein. Wenn der Latch falsch ist und der Herausgeber die Veröffentlichung von Daten stoppt, kann der Abonnent die Nachricht nicht empfangen.

Wenn Sie beispielsweise die Route des Autos planen, bleibt die Karte unverändert, sodass die Karte nicht ständig aktualisiert werden muss, was zu einer Leistungsverschwendung führt. Daher wird der Latch-Parameter des Kartenherausgebers auf true gesetzt.

Ändern Sie pub.cpp so, dass es 10 Nachrichten veröffentlicht und die Veröffentlichung stoppt

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL, "");
    // ros::init(argc,argv,"publisher";
    ros::init(argc,argv,"publisher",ros::init_options::AnonymousName);
    ros::NodeHandle n;
    // ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000);
    ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000,true);
    std_msgs::String msg;
    ros::Rate rate(10);
    int count = 0;
    while (ros::ok())
    {
        count++;
        std::stringstream ss;
        ss << "hello -->" << count;
        msg.data = ss.str();
        if(count <= 10)
        {
            pub.publish(msg);
            ROS_INFO("发布数据:%s", msg.data.c_str());
            rate.sleep(); 
        }
        // pub.publish(msg);
        // ROS_INFO("发布数据:%s", msg.data.c_str());
        // rate.sleep();
        ros::spinOnce();
    }
    return 0;
}

3. Analyse der Ergebnisse nach Verbesserung

Starten Sie ROSMaster

roscore

Starten Sie den Herausgeber, veröffentlichen Sie 10 Nachrichten und beenden Sie die Veröffentlichung

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub pub
[ INFO] [1666786808.842602969]: 发布数据:hello -->1
[ INFO] [1666786808.943626137]: 发布数据:hello -->2
[ INFO] [1666786809.043588395]: 发布数据:hello -->3
[ INFO] [1666786809.143665020]: 发布数据:hello -->4
[ INFO] [1666786809.243587508]: 发布数据:hello -->5
[ INFO] [1666786809.342738647]: 发布数据:hello -->6
[ INFO] [1666786809.443286320]: 发布数据:hello -->7
[ INFO] [1666786809.543143779]: 发布数据:hello -->8
[ INFO] [1666786809.642728771]: 发布数据:hello -->9
[ INFO] [1666786809.742740936]: 发布数据:hello -->10

Starten Sie den Abonnenten und abonnieren Sie das letzte Datenelement

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub sub
[ INFO] [1666787054.272108779]: 订阅的数据为:hello -->10

3. Vertiefen Sie das Verständnis der Rückenfunktion

1.ros::spinOnce();

Gehen Sie zurück und schreiben Sie den Code, nachdem ros::spinOnce(); weiterhin ausgeführt wird.

Experiment:

pub.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL, "");
    // ros::init(argc,argv,"publisher";
    ros::init(argc,argv,"publisher",ros::init_options::AnonymousName);
    ros::NodeHandle n;
    // ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000);
    ros::Publisher pub = n.advertise<std_msgs::String>("chongfu",1000,true);
    std_msgs::String msg;
    ros::Rate rate(1);
    int count = 0;
    while (ros::ok())
    {
        count++;
        std::stringstream ss;
        ss << "hello -->" << count;
        msg.data = ss.str();
        if(count <= 10)
        {
            pub.publish(msg);
            ROS_INFO("发布数据:%s", msg.data.c_str());
            rate.sleep(); 
        }
        // pub.publish(msg);
        // ROS_INFO("发布数据:%s", msg.data.c_str());
        // rate.sleep();
        ros::spinOnce();
        ROS_INFO("实验:看看这行代码运行情况");
    }
    return 0;
}

ros::spinOnce(); Wir können sehen, dass der Code unter dem Kopf normal ausgeführt wird

rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub pub
[ INFO] [1666787480.639928822]: 发布数据:hello -->1
[ INFO] [1666787481.641120474]: 实验:看看这行代码运行情况
[ INFO] [1666787481.641195387]: 发布数据:hello -->2
[ INFO] [1666787482.640193316]: 实验:看看这行代码运行情况
[ INFO] [1666787482.640266774]: 发布数据:hello -->3
[ INFO] [1666787483.640754102]: 实验:看看这行代码运行情况
[ INFO] [1666787483.640828620]: 发布数据:hello -->4
[ INFO] [1666787484.640382732]: 实验:看看这行代码运行情况
[ INFO] [1666787484.640486097]: 发布数据:hello -->5

2.ros::spin();

Ununterbrochenes Zurückdrehen und Schleifen in der Rückruffunktion bedeutet, dass die Knoten nicht anhalten und die Rückruffunktion ununterbrochen eine Schleife durchläuft, sodass der Code hinter der ununterbrochenen Zurückdrehfunktion nicht ausgeführt werden kann.

Experiment:

sub.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"

void huidiao(const std_msgs::String::ConstPtr & msggg)
{
    ROS_INFO("订阅的数据为:%s", msggg->data.c_str());
}

int main(int argc, char  *argv[])
{
    setlocale(LC_ALL, "");
    ros::init(argc, argv, "subscriber");
    ros::NodeHandle n;
    ros::Subscriber sub = n.subscribe<std_msgs::String>("chongfu", 1000, huidiao);
    ros::spin();
    ROS_INFO("实验:看看这行代码运行情况");
    return 0;
}

Starten Sie Abonnenten und Herausgeber

rosrun sub_pub sub
rosrun sub_pub pub
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub sub
[ INFO] [1666787805.552861795]: 订阅的数据为:hello -->1
[ INFO] [1666787806.306914044]: 订阅的数据为:hello -->2
[ INFO] [1666787807.307552251]: 订阅的数据为:hello -->3
[ INFO] [1666787808.306867980]: 订阅的数据为:hello -->4
[ INFO] [1666787809.307330567]: 订阅的数据为:hello -->5
[ INFO] [1666787810.307291604]: 订阅的数据为:hello -->6
[ INFO] [1666787811.307101347]: 订阅的数据为:hello -->7
[ INFO] [1666787812.307234292]: 订阅的数据为:hello -->8
[ INFO] [1666787813.307128563]: 订阅的数据为:hello -->9
[ INFO] [1666787814.307039999]: 订阅的数据为:hello -->10

Der Code hinter der Rückruffunktion wird nicht ausgeführt.

Supongo que te gusta

Origin blog.csdn.net/wzfafabga/article/details/127516695
Recomendado
Clasificación