Re: [ros-users] Subscriber and Publisher node at once in cpp

Top Page
Attachments:
Message as email
+ (text/plain)
+ range_to_laser.cpp (text/x-c++src)
Delete this message
Reply to this message
Author: User discussions
Date:  
To: ros-users
CC: yilmaz.buenyamin
Subject: Re: [ros-users] Subscriber and Publisher node at once in cpp
Hello Guys,
i want do the publisher and subscriber not with classes, can you explain me how can i do it.

And if i tray to publish, i get the Warning:
Publisher on '/laser_scan' destroyed immediately after creation. Did you forget to store the handle?

How can i store the handle?


At attach you find the Code.
Greetings,
Bünyamin
//============================================================================
// Name        : cloud_to_laser.cpp
// Author      : Bünyamin Yilmaz
// Version     :
// Description : Ein Konvertierer vom range zu LaserScan
//============================================================================
/*
 * -Zwei Probleme noch in der Syntax
 * Kompilieren erzeugt keinen Fehler, nur wenn ich versuche bei pub.ranges[x]
 * zuzugreifen gibt es einen Speicherzugriffsfehler,
 * Und es kommt noch eine Fehlermeldung, dass der handler sofort nachder Erzeugung,
 * zerstört wird.
 * -Zusätzlich muss die konvertierung richtig hinbekommen werden, (Aber vorher muss man die Syntax fehler
 * beseitigen, damit man erstmal testen kann)
 * */


#include "range_to_laser.h"
//Erzeuge Zwischenspeicher für die einzelnen Daten
int zaehler=0;
float angle_increment;
float angle_min =ANGLE_MIN;
float angle_max=ANGLE_MAX;
int anzahl_messung= 8;//(ANGLE_MIN+ANGLE_MAX)/angle_increment;//eine volle messung

float range_min=2.5;//da die maximale entfernung die der Ultraschall sensor messen kann 2,5 m ist
float range_max=2.5;
std::vector<float> entfernungen;
//Hier soll Konvertiert werden
void v_convert(nxt_msgs::Range msg,sensor_msgs::LaserScan &pub){
    if(range_min>msg.range){range_min=msg.range;}//setze minimum entfernung
    if(range_max<msg.range){range_max=msg.range;}//setze maximum range
    entfernungen.push_back(msg.range);
    if(zaehler>=anzahl_messung){    //falls wir eine vollständige messung haben dann die zwischengespeicherten Werte in pub eintragen und
                                    //publishen
        ros::NodeHandle r;
        ros::Publisher laser_scan_pub = r.advertise<sensor_msgs::LaserScan>("laser_scan", 50);
        pub.header=msg.header;
        pub.angle_min=ANGLE_MIN;
        pub.angle_max=ANGLE_MAX;
        pub.angle_increment=angle_increment;
        pub.range_min=range_min;
        pub.range_max=range_max;
        ROS_INFO("Alles in ORDNUNG, anzahl Messung7");
        pub.ranges=entfernungen;
        laser_scan_pub.publish(pub);
        entfernungen.clear();
    }
}
void pointCallback(const nxt_msgs::Range  &msg)
{    sensor_msgs::LaserScan pub;
    v_convert(msg,pub);
    if(zaehler==anzahl_messung){
        zaehler=0;
    }else{
        zaehler++;
    }
}
int main(int argc, char **argv)
{
    /*
     * Wir machen einen Subscriber und immer wenn eine neue Nachricht von Range angekommen
     *ist, wird die pointCallback funktion aufgerufen, wo wir dann die bekommene nachricht convertieren und als
     *LaserScan publishen.
     * */
  ros::init(argc, argv, "range_to_laser");
  ros::NodeHandle n;
  ros::Subscriber sub = n.subscribe("ultrasonic_sensor", 50, pointCallback);
  ros::spin();
  return 0;
}