Ejemplo n.º 1
0
int main(int argc, char** argv) {

LMS1xx laser;
scanCfg sCfg;

if(argc < 4) {
print_usage();
return 0;
}

laser.connect(argv[1]);

if(!laser.isConnected()) {
std::cout << "Unable to connect to device at address : " << argv[1] << std::endl;
return 0;
}

sCfg.angleResolution = (int)(boost::lexical_cast<double>(std::string(argv[2])) * 10000);
sCfg.scaningFrequency = boost::lexical_cast<int>(std::string(argv[3])) * 100;

laser.login();
laser.setScanCfg(sCfg);
laser.saveConfig();

sCfg = laser.getScanCfg();

std::cout << "Configuration set to : " << std::endl;
std::cout << "resolution : " << (double)sCfg.angleResolution/10000.0 << std::endl;
std::cout << "frequency : " << (double)sCfg.scaningFrequency/100.0 << std::endl;

laser.disconnect();

return 0;
}
Ejemplo n.º 2
0
int main()
{
LMS1xx laser;
scanData data;

laser.connect("192.168.0.1");
if(!laser.isConnected())
{
std::cout << "connection failend" << std::endl;
return 0;
}

std::cout << "Connected to laser" << std::endl;

std::cout << "Loging in ..." << std::endl;
laser.login();

laser.stopMeas();

std::cout << "Geting scan configuration ..." << ::std::endl;
scanCfg c = laser.getScanCfg();

//std::cout << "Scanning Frequency : " << c.scaningFrequency/100.0 << "Hz AngleResolution : " << c.angleResolution/10000.0 << "deg " << std::endl;

c.angleResolution = 5000;
c.scaningFrequency = 5000;

laser.setScanCfg(c);

scanDataCfg cc;
cc.deviceName = false;
cc.encoder = 0;
cc.outputChannel = 3;
cc.remission = true;
cc.resolution = 0;
cc.position = false;
cc.outputInterval = 1;

laser.setScanDataCfg(cc);

int ret = 0;
std::cout << "Start measurements ..." << std::endl;
laser.startMeas();

std::cout << "Wait for ready status ..." << std::endl;
ret = 0;
while (ret != 7)
{
ret = laser.queryStatus();
std::cout << "status : " << ret << std::endl;
sleep(1);
}
std::cout << "Laser ready" << std::endl;

std::cout << "Start continuous data transmission ..." << std::endl;
laser.scanContinous(1);

for(int i =0; i < 3; i++)
{
std::cout << "Receive data sample ..." << std::endl;
laser.getData(data);
}

std::cout << "Stop continuous data transmission ..." << std::endl;
laser.scanContinous(0);

laser.stopMeas();

std::cout << "Disconnect from laser" << std::endl;
laser.disconnect();

return 0;
}
Ejemplo n.º 3
0
int main(int argc, char **argv)
{
  // laser data
  LMS1xx laser;
  scanCfg cfg;
  scanDataCfg dataCfg;
  scanData data;
  // published data
  sensor_msgs::LaserScan scan_msg;
  // parameters
  std::string host;
  std::string frame_id;

  ros::init(argc, argv, "lms1xx");
  ros::NodeHandle nh;
  ros::NodeHandle n("~");
  ros::Publisher scan_pub = nh.advertise<sensor_msgs::LaserScan>("scan", 1);

  n.param<std::string>("host", host, "192.168.0.1");
  n.param<std::string>("frame_id", frame_id, "laser");

  ROS_INFO("connecting to laser at : %s", host.c_str());
  // initialize hardware
  laser.connect(host);

  if (laser.isConnected())
  {
    ROS_INFO("Connected to laser.");

    laser.login();
    cfg = laser.getScanCfg();

    scan_msg.header.frame_id = frame_id;

    scan_msg.range_min = 0.01;
    scan_msg.range_max = 20.0;

    scan_msg.scan_time = 100.0/cfg.scaningFrequency;

    scan_msg.angle_increment = (double)cfg.angleResolution/10000.0 * DEG2RAD;
    scan_msg.angle_min = (double)cfg.startAngle/10000.0 * DEG2RAD - M_PI/2;
    scan_msg.angle_max = (double)cfg.stopAngle/10000.0 * DEG2RAD - M_PI/2;

    std::cout << "resolution : " << (double)cfg.angleResolution/10000.0 << " deg " << std::endl;
    std::cout << "frequency : " << (double)cfg.scaningFrequency/100.0 << " Hz " << std::endl;

    int num_values;
    if (cfg.angleResolution == 2500)
    {
      num_values = 1081;
    }
    else if (cfg.angleResolution == 5000)
    {
      num_values = 541;
    }
    else
    {
      ROS_ERROR("Unsupported resolution");
      return 0;
    }

    scan_msg.time_increment = scan_msg.scan_time/num_values;

    scan_msg.ranges.resize(num_values);
    scan_msg.intensities.resize(num_values);

    dataCfg.outputChannel = 1;
    dataCfg.remission = true;
    dataCfg.resolution = 1;
    dataCfg.encoder = 0;
    dataCfg.position = false;
    dataCfg.deviceName = false;
    dataCfg.outputInterval = 1;

    laser.setScanDataCfg(dataCfg);

    laser.startMeas();

    status_t stat;
    do // wait for ready status
    {
      stat = laser.queryStatus();
      ros::Duration(1.0).sleep();
    }
    while (stat != ready_for_measurement);

    laser.startDevice(); // Log out to properly re-enable system after config

    laser.scanContinous(1);

    while (ros::ok())
    {
      ros::Time start = ros::Time::now();

      scan_msg.header.stamp = start;
      ++scan_msg.header.seq;

      laser.getData(data);

      for (int i = 0; i < data.dist_len1; i++)
      {
        scan_msg.ranges[i] = data.dist1[i] * 0.001;
      }

      for (int i = 0; i < data.rssi_len1; i++)
      {
        scan_msg.intensities[i] = data.rssi1[i];
      }

      scan_pub.publish(scan_msg);

      ros::spinOnce();
    }

    laser.scanContinous(0);
    laser.stopMeas();
    laser.disconnect();
  }
  else
  {
    ROS_ERROR("Connection to device failed");
  }
  return 0;
}
Ejemplo n.º 4
0
int main(int argc, char **argv)
{
  // laser data
  LMS1xx laser;
  scanCfg cfg;
  scanDataCfg dataCfg;
  scanData data;
  // published data
  sensor_msgs::LaserScan scan_msg;
  // parameters
  std::string host;
  std::string frame_id;
  double range_max = 20.0;
  double start_angle = -135.0*DEG2RAD;
  double end_angle   =  135.0*DEG2RAD;
  double frequency   = 25.0;
  ros::init(argc, argv, "lms1xx");
  ros::NodeHandle nh;
  ros::NodeHandle n("~");


  n.param<std::string>("host", host, "192.168.1.2");
  n.param<std::string>("frame_id", frame_id, "laser");
  n.param<double>("range_max", range_max, 20.0);
  n.param<double>("start_angle", start_angle,-135.0*DEG2RAD);
  n.param<double>("end_angle", end_angle,135.0*DEG2RAD);
  n.param<double>("frequency", frequency,25.0);

  ros::Publisher scan_pub = nh.advertise<sensor_msgs::LaserScan>("scan", 1);
  ROS_INFO("connecting to laser at : %s", host.c_str());

  // initialize hardware
  laser.connect(host);

  if (laser.isConnected())
  {
    ROS_INFO("Connected to laser.");

    laser.login();
    cfg = laser.getScanCfg();
    int num_values;
    if (cfg.angleResolution == 2500)
    {
      num_values = 1081;
    }
    else if (cfg.angleResolution == 5000)
    {
      num_values = 541;
    }
    else
    {
      ROS_ERROR("Unsupported resolution");
      return 0;
    }

    double sensor_start_angle = cfg.startAngle/10000.0 * DEG2RAD - M_PI/2.0;
    double sensor_end_angle   = cfg.stopAngle/10000.0 * DEG2RAD - M_PI/2.0;

    ROS_INFO_STREAM("\n\nLaser measurement config received from the sensor :");
    ROS_INFO("\t sensor start angle %.2f [deg] - %.6f [rad]", cfg.startAngle/10000.0 - 90, sensor_start_angle );
    ROS_INFO("\t sensor stop  angle %.2f [deg] - %.6f [rad]", cfg.stopAngle/10000.0  - 90, sensor_end_angle );
    ROS_INFO("\t sensor angle resolution %.2f [deg] - %.6f [rad]", cfg.angleResolution/10000.0,  cfg.angleResolution/10000.0 * DEG2RAD);
    ROS_INFO("\t sensor scan  frequency %.2f [hz]", cfg.scaningFrequency/100.0);
    ROS_INFO("\t sensor num   readings  %d", num_values);

    /// Setting fields of scan msg
    scan_msg.header.frame_id = frame_id;
    scan_msg.range_min = 0.01;
    scan_msg.range_max = range_max;

    int frequency_reducer = static_cast<int>( cfg.scaningFrequency/(100.0 * frequency) );
    frequency = cfg.scaningFrequency/(100.0* frequency_reducer);
    scan_msg.scan_time = 1.0/frequency;
    scan_msg.angle_increment = cfg.angleResolution/10000.0 * DEG2RAD;

    /// Swap start/end angle in case of inverted sign
    if(start_angle > end_angle)
    {
      double tmp = start_angle;
      start_angle = end_angle;
      end_angle = tmp;
    }

    /// Check if sensor starting angle is greater than requested starting angle
    if(start_angle < sensor_start_angle )
      start_angle = sensor_start_angle;

    /// Check if sensor ending angle is smaller than requested ending angle
    if(end_angle > sensor_end_angle)
      end_angle = sensor_end_angle;

    /// Adjusting min max angle values considering angular resolution
    start_angle = sensor_start_angle + scan_msg.angle_increment* (static_cast<int>( ( fabs(start_angle - sensor_start_angle)) /scan_msg.angle_increment ) + 1);
    end_angle   = sensor_end_angle - scan_msg.angle_increment* ( static_cast<int>( ( fabs(sensor_end_angle - end_angle)) /scan_msg.angle_increment ) + 1);

    /// Setting min max angle values in ros scan msg
    scan_msg.angle_min = start_angle;
    scan_msg.angle_max = end_angle;



    int filtered_num_values = static_cast<int>((end_angle - start_angle)/scan_msg.angle_increment ) + 1;
    //    ROS_INFO("Sensor num of readings %d, filtered num of readings %d", num_values, filtered_num_values);
    num_values = filtered_num_values;

    ROS_INFO_STREAM("\n\nLaser measurement output from the driver :");

    ROS_INFO("\t msg start angle %.2f [deg] - %.6f [rad]", start_angle*RAD2DEG, start_angle);
    ROS_INFO("\t msg stop  angle %.2f [deg - %.6f [rad]", end_angle*RAD2DEG, end_angle);
    ROS_INFO("\t msg angle resolution %.2f [deg] - %.6f [rad]", cfg.angleResolution/10000.0, scan_msg.angle_increment);
    ROS_INFO("\t msg topic frequency %.2f [hz]", frequency);
    ROS_INFO("\t msg min   range %.2f [m]", scan_msg.range_min);
    ROS_INFO("\t msg max   range %.2f [m]", scan_msg.range_max);
    ROS_INFO("\t msg num   readings %d", num_values);

    ROS_INFO("\t frequency reduction factor is %d", frequency_reducer);

    scan_msg.time_increment = scan_msg.scan_time/num_values;
    scan_msg.ranges.resize(num_values);
    scan_msg.intensities.resize(num_values);

    dataCfg.outputChannel = 1;
    dataCfg.remission = true;
    dataCfg.resolution = 1;
    dataCfg.encoder = 0;
    dataCfg.position = false;
    dataCfg.deviceName = false;
    dataCfg.outputInterval = 1;

    laser.setScanDataCfg(dataCfg);

    laser.startMeas();

    status_t stat;
    do // wait for ready status
    {
      stat = laser.queryStatus();
      ros::Duration(1.0).sleep();
    }
    while (stat != ready_for_measurement);

    laser.startDevice(); // Log out to properly re-enable system after config

    laser.scanContinous(1);

    int counter = -1;

    while (ros::ok())
    {
      ros::Time start = ros::Time::now();

      scan_msg.header.stamp = start;
      ++scan_msg.header.seq;

      laser.getData(data);

      /// frequency publishing reduction
      counter++;
      if(counter%frequency_reducer != 0)
        continue;

      double angle = sensor_start_angle;

      int j = 0;
      for (int i = 0; i < data.dist_len1; i++)
      {
        if( angle - scan_msg.angle_min < -1e-4 || angle - scan_msg.angle_max > 1e-4 )
        {
          angle += scan_msg.angle_increment;
          continue;
        }
        scan_msg.ranges[j] = data.dist1[i] * 0.001;
        angle += scan_msg.angle_increment;
        j++;
      }

      angle = sensor_start_angle;
      j = 0;
      for (int i = 0; i < data.rssi_len1; i++)
      {
        if(angle - scan_msg.angle_min < -1e-4 || angle - scan_msg.angle_max > 1e-4)
        {
          angle += scan_msg.angle_increment;
          continue;
        }
        scan_msg.intensities[j] = data.rssi1[i];
        angle += scan_msg.angle_increment;
        j++;
      }

      scan_pub.publish(scan_msg);

      ros::spinOnce();
    }

    laser.scanContinous(0);
    laser.stopMeas();
    laser.disconnect();
  }
  else
  {
    ROS_ERROR("Connection to device failed");
  }
  return 0;
}
Ejemplo n.º 5
0
int main(int argc, char **argv)
{

  /* laser data */
  LMS1xx laser;
  scanCfg cfg;
  scanDataCfg dataCfg;
  scanData data;

  /* published data */
  sensor_msgs::LaserScan scan_msg;

  /* parameters */
  std::string host;
  std::string topic_id;
  std::string frame_id;

  /* variables */
  int retrycount = 0;

  ros::init(argc, argv, "LMS111_node");
  ros::NodeHandle nh;
  ros::NodeHandle n("~");

  n.param<std::string> ("host", host, "192.168.0.10");
  n.param<std::string> ("topic_id", topic_id, "scan_msg");
  n.param<std::string> ("frame_id", frame_id, "/map");

  ros::Publisher scan_pub = nh.advertise<sensor_msgs::LaserScan> (topic_id, 1);

  ROS_INFO("Connecting to device at : %s", host.c_str());

  /* initialize hardware */
  laser.connect(host);

  if (laser.isConnected())
  {

    ROS_INFO("Connected to device at : %s", host.c_str());

    laser.login();
    cfg = laser.getScanCfg();

    scan_msg.header.frame_id = frame_id;

    scan_msg.range_min = 0.01;
    scan_msg.range_max = 6.0;

    scan_msg.scan_time = 100.0 / cfg.scaningFrequency;

    scan_msg.angle_increment = cfg.angleResolution / 10000.0 * DEG2RAD;
    scan_msg.angle_min = cfg.startAngle / 10000.0 * DEG2RAD - M_PI / 2;
    scan_msg.angle_max = cfg.stopAngle / 10000.0 * DEG2RAD - M_PI / 2;

    //std::cout << "res : " << cfg.angleResolution << " freq : " << cfg.scaningFrequency << std::endl;

    int num_values;
    if (cfg.angleResolution == 2500)
    {
      num_values = 1081;
    }
    else if (cfg.angleResolution == 5000)
    {
      num_values = 541;
    }
    else
    {
      ROS_ERROR("Unsupported resolution");
      return 0;
    }

    scan_msg.time_increment = scan_msg.scan_time / num_values;

    scan_msg.ranges.resize(num_values);
    scan_msg.intensities.resize(num_values);

    dataCfg.outputChannel = 1;
    dataCfg.remission = true;
    dataCfg.resolution = 1;
    dataCfg.encoder = 0;
    dataCfg.position = false;
    dataCfg.deviceName = false;
    dataCfg.outputInterval = 1;

    laser.setScanDataCfg(dataCfg);

    laser.startMeas();

    status_t stat;
    do // wait for ready status
    {
      retrycount++;
      stat = laser.queryStatus();
      ros::Duration(1.0).sleep();
    } while ((stat != ready_for_measurement) && retrycount < MAXRETRYES);

    if (stat == ready_for_measurement)
    {
      ROS_INFO("Device ready - receiving measurement");
      laser.scanContinous(1);

      while (ros::ok())
      {
        ros::Time start = ros::Time::now();

        scan_msg.header.stamp = start;
        ++scan_msg.header.seq;

        laser.getData(data);

        for (int i = 0; i < data.dist_len1; i++)
        {
          scan_msg.ranges[i] = data.dist1[i] * 0.001;
        }

        for (int i = 0; i < data.rssi_len1; i++)
        {
          scan_msg.intensities[i] = data.rssi1[i];
        }

        scan_pub.publish(scan_msg);

        ros::spinOnce();
      }

      laser.scanContinous(0);
      laser.stopMeas();
      laser.disconnect();
    }
    else
    {
      ROS_ERROR("Device not ready for measurement");
      return 0;
    }
  }
  else
  {
    ROS_ERROR("Connection to device @ %s failed", host.c_str());
  }
  return 0;

}
Ejemplo n.º 6
0
/**
 * Main entry of program
 */
