# Help publishing to cmd_vel and subscribing to LaserScan

Hey guys, I am trying to program a publisher for cmd_vel and a subscriber of base_scan (sensor_msgs/LaserScan, specifically the array ranges). For the first one I know I have to give a command like this:

rostopic pub /cmd_vel geometry_msgs/Twist -r 10000 '[10, 0, 0]' '[0, 0, 5]'


I have tried giving it to the command prompt, and it works. Now, including that in a publisher (I have tried modifying the "talker" one of the tutorials - from here). The thing is I don't know how to modify it to include the command I want to give to it. I tried changing the following line to:

ss << "/cmd_vel geometry_msgs/Twist -r 10000 '[10, 0, 0]' '[0, 0, 5]'";


that belongs to this loop

  while (ros::ok())
{ std_msgs::String msg;
std::stringstream ss;
ss << "/cmd_vel geometry_msgs/Twist -r 10000 '[10, 0, 0]' '[0, 0, 5]'";
msg.data = ss.str();
ROS_INFO("%s", msg.data.c_str());
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}


But as expected, changing just the string to the command I want to give didn't work. There probably is a really simple way of doing it, but I don't know how.

As for the second task, the subscriber to LaserScan, I know that I have to use the ranges array to visualize the meters to the obstacles, but first of all I don't know how to visualize the array in the command prompt. Once I know that with the previous task answered, I may be able to find out how to do it.

Thanks a lot for all the help and support! (not only here but in all the questions I've been having lately!)

edit retag close merge delete

Sort by » oldest newest most voted

I think the confusion is that in the publisher/subscriber tutorial, the message type just happens to be a string, whereas the message type you want to be publishing is not a string, but a geometry_msgs/Twist. At the top of your while loop, you should have something like

geometry_msgs::Twist msg;


then you need to fill in the message's data fields:

msg.linear.x = 10;
msg.angular.z = 5;


The syntax you're using is only for the command line tool rostopic pub.

To visualize a laser scan, you should check out rviz.

more

Thanks, that clears a lot, I'll give it a try. For the laser scan, I have tried rviz, but what I'd like to do is to access the 'ranges' array within sensor_msgs/LaserScan. How could I do that? I want to access those numbers to program the case when an obstacle is too close (let's say, 2 meters) and then the robot should turn left (for instance).

I changed the code adapting it to my case to this:

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

#include <sstream>

int main(int argc, char **argv)
{
ros::init(argc, argv, "talker");
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<geometry_msgs::Twist>("cmd_vel", 1000);
ros::Rate loop_rate(10);

int count = 0;
while (ros::ok())
{
geometry_msgs::Twist msg;
msg.linear.x = 10;
msg.angular.z = 5;
chatter_pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
++count;
}
return 0;
}


But this is the problems I get to compile.

  /home/alonsoj1/ros_workspace/prueba/src/publisher.cpp: In function ‘int main(int, char**)’:
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:12: error: ‘geometry_msgs’ was not declared in this scope
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:12: error: parse error in template argument list
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:12: error: no matching function for call to ‘ros::NodeHandle::advertise(const char [8], int)’
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:20: error: ‘geometry_msgs’ is not a class or namespace
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:20: error: expected ‘;’ before ‘msg’
/home/alonsoj1/ros_workspace/prueba/src/publisher.cpp:21: error: ‘msg’ was not declared in this scope


I get I have to define geometry_msgs, but how can I know with '#include' to put in the beginning of the code?

Thanks!

more

Hey!

Uncomment your second include and change it to:

#include <geometry_msgs/Twist.h>

more