|  | @@ -68,32 +68,58 @@ public class LaserScanPublisher implements NodeMain {
 | 
	
		
			
				|  |  |      scipDevice.startScanning(new LaserScanListener() {
 | 
	
		
			
				|  |  |        @Override
 | 
	
		
			
				|  |  |        public void onNewLaserScan(LaserScan scan) {
 | 
	
		
			
				|  |  | -        org.ros.message.sensor_msgs.LaserScan message = 
 | 
	
		
			
				|  |  | -            node.getMessageFactory().newMessage("sensor_msgs/LaserScan");
 | 
	
		
			
				|  |  | -        // Some laser scanners have blind areas before and after the actual detection range.
 | 
	
		
			
				|  |  | -        // These are indicated by the front step and the last step configuration variables.
 | 
	
		
			
				|  |  | -        // Since the blind values never change, we can just ignore them when creating the 
 | 
	
		
			
				|  |  | -        // range array.
 | 
	
		
			
				|  |  | -        message.angle_increment = configuration.getAngleIncrement(); 
 | 
	
		
			
				|  |  | -        message.angle_min = configuration.getMinimumAngle();
 | 
	
		
			
				|  |  | -        message.angle_max = configuration.getMaximumAngle();
 | 
	
		
			
				|  |  | -        message.ranges = new float[configuration.getLastStep() - configuration.getFirstStep()];
 | 
	
		
			
				|  |  | -        for (int i = 0; i < message.ranges.length; i++) {
 | 
	
		
			
				|  |  | -          message.ranges[i] = (float) (scan.getRanges().get(i + configuration.getFirstStep()) / 1000.0);
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -        message.time_increment = configuration.getTimeIncrement();
 | 
	
		
			
				|  |  | -        message.scan_time = configuration.getScanTime();
 | 
	
		
			
				|  |  | -        message.range_min = (float) (configuration.getMinimumMeasurment() / 1000.0);
 | 
	
		
			
				|  |  | -        message.range_max = (float) (configuration.getMaximumMeasurement() / 1000.0);
 | 
	
		
			
				|  |  | -        message.header.frame_id = laserFrame;
 | 
	
		
			
				|  |  | -        message.header.stamp = new org.ros.message.Time(scan.getTimeStamp()).add(timeOffset);
 | 
	
		
			
				|  |  | +        org.ros.message.sensor_msgs.LaserScan message = toLaserScanMessage(
 | 
	
		
			
				|  |  | +            laserFrame, configuration, scan);
 | 
	
		
			
				|  |  |          publisher.publish(message);
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | +      }});
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    @Override
 | 
	
		
			
				|  |  |    public void shutdown() {
 | 
	
		
			
				|  |  |      scipDevice.shutdown();
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | +  
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  /**
 | 
	
		
			
				|  |  | +   * Construct a LaserScan message from sensor readings and the laser
 | 
	
		
			
				|  |  | +   * configuration.
 | 
	
		
			
				|  |  | +   * 
 | 
	
		
			
				|  |  | +   * Also gets rid of readings that don't contain any information.
 | 
	
		
			
				|  |  | +   * 
 | 
	
		
			
				|  |  | +   * Some laser scanners have blind areas before and after the actual detection
 | 
	
		
			
				|  |  | +   * range. These are indicated by the frontStep and the lastStep properties of
 | 
	
		
			
				|  |  | +   * the laser's configuration. Since the blind values never change, we can just
 | 
	
		
			
				|  |  | +   * ignore them when copying the range readings.
 | 
	
		
			
				|  |  | +   * 
 | 
	
		
			
				|  |  | +   * @param laserFrame
 | 
	
		
			
				|  |  | +   *          The laser's sensor frame.
 | 
	
		
			
				|  |  | +   * @param configuration
 | 
	
		
			
				|  |  | +   *          The laser's current configuration.
 | 
	
		
			
				|  |  | +   * @param scan
 | 
	
		
			
				|  |  | +   *          The actual range readings.
 | 
	
		
			
				|  |  | +   * @return A new LaserScan message
 | 
	
		
			
				|  |  | +   */
 | 
	
		
			
				|  |  | +  private org.ros.message.sensor_msgs.LaserScan toLaserScanMessage(
 | 
	
		
			
				|  |  | +      String laserFrame, Configuration configuration, LaserScan scan) {
 | 
	
		
			
				|  |  | +    org.ros.message.sensor_msgs.LaserScan message = node.getMessageFactory()
 | 
	
		
			
				|  |  | +        .newMessage("sensor_msgs/LaserScan");
 | 
	
		
			
				|  |  | +    message.angle_increment = configuration.getAngleIncrement();
 | 
	
		
			
				|  |  | +    message.angle_min = configuration.getMinimumAngle();
 | 
	
		
			
				|  |  | +    message.angle_max = configuration.getMaximumAngle();
 | 
	
		
			
				|  |  | +    message.ranges = new float[configuration.getLastStep()
 | 
	
		
			
				|  |  | +        - configuration.getFirstStep()];
 | 
	
		
			
				|  |  | +    for (int i = 0; i < message.ranges.length; i++) {
 | 
	
		
			
				|  |  | +      message.ranges[i] = (float) (scan.getRanges().get(
 | 
	
		
			
				|  |  | +          i + configuration.getFirstStep()) / 1000.0);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    message.time_increment = configuration.getTimeIncrement();
 | 
	
		
			
				|  |  | +    message.scan_time = configuration.getScanTime();
 | 
	
		
			
				|  |  | +    message.range_min = (float) (configuration.getMinimumMeasurment() / 1000.0);
 | 
	
		
			
				|  |  | +    message.range_max = (float) (configuration.getMaximumMeasurement() / 1000.0);
 | 
	
		
			
				|  |  | +    message.header.frame_id = laserFrame;
 | 
	
		
			
				|  |  | +    message.header.stamp = new org.ros.message.Time(scan.getTimeStamp())
 | 
	
		
			
				|  |  | +        .add(timeOffset);
 | 
	
		
			
				|  |  | +    return message;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  }
 |