int main(int argc, char **argv)
{
    // laser data
    LMS1xx laser;
    scanCfg cfg;
    scanDataCfg dataCfg;
    scanData data;

    // published data
    sensor_msgs::LaserScan scan_msg;

    // parameters
    string host;
    string frame_id;

    // ROS
    ros::init(argc, argv, "lms1xx");
    ros::NodeHandle nh;
    ros::NodeHandle n("~");
    ros::Publisher scan_pub = nh.advertise<sensor_msgs::LaserScan>("/sick/scan", 1);
    ros::Publisher scanfil_pub = nh.advertise<sensor_msgs::LaserScan>("/sick/scan_filtered", 1);

    n.param<string>("host", host, "192.168.1.2");
    n.param<string>("frame_id", frame_id, "laser");

    n.param<bool>( "EnableRawOutput", EnableRawOutput, false);
    n.param<bool>(      "UpsideDown",      UpsideDown,  true);
    n.param< int>(    "FilterSelect",    FilterSelect,     2); // Median filter is standard

    // initialize hardware
    ROS_INFO("connecting to laser at : %s", host.c_str());
    while (!laser.isConnected())
        laser.connect(host);

    while(!laser.isLoggedin())
        laser.login();

    ROS_INFO("Connected to laser and logged in.");


    cfg = laser.getScanCfg();

    scan_msg.header.frame_id = frame_id;

    scan_msg.range_min = 0.01;
    scan_msg.range_max = 20.0;

    scan_msg.scan_time = 100.0/cfg.scaningFrequency;

    float angle_incr = (double)cfg.angleResolution/10000.0 * DEG2RAD;
    float angle_min  = (double)cfg.startAngle/10000.0 * DEG2RAD;
    float angle_max  = (double)cfg.stopAngle /10000.0 * DEG2RAD;

    cout << "resolution : " << (double)cfg.angleResolution/10000.0 << " deg " << endl;
    cout << "frequency : " << (double)cfg.scaningFrequency/100.0 << " Hz " << endl;

    int num_values;
    if (cfg.angleResolution == 2500)
    {
        num_values = 1081;
    }
    else if (cfg.angleResolution == 5000)
    {
        num_values = 541;
    }
    else
    {
        ROS_ERROR("Unsupported resolution");
        return 0;
    }

    // Init filters
    InitFilterNone    ( num_values);
    InitFilterAverage ( num_values);
    InitFilterMedian  ( num_values);

    // Set some scan_msg defaults
    scan_msg.time_increment = scan_msg.scan_time/num_values;
    scan_msg.ranges.resize(num_values);

#if SEND_INTENSITIES
    scan_msg.intensities.resize(num_values);
    dataCfg.remission = true;
#else
    dataCfg.remission = false;
#endif

    dataCfg.outputChannel = 1;
    dataCfg.resolution = 1;
    dataCfg.encoder = 0;
    dataCfg.position = false;
    dataCfg.deviceName = false;
    dataCfg.outputInterval = 1;

    laser.setScanDataCfg(dataCfg);

    laser.startMeas();

    status_t stat;
    do // wait for ready status
    {
        stat = laser.queryStatus();
        ros::Duration(1.0).sleep();
    }
    while (stat != ready_for_measurement);

    laser.startDevice(); // Log out to properly re-enable system after config
    laser.scanContinous(1);


    while (ros::ok())
    {
        ros::Time start = ros::Time::now();

        scan_msg.header.stamp = start;
        ++scan_msg.header.seq;

        laser.getData(data);

        if( UpsideDown)
        {
            scan_msg.angle_increment = -angle_incr;
            scan_msg.angle_min = angle_max;
            scan_msg.angle_max = angle_min;
        }
        else
        {
            scan_msg.angle_increment = angle_incr;
            scan_msg.angle_min = angle_min;
            scan_msg.angle_max = angle_max;
        }

#if SEND_INTENSITIES
        for (int i = 0; i < data.rssi_len1; i++)
        {
            scan_msg.intensities[i] = data.rssi1[i];
        }
#endif

        // Send to /sick/scan if raw data is wanted
        if( EnableRawOutput)
        {
            for (int i = 0; i < data.dist_len1; i++)
            {
                scan_msg.ranges[i] = data.dist1[i] * 0.001;
            }

            scan_pub.publish(scan_msg);
        }

        switch( FilterSelect)
        {
        case 1:
            ExecuteFilterAverage( data, scan_msg);
            break;

        case 2:
            ExecuteFilterMedian( data, scan_msg);
            break;

        default:
            ExecuteFilterNone( data, scan_msg);
            break;
        }

        scanfil_pub.publish(scan_msg);

        ros::spinOnce();
    }

    // de-init filters
    DestroyFilterNone();
    DestroyFilterAverage();
    DestroyFilterMedian();

    laser.scanContinous(0);
    laser.stopMeas();
    laser.disconnect();

    return 0;
}
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    static int index = 0;
    ///Laser Data
    LMS1xx LaserSensor;
    scanCfg cfg;
    scanData data;
    scanDataCfg dataCfg;
    status_t status;

    std::ofstream file;

    double start_angle=0;
    double stop_angle=0;
    double resolution=0;
    double frequency=0;

    ///Kmeans realated variables
    KMeans<> K;
    mat dataset;
    size_t cluster;
    Col<size_t> assignments;
    mat centroid;


    ///Connect to the Lasersensor
    LaserSensor.connect(host);

    if(LaserSensor.isConnected())
    {
        std::cout << "\nConnected !!!\n";

        LaserSensor.login();

        ///Get Laser Configurations
        cfg = LaserSensor.getScanCfg();
        //cfg.angleResolution = 0.25*10000.0;
        //cfg.scaningFrequency = 25*100;

        //LaserSensor.setScanCfg(cfg);
        //LaserSensor.saveConfig();
       // sleep(3);
        cfg = LaserSensor.getScanCfg();
        start_angle = cfg.startAngle/10000.0; //* DEG2RAD - M_PI/2;
        stop_angle = cfg.stopAngle/10000.0; //* DEG2RAD - M_PI/2;
        resolution = cfg.angleResolution/10000.0;
        frequency = cfg.scaningFrequency/100;

        std::cout << "Start Angle: " << start_angle;
        std::cout << "\tStop Angle: " << stop_angle;
        std::cout << "\tResolution: " << resolution;
        std::cout << "\tFrequency: " << frequency;
        std::cout << std::endl;

        dataCfg.outputChannel = 1;
        dataCfg.remission = true;
        dataCfg.resolution = 1;
        dataCfg.encoder = 0;
        dataCfg.position = false;
        dataCfg.deviceName = false;
        dataCfg.outputInterval = 1;

        LaserSensor.setScanDataCfg(dataCfg); ///Set Data Configuration of the laser data

        LaserSensor.startMeas();    ///Start Measurement

        do
        {
            status = LaserSensor.queryStatus();
            usleep(200);
        }
        while(status != ready_for_measurement);
        {
            LaserSensor.startDevice();
            LaserSensor.scanContinous(1);

            while(LaserSensor.isConnected())
            {
                LaserSensor.getData(data);  ///Get the Laser Data

                //                u_int16_t range[data.dist_len1];
                //                u_int16_t intensity[data.rssi_len1];
                int range[data.dist_len1];
                int intensity[data.rssi_len1];

                for(int i=0; i<data.dist_len1;i++)
                    range[i] = data.dist1[i];

                for(int i=0; i<data.rssi_len1;i++)
                    intensity[i] = data.rssi1[i];

                if (index == 0)
                {
                    index++;
                    std::cout << std::endl << "Data len = " << data.dist_len1 << std::endl;
                    std::cout << "Intensity len = " << data.rssi_len1 << std::endl;

                    ///distance assumed to be in mm
                    ///Start angle is -45 end is 225
                    float angle_scan = -45.0;
                    float x[1081], y[1081];   ///The resolution is 0.5 degress so 541 values
                    int index_range = 0;
                    double slope;
                    cluster = 2;
                    //centroid.zeros();
                    dataset.resize(2,1081);
                    dataset.zeros();

                    file.open("LaserData.txt");

                    while(1)
                    {
                        x[index_range] = range[index_range]*cos(angle_scan*DEG2RAD)/1000.0;
                        y[index_range] = range[index_range] * sin(angle_scan*DEG2RAD)/1000.0;
                        //std::cout << "range: " << range[index_range] << " angle: " << angle_scan;
                        //std::cout << " x: " << x[index_range] << " y : " << y[index_range] << std::endl;
                        angle_scan += 0.25;

                        //if(intensity[index_range] >=850)
                        {
                            file << x[index_range] << "," << y[index_range] << "," << intensity[index_range] << std::endl;
                        }

                        if (angle_scan > 225.0)
                        {
                            break;
                        }
                        index_range++;
                        usleep(100);
                    }
                    int index_tmp = 0;
                    for(int i=0; i<1081;i++)
                    {
                        if (intensity[i] >= 900)
                        {
                            dataset(0,index_tmp) = x[i];
                            dataset(1,index_tmp) = y[i];

                            std::cout << "\n" << dataset[0,index_tmp] << "\t" << dataset[1,index_tmp];
                            index_tmp++;
                        }
                    }
                    std::cout << "\nKMeans Calculations!!!" << std::endl;
                    dataset.resize(2,index_tmp);

                    ///Actual KMeans CLustering
                    K.Cluster((arma::mat) dataset,2,assignments,centroid);

/*************************************************************************************************************************
                    static double sum_x[2];
                    static double sum_y[2];
                    int number_dist1=0;
                    int number_dist2=0;

                    for(int i=0; i < assignments.size(); i++) {
                        switch(assignments[i])
                        {
                            case 0:
                                sum_x[0]+=dataset(0,i);
                                sum_y[0]+=dataset(1,i);
                                number_dist1++;
                                break;
                            case 1:
                                sum_x[1]+=dataset(0,i);
                                sum_y[1]+=dataset(1,i);
                                number_dist2++;
                                break;
                        };

                        std::cout << "\n" << assignments[i];
                    }

                    double center1_x, center1_y;
                    double center2_x, center2_y;

                    center1_x = sum_x[0]/number_dist1;
                    center1_y = sum_y[0]/number_dist1;
                    center2_x = sum_x[1]/number_dist2;
                    center2_y = sum_y[1]/number_dist2;

                    std::cout<<center1_x<<"," << center1_y<<"   " << center2_x<<","<<center2_y<<endl;

**************************************************************************************************************************/

//std::cout << "\n" << centroid(0,0) << "\t" << centroid(1,0) << "\t"<< centroid(0,1) << "\t"<< centroid(1,1)<<"\n";

                    slope = (centroid(1,1) - centroid(1,0)) / (centroid(0,1) - centroid(0,0));
                    slope = (atan(slope))*RAD2DEG;

                    std::cout << "\nclusters= " << cluster << std::endl;
                    std::cout << "\nOrientation= " << slope << std::endl;
                }
                usleep(200);
            }
            std::cout << "\n Sensor Disconnected \n";

            ///Disconnect the Laser
            LaserSensor.scanContinous(0);
            LaserSensor.stopMeas();
            LaserSensor.disconnect();
            file.close();
        }
    }
    else
    {
        std::cout <<"\nSensor Not Connected !!!\n";
    }

    return a.exec();
}