diff --git a/.travis.yml b/.travis.yml index 4d9eaff..3420db5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,16 +4,17 @@ python: - '3.5' cache: pip before_install: - - chmod +x test/run_tests.py - - chmod +x test/test_data_loader.py - - chmod +x test/test_data_manager.py + - chmod +x robot_data_visualizer/test/run_tests.py + - chmod +x robot_data_visualizer/test/test_data_manager.py + - chmod +x robot_data_visualizer/test/test_download_tar.py + - chmod +x robot_data_visualizer/test/test_tar_extract.py + - chmod +x robot_data_visualizer/test/test_get_dates_umich.py + - chmod +x robot_data_visualizer/test/test_threshold_lidar.py install: - pip install -r requirements.txt script: - - python test/run_tests.py + - python robot_data_visualizer/test/run_tests.py branches: only: - master - - dev - - ken-dev - - hao-dev \ No newline at end of file + - hao_reconstruct diff --git a/misc/lidar_viewer.py b/misc/lidar_viewer.py deleted file mode 100644 index c7fe3b2..0000000 --- a/misc/lidar_viewer.py +++ /dev/null @@ -1,41 +0,0 @@ -"""lidar_viewer visualizes lidar data by ploting it in matplotlib window.""" - -import sys - -from tools.data_manager import DataManager -from time_convert import epoch_to_date_time -from plot_lidar import hokuyo_plot -from threshold_lidar import threshold_lidar_pts -sys.path.append('..') -def lidar_viewer(date, num_samples, step_size=40, pickled=False, delete_pickle=False): - """ - lidar_viewer visualizes lidar data by ploting it in matplotlib window. - - :param date: A 'Session' date from http://robots.engin.umich.edu/nclt/ (string) - :param num_samples: The number of lidar frames to view (int) - :param step_size: The amount of frames to skip between plots (data recorded at 40Hz) - :param pickled: Set to True if you want to save a pickle imported lidar data. - :param delete_pickle: Set to True if you want to delete any existing pickles of data. - """ - # initialize datamanager - data_manager = DataManager(date) - print('DataManager initialized') - # Download and extract sensor data - data_manager.setup_data_files('sensor_data') - print('sensor data downloaded') - # Download and extract data for the hokuyo lidar scanner - data_manager.setup_data_files('hokuyo') - - # load scans of lidar - - print('hokuyo data loading...') - data_manager.load_lidar(num_samples, pickled, delete_pickle) - lidar = data_manager.data_dict['lidar'] - print('plotting lidar') - for i in range(0, int(num_samples/step_size)*step_size, step_size): - lidar_i = lidar[i] - x_lidar, y_lidar, time = threshold_lidar_pts(lidar_i) - x_not_equal_time = str(x_lidar) != str(time) - if x_not_equal_time: - time = epoch_to_date_time(time) - hokuyo_plot(x_lidar, y_lidar, time) diff --git a/misc/static_map_example.py b/misc/static_map_example.py deleted file mode 100644 index c928667..0000000 --- a/misc/static_map_example.py +++ /dev/null @@ -1,20 +0,0 @@ -''' -A smoke test to use staticmap to generate northseatte.png without line features. -''' -from staticmap import Line -from tools.static_map_base_layer import StaticMap - -m = StaticMap(600, 600, 80) - -greenlake = [-122.3296, 47.6786] -udub = [-122.3066, 47.6562] - -coordinates = [greenlake, udub] -line_outline = Line(coordinates, 'white', 6) -line = Line(coordinates, '#D2322D', 4) - -m.add_line(line_outline) -m.add_line(line) - -image = m.render() -image.save('northseattle.png') \ No newline at end of file diff --git a/misc/test_data_manager.py b/misc/test_data_manager.py deleted file mode 100644 index a9e42a7..0000000 --- a/misc/test_data_manager.py +++ /dev/null @@ -1,28 +0,0 @@ -# Test an import of the DataManager class - -import sys -sys.path.append('..') - -import traceback -from tools.data_manager import DataManager - - -def main(): - try: - # Initialize with desired date from the UMich dataset - dm = DataManager('2013-01-10') - # Download and extract sensor data - dm.setup_data_files('sensor_data') - # Download and extract data for the hokuyo lidar scanner - dm.setup_data_files('hokuyo') - # load gps - dm.load_gps() - # load first 100 scans of lidar - dm.load_lidar(100) - print('Successful load of data') - except Exception as ex: - print(ex) - traceback.print_exc() - -if __name__ == '__main__': - main() \ No newline at end of file diff --git a/misc/test_static_map_base_layer.py b/misc/test_static_map_base_layer.py deleted file mode 100644 index 7ea0b01..0000000 --- a/misc/test_static_map_base_layer.py +++ /dev/null @@ -1,23 +0,0 @@ -''' -A smoke test for showing map without line features. -''' -import sys -sys.path.append('..') - -from staticmap import Line -from tools.static_map_base_layer import StaticMapBaseLayer - -m = StaticMapBaseLayer(600, 600, 80) - -southwest = [-83.721154, 42.287215] -northeast = [-83.710182, 42.293970] - -coordinates = [southwest, northeast] -line_outline = Line(coordinates, 'white', 6) -line = Line(coordinates, '#D2322D', 4) - -m.add_line(line_outline) -m.add_line(line) - -image = m.render_without_features() # *** THIS METHOD IS NEW *** -image.save('umich_no_features.png') \ No newline at end of file diff --git a/misc/test_staticmap_for_gps.py b/misc/test_staticmap_for_gps.py deleted file mode 100644 index 8aefa9b..0000000 --- a/misc/test_staticmap_for_gps.py +++ /dev/null @@ -1,48 +0,0 @@ -''' -This is a smoke test for tools.staticmap_for_gps. -''' -from staticmap import Line -import matplotlib.pyplot as plt -import os -import sys -sys.path.append('..') - -from tools.data_manager import DataManager -from tools.static_map_base_layer import StaticMapBaseLayer -from tools.staticmap_for_gps import generate_coordinates - -def plot_gps_on_map(): - ''' - This functions is used to plot gps points on map - :return: (px, py)coordinates of every gps data - ''' - data_manager = DataManager('2013-01-10') - # Download and extract sensor data - data_manager.setup_data_files('sensor_data') - # load gps - data_manager.load_gps() - - map = StaticMapBaseLayer(1000, 1000, 80) - - coordinates = generate_coordinates(data_manager.data_dict) - # Put image in the corresponding data directory - os.chdir(data_manager.data_dir) - - line = Line(coordinates, 'red', 4) - map.add_line(line) - - image = map.render_without_features() - image.save('umich_empty.png') - - points = map.extract_line_points() - x_coords = [item[0] for item in points] - y_coords = [item[1] for item in points] - - plt.imshow(image) - plt.plot(x_coords, y_coords) - plt.show(block=True) # block program until window is closed - - return points - -if __name__ == '__main__': - plot_gps_on_map() diff --git a/misc/test_time_convert.py b/misc/test_time_convert.py deleted file mode 100644 index bd6c369..0000000 --- a/misc/test_time_convert.py +++ /dev/null @@ -1,27 +0,0 @@ -import sys -import unittest -from time_convert import epoch_to_date_time - -class BasicTest(unittest.TestCase): - """setup for unittests.""" - def setUp(self): - time0 = 1347517370 - time1 = 1347517370111111 - time2 = 12 - self.convert_time0 = epoch_to_date_time(time0) - self.convert_time1 = epoch_to_date_time(time1) - self.convert_time2 = epoch_to_date_time(time2) - def test_specific_value(self): - """Checks for correct output of 10 digit epoch (no slicing by function needed).""" - self.assertEqual(self.convert_time0, 'Wed Sep 12 23:22:50 2012') - - def test_specific_value_plus_subseconds(self): - """Checks for correct output of 10+ digit epoch (slicing by function needed).""" - self.assertEqual(self.convert_time1, 'Wed Sep 12 23:22:50 2012') - def test_short_time(self): - """Checks for correct output of <10 digit epoch (no slicing by function needed).""" - self.assertEqual(self.convert_time2, 'Wed Dec 31 16:00:12 1969') - - -if __name__ == '__main__': - unittest.main() \ No newline at end of file diff --git a/robot_data_visualizer/__init__.py b/robot_data_visualizer/__init__.py new file mode 100644 index 0000000..f33d24c --- /dev/null +++ b/robot_data_visualizer/__init__.py @@ -0,0 +1,16 @@ +__all__ = ['data_loader', 'data_manager', 'download_tar', 'get_dates_umich', 'map_for_gps', 'read_hokuyo', 'static_map_base_layer', 'staticmap_for_gps', 'tar_extract', 'hokuyo_plot', 'threshold_lidar_pts', 'epoch_to_date_time'] + +from .get_dates_umich import get_dates_umich +from .data_loader import DataLoader +from .data_manager import DataManager +from .download_tar import download_tar +from .read_hokuyo_30m import read_hokuyo +from .tar_extract import tar_extract +from .get_dates_umich import get_dates_umich +from .view_lidar import hokuyo_plot +from .view_lidar import threshold_lidar_pts +from .time_convert import epoch_to_date_time +from .view_lidar import hokuyo_plot +from .view_lidar import threshold_lidar_pts +from .static_map_base_layer import StaticMapBaseLayer +from .staticmap_for_gps import map_for_gps \ No newline at end of file diff --git a/tools/data_loader.py b/robot_data_visualizer/data_loader.py similarity index 100% rename from tools/data_loader.py rename to robot_data_visualizer/data_loader.py diff --git a/tools/data_manager.py b/robot_data_visualizer/data_manager.py similarity index 94% rename from tools/data_manager.py rename to robot_data_visualizer/data_manager.py index 1327b6d..8f41a0b 100644 --- a/tools/data_manager.py +++ b/robot_data_visualizer/data_manager.py @@ -1,9 +1,10 @@ import os +os.chdir(os.path.abspath('.')) import pickle -from tools.data_loader import DataLoader -from tools.read_hokuyo_30m import read_hokuyo -from tools.tar_extract import tar_extract -from tools.download_tar import download_tar +from data_loader import DataLoader +from read_hokuyo_30m import read_hokuyo +from tar_extract import tar_extract +from download_tar import download_tar class DataManager: diff --git a/tools/download_tar.py b/robot_data_visualizer/download_tar.py similarity index 100% rename from tools/download_tar.py rename to robot_data_visualizer/download_tar.py diff --git a/tools/filter_nan.py b/robot_data_visualizer/filter_nan.py similarity index 100% rename from tools/filter_nan.py rename to robot_data_visualizer/filter_nan.py diff --git a/tools/get_dates_umich.py b/robot_data_visualizer/get_dates_umich.py similarity index 100% rename from tools/get_dates_umich.py rename to robot_data_visualizer/get_dates_umich.py diff --git a/misc/iterative_closest_point.py b/robot_data_visualizer/iterative_closest_point.py similarity index 99% rename from misc/iterative_closest_point.py rename to robot_data_visualizer/iterative_closest_point.py index d76feb4..471692b 100644 --- a/misc/iterative_closest_point.py +++ b/robot_data_visualizer/iterative_closest_point.py @@ -13,11 +13,9 @@ import numpy as np import matplotlib.pyplot as plt import datetime -import sys -sys.path.append('..') import traceback -from tools.data_manager import DataManager +from .data_manager import DataManager # ICP parameters EPS = 0.0001 diff --git a/gui/robot_data_visualizer.py b/robot_data_visualizer/main_window.py similarity index 98% rename from gui/robot_data_visualizer.py rename to robot_data_visualizer/main_window.py index c8f9b47..5898775 100644 --- a/gui/robot_data_visualizer.py +++ b/robot_data_visualizer/main_window.py @@ -1,7 +1,8 @@ import os import sys -sys.path.append('.') -sys.path.append('..') +#sys.path.append('.') +#sys.path.append('..') +#sys.path.append('../..') import warnings warnings.filterwarnings("ignore") @@ -17,11 +18,11 @@ import tkinter as tk -from tools.get_dates_umich import get_dates_umich -from tools.staticmap_for_gps import map_for_gps -from tools.data_manager import DataManager -from tools.view_lidar import hokuyo_plot -from tools.view_lidar import threshold_lidar_pts +from get_dates_umich import get_dates_umich +from staticmap_for_gps import map_for_gps +from data_manager import DataManager +from view_lidar import hokuyo_plot +from view_lidar import threshold_lidar_pts class VisualizerFrame(tk.Frame): @@ -409,7 +410,6 @@ def __init__(self, parent): tk.Frame.__init__(self, parent, width=400) self.parent = parent self.root = parent - self.slam_control = None self.map_control = None self.lidar_control = None self.widgets() diff --git a/misc/plot_lidar.py b/robot_data_visualizer/plot_lidar.py similarity index 100% rename from misc/plot_lidar.py rename to robot_data_visualizer/plot_lidar.py diff --git a/tools/read_hokuyo_30m.py b/robot_data_visualizer/read_hokuyo_30m.py similarity index 100% rename from tools/read_hokuyo_30m.py rename to robot_data_visualizer/read_hokuyo_30m.py diff --git a/tools/static_map_base_layer.py b/robot_data_visualizer/static_map_base_layer.py similarity index 100% rename from tools/static_map_base_layer.py rename to robot_data_visualizer/static_map_base_layer.py diff --git a/tools/staticmap_for_gps.py b/robot_data_visualizer/staticmap_for_gps.py similarity index 95% rename from tools/staticmap_for_gps.py rename to robot_data_visualizer/staticmap_for_gps.py index 54fd019..d1c67bd 100644 --- a/tools/staticmap_for_gps.py +++ b/robot_data_visualizer/staticmap_for_gps.py @@ -1,9 +1,11 @@ '''This file is used to generate all points needed for plot in real-time.''' import os +import sys from staticmap import Line -from tools.static_map_base_layer import StaticMapBaseLayer -from tools.data_manager import DataManager +from data_manager import DataManager +sys.path.append('..') +from static_map_base_layer import StaticMapBaseLayer def generate_coordinates(data_dict): ''' diff --git a/tools/tar_extract.py b/robot_data_visualizer/tar_extract.py similarity index 100% rename from tools/tar_extract.py rename to robot_data_visualizer/tar_extract.py diff --git a/__init__.py b/robot_data_visualizer/test/__init__.py similarity index 100% rename from __init__.py rename to robot_data_visualizer/test/__init__.py diff --git a/test/run_tests.py b/robot_data_visualizer/test/run_tests.py similarity index 71% rename from test/run_tests.py rename to robot_data_visualizer/test/run_tests.py index d2fdb22..ffd8555 100644 --- a/test/run_tests.py +++ b/robot_data_visualizer/test/run_tests.py @@ -1,7 +1,7 @@ import sys import unittest -test_modules = ["test_data_loader", "test_data_manager"] +test_modules = ["test_data_manager", "test_download_tar", "test_get_dates_umich", "test_tar_extract", "test_threshold_lidar"] suite = unittest.TestSuite() diff --git a/test/test_data_manager.py b/robot_data_visualizer/test/test_data_manager.py similarity index 95% rename from test/test_data_manager.py rename to robot_data_visualizer/test/test_data_manager.py index f343fc9..912461f 100644 --- a/test/test_data_manager.py +++ b/robot_data_visualizer/test/test_data_manager.py @@ -3,7 +3,7 @@ import os sys.path.append('.') sys.path.append('..') -from tools.data_manager import DataManager +from robot_data_visualizer.data_manager import DataManager class TestDataManager(unittest.TestCase): diff --git a/robot_data_visualizer/test/test_download_tar.py b/robot_data_visualizer/test/test_download_tar.py new file mode 100644 index 0000000..cf0e436 --- /dev/null +++ b/robot_data_visualizer/test/test_download_tar.py @@ -0,0 +1,38 @@ +import unittest +import os +import sys +sys.path.append('.') +sys.path.append('..') +from robot_data_visualizer.download_tar import download_tar +from robot_data_visualizer.download_tar import ensure_data_dir_exists + +class TestDownloadTar(unittest.TestCase): + + def setUp(self): + self.data_dir_name = 'data' + self.base_name = 'http://robots.engin.umich.edu/nclt' + self.date = '2013-01-10' + self.root_path = os.path.abspath('.') + self.data_dir_root = os.path.join(self.root_path, self.data_dir_name) + self.curr_data_dir = os.path.join(self.data_dir_root, self.date) + + def test_ensure_data_dir_exists(self): + ensure_data_dir_exists() + self.assertTrue(os.path.exists(self.data_dir_root)) + + def test_download_sensor_data(self): + download_tar(self.base_name, self.date, 'sensor_data') + tmp = os.path.exists(self.curr_data_dir) + self.assertTrue(os.path.exists(self.curr_data_dir)) + + def test_download_lidar_data(self): + download_tar(self.base_name, self.date, 'hokuyo') + file_name = self.date + '_hokuyo.tar.gz' + tmp = os.path.join(self.data_dir_root, file_name) + self.assertTrue(os.path.isfile(os.path.join(self.data_dir_root, file_name))) + + def tearDown(self): + os.chdir(self.root_path) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/robot_data_visualizer/test/test_get_dates_umich.py b/robot_data_visualizer/test/test_get_dates_umich.py new file mode 100644 index 0000000..e319b75 --- /dev/null +++ b/robot_data_visualizer/test/test_get_dates_umich.py @@ -0,0 +1,20 @@ +import unittest +import sys +sys.path.append('.') +sys.path.append('..') +from robot_data_visualizer.get_dates_umich import get_dates_umich + +class TestGetDatesUmich(unittest.TestCase): + + def setUp(self): + self.dates = get_dates_umich() + + def test_returns_list(self): + self.assertTrue(type(self.dates) is list) + + def test_element_type(self): + for date in self.dates: + self.assertTrue(type(date) is str) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/robot_data_visualizer/test/test_tar_extract.py b/robot_data_visualizer/test/test_tar_extract.py new file mode 100644 index 0000000..9647148 --- /dev/null +++ b/robot_data_visualizer/test/test_tar_extract.py @@ -0,0 +1,29 @@ +import unittest +import os +import sys +sys.path.append('.') +sys.path.append('..') +sys.path.append('../..') +from robot_data_visualizer.download_tar import download_tar +from robot_data_visualizer.tar_extract import tar_extract + +class TestTarExtract(unittest.TestCase): + + def setUp(self): + self.data_dir_name = 'data' + self.base_name = 'http://robots.engin.umich.edu/nclt' + self.date = '2013-01-10' + self.root_path = os.path.abspath('.') + self.data_dir_root = os.path.join(self.root_path, self.data_dir_name) + self.curr_data_dir = os.path.join(self.data_dir_root, self.date) + + def test_tar_extract_sensor_data(self): + filename = download_tar(self.base_name, self.date, 'sensor_data') + tar_extract(filename) + self.assertTrue(not (os.listdir(self.curr_data_dir) is 0)) # directory should not be empty + + def tearDown(self): + os.chdir(self.root_path) + +if __name__ == '__main__': + unittest.main() \ No newline at end of file diff --git a/misc/test_threshold_lidar.py b/robot_data_visualizer/test/test_threshold_lidar.py similarity index 84% rename from misc/test_threshold_lidar.py rename to robot_data_visualizer/test/test_threshold_lidar.py index be38ea6..edc1abd 100644 --- a/misc/test_threshold_lidar.py +++ b/robot_data_visualizer/test/test_threshold_lidar.py @@ -1,9 +1,9 @@ import sys import unittest -import numpy as np -from threshold_lidar import threshold_lidar_pts +sys.path.append('.') sys.path.append('..') -from tools.data_manager import DataManager +from robot_data_visualizer.view_lidar import threshold_lidar_pts +from robot_data_visualizer.data_manager import DataManager class BasicTest(unittest.TestCase): """setup for unittests.""" diff --git a/misc/threshold_lidar.py b/robot_data_visualizer/threshold_lidar.py similarity index 100% rename from misc/threshold_lidar.py rename to robot_data_visualizer/threshold_lidar.py diff --git a/misc/time_convert.py b/robot_data_visualizer/time_convert.py similarity index 100% rename from misc/time_convert.py rename to robot_data_visualizer/time_convert.py diff --git a/tools/view_lidar.py b/robot_data_visualizer/view_lidar.py similarity index 100% rename from tools/view_lidar.py rename to robot_data_visualizer/view_lidar.py diff --git a/setup.py b/setup.py index 0ffe5b6..d28f7f1 100644 --- a/setup.py +++ b/setup.py @@ -2,13 +2,11 @@ from setuptools import setup, find_packages PACKAGES = find_packages() -PACKAGES.append('gui') -PACKAGES.append('misc') setup( - name = "robot-data-visualizer", - version = "0.3", - url='https://github.com/klatimer/robot-data-visualizer', + name = "robot_data_visualizer", + version = "0.4", + url='https://github.com/klatimer/robot_data_visualizer', license='MIT', packages=PACKAGES, author='Ray Adler, Ken Latimer, Hao Wu, Robin Li', diff --git a/test/test_data_loader.py b/test/test_data_loader.py deleted file mode 100644 index 844771c..0000000 --- a/test/test_data_loader.py +++ /dev/null @@ -1,26 +0,0 @@ -import unittest -import numpy as np -import sys -sys.path.append('.') -sys.path.append('..') -import tools.data_manager as DM - -class BasicTest(unittest.TestCase): - def setUp(self): - self.Datamanager = DM.DataManager('2013-01-10') - self.Datamanager.setup_data_files('sensor_data') - self.Datamanager.load_gps() - - def test_length(self): - self.assertEqual(len(self.Datamanager.data_dict['gps']['lat']), 7186) - self.assertEqual(len(self.Datamanager.data_dict['gps']['lng']), 7186) - self.assertEqual(len(self.Datamanager.data_dict['gps']['alt']), 7186) - - def test_specific_value(self): - self.assertEqual(self.Datamanager.data_dict['gps']['lat'][6552], 0.738168689900502 * 180 / np.pi) - self.assertEqual(self.Datamanager.data_dict['gps']['lng'][6552], -1.4610748478234 * 180 / np.pi) - self.assertEqual(self.Datamanager.data_dict['gps']['alt'][6552], 284.2) - -if __name__ == '__main__': - unittest.main() - diff --git a/tools/__init__.py b/tools/__init__.py deleted file mode 100644 index 4e48082..0000000 --- a/tools/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .get_dates_umich import get_dates_umich -from .view_lidar import hokuyo_plot -from .view_lidar import threshold_lidar_pts -from .static_map_base_layer import StaticMapBaseLayer -from .staticmap_for_gps import map_for_gps -from .data_loader import DataLoader -from .data_manager import DataManager -from .download_tar import download_tar -from .read_hokuyo_30m import read_hokuyo -from .tar_extract import tar_extract - -__all__ = ['DataLoader', 'DataManager', 'download_tar', 'get_dates_umich', 'map_for_gps', 'read_hokuyo', 'StaticMapBaseLayer', 'tar_extract', 'hokuyo_plot', 'threshold_lidar_pts'] \ No newline at end of file