0
$\begingroup$

Rosanswers logo

Hello ROS people,

so basically, I am simply trying to reproduce a simple C++ pub/sub example using the Float32MultiArray type. Here are the codes :

SUBSCRIBER

#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Float32MultiArray.h"
void subscriberCallback(const std_msgs::Float32MultiArray::ConstPtr& test)
{
for(int i=0; i<5;i++){
    ROS_INFO("I heard %d: %f\n", i, test->data[i]);
}}
int main(int argc, char **argv){
 ros::init(argc, argv, "subscriber");
 ros::NodeHandle n;
 ros::Subscriber sub = n.subscribe("subscriber_topic", 1000, subscriberCallback);
 ros::spin();
 return 0;
 }

PUBLISHER

#include <stdio.h>
#include "ros/ros.h"
#include "std_msgs/Float32MultiArray.h"
int main(int argc, char **argv){
ros::init(argc, argv, "publisher");
ros::NodeHandle n;
ros::Publisher pub = n.advertise<std_msgs::Float32MultiArray>("subscriber_topic", 10);
ros::Rate rate(10);
while (ros::ok()){
std_msgs::Float32MultiArray data;
for(int i=0;i<5;i++){data.data[i]=i;}
pub.publish(data);
ros::spinOnce();
rate.sleep();
}
return 0;
}

1- The catkin_make build gives no error at all.

2- If I launch the subscriber node and publish on the terminal to subscriber_topic F32MA data, everything goes fine, which means the problem is from the publisher side.

3- When launching the publisher node, here is the error (exit code -11 ? searched and didn't find anything around that) - couldn't put a screen -

SUMMARY
========

PARAMETERS
* /rosdistro: melodic
* /rosversion: 1.14.13

NODES
/
publisher (publisher/publisher)

ROS_MASTER_URI=http://localhost:11311

process[publisher-1]: started with pid [1332]
[publisher-1] process has died [pid 1332, exit code -11, cmd 
/home/lilialkalee/f32ma/devel/lib/publisher/publisher __name:=publisher 
__log:=/home/lilialkalee/.ros/log/ab233984-352b-11ee-accc-00155dae808d/publisher-1.log].
log file: /home/lilialkalee/.ros/log/ab233984-352b-11ee-accc-00155dae808d/publisher-1*.log
all processes on machine have died, roslaunch will exit
shutting down processing monitor...
... shutting down processing monitor complete
done

Btw, when I look for the log given with the path /home/lilialkalee/.ros/log/ab233984-352b-11ee-accc-00155dae808d/publisher-1.log, the publisher-1.log cannot be found xD

So, any clues ? and thanks in advance.


Originally posted by Lilipop on ROS Answers with karma: 9 on 2023-08-07

Post score: 0


Original comments

Comment by jarvisschultz on 2023-08-07:
Here's an example that does work. I'm guessing your problem is that in this chunk data.data[i]=i; you have not told the computer that the data.data vector should have 5 entries. So you are trying to access uninitialized memory. You should likely be using something like push_back or data.data.resize(5); before your for loop in the publisher.

Comment by jarvisschultz on 2023-08-07:
If you look at the example above, you'll see that I use push_back on Float32MultiArray.layout to set the size of that vector, and then I use std::vector::resize to resize a vector that will contain the data I'm trying to publish (which I eventually set equal to Float32MultiArray.data).

Side note, I believe the exit code -11 is coming from Python's subprocess poll function which, according to that link, would indicate your program exiting due to a signal 11. Note, roslaunch is written in Python and uses the subprocess module to run nodes. This would correspond to a SIGSEGV -- which is an invalid memory reference. This is consistent with my previous comment.

Comment by Lilipop on 2023-08-08:
Hey, thanks a lot for the detailed answer. With the resize function now, I am able to get a functionning publisher !

Thanks again for your explanation :)

Comment by jarvisschultz on 2023-08-09:
Cool. I'm going to convert these to an answer so that this shows up as answered. If you wouldn't mind accepting that would be helpful too.

$\endgroup$

1 Answer 1

0
$\begingroup$

Rosanswers logo

Here's an example that does work. I'm guessing your problem is that in this chunk data.data[i]=i; you have not told the computer that the data.data vector should have 5 entries. So you are trying to access uninitialized memory. You should likely be using something like push_back or data.data.resize(5); before your for loop in the publisher.

If you look at the example above, you'll see that I use push_back on Float32MultiArray.layout to set the size of that vector, and then I use std::vector::resize to resize a vector that will contain the data I'm trying to publish (which I eventually set equal to Float32MultiArray.data).

Side note, I believe the exit code -11 is coming from Python's subprocess poll function which, according to that link, would indicate your program exiting due to a signal 11. Note, roslaunch is written in Python and uses the subprocess module to run nodes. This would correspond to a SIGSEGV -- which is an invalid memory reference. This is consistent with my previous comment.


Originally posted by jarvisschultz with karma: 9031 on 2023-08-09

This answer was ACCEPTED on the original site

Post score: 1

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.