00001
00002
00003
00004
00005
00006
00007
00008
00009
00024 #include <fstream>
00025 #include <ros/ros.h>
00026 #include <velodyne/data_xyz.h>
00027
00028 namespace Velodyne
00029 {
00031
00032
00033
00035
00036 DataXYZ::DataXYZ(std::string ofile, std::string anglesFile):
00037 DataScans(ofile, anglesFile)
00038 {
00039
00040
00041 xyzScans_.reserve(SCANS_PER_REV);
00042 }
00043
00044 inline void DataXYZ::scan2xyz(const laserscan_t *scan,
00045 laserscan_xyz_t *point)
00046 {
00047 float xy_projection = scan->range * cosf(scan->pitch);
00048 point->laser_number = scan->laser_number;
00049 point->heading = scan->heading;
00050 point->revolution = scan->revolution;
00051 point->x = xy_projection * cosf(scan->heading);
00052 point->y = xy_projection * sinf(scan->heading);
00053 point->z = scan->range * sinf(scan->pitch);
00054 point->intensity = scan->intensity;
00055 }
00056
00058 void DataXYZ::processPacket(const velodyne_msgs::VelodynePacket *pkt,
00059 const std::string &frame_id)
00060 {
00061
00062 DataScans::processPacket(pkt, frame_id);
00063
00064
00065 xyzScans_.resize(scans_.size());
00066 for (unsigned i = 0; i < xyzScans_.size(); i++)
00067 {
00068 scan2xyz(&scans_[i], &xyzScans_[i]);
00069 }
00070
00071 if (!ros::ok())
00072 return;
00073
00074
00075 if (cb_)
00076 cb_(xyzScans_, pkt->stamp, frame_id);
00077 }
00078
00085 int DataXYZ::print(void)
00086 {
00087 if (uninitialized_)
00088 return EBADF;
00089
00090 if (ofp_ == NULL)
00091 return 0;
00092
00093 for (unsigned i = 0; i < xyzScans_.size(); i++)
00094 {
00095
00096
00097 int rc = fprintf(ofp_, "%02u %+08.6f %+011.6f %+011.6f %+011.6f %03u\n",
00098 xyzScans_[i].laser_number,
00099 xyzScans_[i].heading,
00100 xyzScans_[i].x, xyzScans_[i].y, xyzScans_[i].z,
00101 xyzScans_[i].intensity);
00102 if (rc < 0)
00103 return errno;
00104
00105
00106
00107 if (!ros::ok())
00108 return EINTR;
00109 }
00110
00111 return 0;
00112 }
00113
00114 }