~julian-ryde/mrol/main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
Ordered in approx priority, by delegation. 

Julian
	Improve execution speed
		: Many many possible ways of doing this, some ideas
		Cython
			: General way of speeding up tight loops
		Multisets
			: Look into multisets for occupiedvoxel lists, e.g. 
			: collections.Counter in python 2.7?
			: These multisets seem like the way to go as they provide intersection 
			: and union operations.  Could start by trying some benchmark code 
			: that runs under python2.7
		Bloom filter
			: with counts to support deletions
		MinHash
			http://en.wikipedia.org/wiki/MinHash
			http://blogs.msdn.com/b/spt/archive/2008/06/10/set-similarity-and-min-hash.aspx
		Parrallel execution - e.g. for match, ray tracing etc.
			speed increase is only linear in number of available cores (plus some overhead)
			multiprocessing is now in python as standard
		Allow for pre-allocation of working memory region in calccollisions
			: Have a output array cache, so if requests to occupiedlist are 
			: made with input arrays the same shape you can just use the already 
			: created output array?
			:
			: Better way might be to copy how numpy does things and have 
			: calccolision take an option argument out, which is preallocated by 
			: the user and populated. by the function.
			:
			: Usually the same number of points are repeatedly transformed, so 
			: an array to hold the transformed points/voxel could be 
			: preallocated and reused.  However might not know in advance the 
			: poses to tested.
	Add cython compile to a compile/make script
	Accelerated nearest neighbour lookup
		: Good for doing icp without needing flann
		: Good for testing
		:
		: found how to bulk load keys and values into a python dictionary
		: d = {}
		: d.update(zip(K, V))
		: Only the last of multiple values in V with the same key (K) are
		: kept
Nick
	Get a good 3D data set with the kinect, including multi-level.
		: Data needs to be in IR sensor frame NOT RGB otherwise ray-traces remove the RH edge of discontinuities
	Get temporal decay mapping up and running
	pointcloud test
		: PointCloud should probably have a saveload test, make points, save 
		: them and load them back in and check equality.
		: Also directory loading
	Make sure all poses are being passed around as Pose3D objects rather than 6 element arrays
		: calccollisions should really take a pose
	Integrate the trajectory stuff via a map maintenance interface
		: Need a means to remove points when we realise they aren't correct.
		: To allow for external SLAM solutions also.
	move boxfilter to pointcloud class?
	Implement interprocess communication with memmapped arrays?
		: A = memmap('/tmp/test.bin', dtype=uint8, mode='w+', shape=(10,10))
		: Although Julian is not entirely sure this is the correct way to 
		: do it.
	
Both / Unallocated
	Decide on public API, PARAMOUNT
		: mapper.py
		: API should NOT be a window into the underlying classes, e.g. 
		: MROL/occupied list
		: The tests will only test the public API.  In order to make 
		: refactoring in the future easier the public API should be ruthlessly 
		: kept to a minimum.  Currently the public api is defined through 
		: mapper.py.
		: Internal white box unit tests are not advised, Julian will not maintain 
		: them and they will inevitable break when Julian refactors mercilessly.
		:
		: The public api will drive and focus development.
	Provide users with option which map update mechanism to use
		: This is useful for comparisons without having to switch revisions and 
		: apply patches to bugs. Also, the simple mechanism may be faster and 
		: useful where speed is of prime importance.
			: Simple additive map update
			: KDE based
			: Others?
	Add from __future__ import division to every file
		: can still do integer division with //
	The return_removed flag for removepoints in occupied list is a bit hacky
		: Feel like the proper way of doing it would be to combine the point 
		: cloud, the map and the sensor model to generate the list maybe, not 
		: sure need to think about this.
	Thorough test for the global localiser
		: Take a map and scan, transform by random poses and check that it 
		: successfully aligns.
	Run pylint on commited code
		: Very long lines can be especially awkward and also are less 
		: readable.  Consider using assigment to improve readability.
	Use enumerate rather than range(len(...
	Copyright and licensing headers
		: before public hosting!
	Checkout scipy.spatial
		: classes such as scipy.spatial.KDTree etc.
	Organise project according
		http://infinitemonkeycorps.net/docs/pph/
	Fix/Add profiling script
		: profiling of mapper to guide optimization efforts
		: Also profiling test in align_segment_test.py
	speed test always fails on Nick's computers (k-d tree)
	refactor the tests into components that are clearer/better
	Relate the code to sparse ndimensional arrays
		: https://launchpad.net/ndsparse
	Improve performance
		: Possibly using cython, see http://wiki.cython.org/tutorials/numpy
	bug/issue tracker?
		: should we use a bug tracker? Julian thinks it is unnecessary to 
		: begin with, might be useful later though.

Never-ending
	Remove unused functions
		: Either write a script to search for def and look for calls or use 
		: code coverage analysis to see which parts of code are not executed 
		: by tests? 
		: Also ack-grep them. The code base isn't too big yet.
	TODOs in code
	Lint/style checking
		: remove unused imports, sfood-checker
		: Use a lint/style checker
		: pylint/pychecker output