-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathrs_visual_odometry.m
69 lines (48 loc) · 2.13 KB
/
rs_visual_odometry.m
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
function [vtrans, vrot] = rs_visual_odometry(raw_image)
% [vtrans, vrot] = rs_visual_odometry(raw_image)
% Copyright (C) 2008 David Ball (d.ball@uq.edu.au) (MATLAB version)
% Michael Milford (m.milford1@uq.edu.au) & Gordon Wyeth (g.wyeth@uq.edu.au)
%
% This program is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program. If not, see <http://www.gnu.org/licenses/>.
global prev_vrot_image_x_sums;
global prev_vtrans_image_x_sums;
global IMAGE_ODO_X_RANGE;
global IMAGE_VTRANS_Y_RANGE;
global IMAGE_VROT_Y_RANGE;
global VTRANS_SCALE;
global VISUAL_ODO_SHIFT_MATCH;
% FOV_DEG = 50;
FOV_DEG =58;
dpp = FOV_DEG / size(raw_image, 2);
% vtrans
sub_image = raw_image(IMAGE_VTRANS_Y_RANGE, IMAGE_ODO_X_RANGE);
image_x_sums = sum(sub_image);
avint = sum(image_x_sums) / size(image_x_sums, 2);
image_x_sums = image_x_sums/avint;
[minoffset, mindiff] = rs_compare_segments(image_x_sums, prev_vtrans_image_x_sums, VISUAL_ODO_SHIFT_MATCH, size(image_x_sums, 2));
vtrans = mindiff * VTRANS_SCALE;
% a hack to detect excessively large vtrans
if vtrans > 3
vtrans = 0;
end
prev_vtrans_image_x_sums = image_x_sums;
% now do rotation
sub_image = raw_image(IMAGE_VROT_Y_RANGE, IMAGE_ODO_X_RANGE);
image_x_sums = sum(sub_image);
avint = sum(image_x_sums) / size(image_x_sums, 2);
image_x_sums = image_x_sums/avint;
[minoffset, mindiff] = rs_compare_segments(image_x_sums, prev_vrot_image_x_sums, VISUAL_ODO_SHIFT_MATCH, size(image_x_sums, 2)); %#ok<NASGU>
vrot = minoffset * dpp * pi / 180;
prev_vrot_image_x_sums = image_x_sums;
end