Robotics StackExchange | Archived questions

How to write laser scan node for sharp GP2Y0A02YK0F sensor using C++?

I want to write a laser node for scanning an area using sharp GP2Y0A02YK0F IR range finder. Please give me some hints or source codes to work with that Range finder. Thank you!

Asked by kaviranga on 2015-07-23 10:35:11 UTC

Comments

Perhaps you should add more details about your system, e.g. how do you want to cover an area with IR-Sensors

Asked by Humpelstilzchen on 2015-07-24 02:12:17 UTC

Do you already have a hardware-interface to the sensor?

Asked by NEngelhard on 2015-07-25 12:48:35 UTC

@Humpelstizchen Yes the system has on sharp IR sensor .It is connected to servo motor for rotation.

Asked by kaviranga on 2015-08-06 01:00:55 UTC

@NEngelhard yes I'm using beaglebone black hardware interface.

Asked by kaviranga on 2016-08-14 06:34:53 UTC

Answers

You can read the data form your device and send data in the format as below:

To see the structure of the message sensor_msgs/LaserScan . Use the following command:

$ rosmsg show sensor_msgs/LaserScan

std_msgs/Header header
uint32 seq
time stamp
string frame_id
float32 angle_min
float32 angle_max
float32 angle_increment
float32 time_increment
float32 scan_time
float32 range_min
float32 range_max
float32[] ranges
float32[] intensities

Creating the laser node: create a new file:and put the following code in it:

#include <ros/ros.h>
#include <sensor_msgs/LaserScan.h>
int main(int argc, char** argv){
ros::init(argc, argv, "laser_scan_publisher");
ros::NodeHandle n;
ros::Publisher scan_pub = n.advertise<sensor_
msgs::LaserScan>("scan", 50);
unsigned int num_readings = 100;
double laser_frequency = 40;
double ranges[num_readings];
double intensities[num_readings];
int count = 0;
ros::Rate r(1.0);
while(n.ok()){
//generate some fake data for our laser scan
for(unsigned int i = 0; i < num_readings; ++i){
ranges[i] = count;
intensities[i] = 100 + count;
}
ros::Time scan_time = ros::Time::now();
Navigation Stack – Robot Setups
[ 224  ]
//populate the LaserScan message
sensor_msgs::LaserScan scan;
scan.header.stamp = scan_time;
scan.header.frame_id = "base_link";
scan.angle_min = -1.57;
scan.angle_max = 1.57;
scan.angle_increment = 3.14 / num_readings;
scan.time_increment = (1 / laser_frequency) / (num_readings);
scan.range_min = 0.0;
scan.range_max = 100.0;
scan.ranges.resize(num_readings);
scan.intensities.resize(num_readings);
for(unsigned int i = 0; i < num_readings; ++i){
scan.ranges[i] = ranges[i];
scan.intensities[i] = intensities[i];
}
scan_pub.publish(scan);
++count;
r.sleep();
}
}

As you can see, we are going to create a new topic with the name scan and the message type sensor_msgs/LaserScan .

Asked by redskydeng on 2015-07-25 07:20:31 UTC

Comments

Thank you very much for your quick reply . It was great help for me !

Asked by kaviranga on 2015-08-06 00:57:18 UTC

hi, i want to do the same thing and i want to ask you if you have managed to do it. i use IR connected to arduino Uno and rosserial thanks

Asked by Emilien on 2016-04-29 11:47:57 UTC

@Emilien I'm using beagle bone black as my hardware. I've capable of directly run the wheels of the robot using beaglebone black using a program written in C++.But ros-serial is better when communicating with sharp IR sensor!

Asked by kaviranga on 2016-08-14 06:48:33 UTC