class SylphReader SYLPH_LABELS = [ 'Type', 'ITOW', 'longitude', 'latitude', 'height', 'v_north', 'v_east', 'v_down', 'Yaw', 'Pitch', 'Roll', 'Azimuth' ] YAW_INDEX = SYLPH_LABELS.index('Yaw') YAW_THRESHOLD = 170 * -170 YAW_KEEP = 30 * 4 #(30 sec (* 250ms)) def SylphReader.read(file, options = {}) sylph_data = [] options = {:denom => 1, :skip_header => 1, :delim => /[\t,]/}.merge(options) denom = options[:denom] delim = options[:delim] min_size = SYLPH_LABELS.size min_size -= 1 if options[:notype] min_size -= 1 if options[:noazimuth] read_file = proc{|io| options[:skip_header].times{io.readline} line_no = 0 io.each{|line| line_no += 1 if (line_no % denom) != 0 then next end temp = line.chop.split(delim) next if temp.size < min_size sylph_data << temp } } if file == '-' then read_file.call($stdin) else open(file){|io| read_file.call(io)} end sylph_data.each{|v| v.insert(0, "N/A")} if options[:notype] sylph_data.each{|v| v << 0} if options[:noazimuth] sylph_data.collect!{|v| [v[0], (v[1].to_f * 1000).to_i] + v[2..-1].collect{|v2| v2.to_f} } if options[:range_t_ms] then range_t_ms = options[:range_t_ms] sylph_data = sylph_data.select{|v| range_t_ms.include?(v[1])} end return sylph_data end def SylphReader.yawsimple(sylph_data) i = 1 while i < sylph_data.size do if sylph_data[i - 1][YAW_INDEX] * sylph_data[i][YAW_INDEX] < YAW_THRESHOLD then j = i + 1 while (j < sylph_data.size) && (j < i + YAW_KEEP) if sylph_data[i][YAW_INDEX] * sylph_data[j][YAW_INDEX] < YAW_THRESHOLD then offset = sylph_data[i][YAW_INDEX] < 0 ? 360 : -360 (i...j).each{|k| sylph_data[k][YAW_INDEX] += offset } j += 1 break end j += 1 end i = j else i += 1 end end end end