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;
}