Moved matlab to experimental
parent
078f07650f
commit
e9804afc07
|
@ -1,85 +0,0 @@
|
|||
% Script to perform SQP on a simple example from the SQP tutorial
|
||||
% This makes use of LDL solving of a full quadratic programming
|
||||
% problem
|
||||
%
|
||||
% Problem:
|
||||
% min(x) f(x) = (x2-2)^2 - x1^2
|
||||
% s.t. c(x) = 4x1^2 + x2^2 - 1 =0
|
||||
% state is x = [x1 x2]' , with dim(state) = 2
|
||||
% constraint has dim p = 1
|
||||
|
||||
n = 2;
|
||||
p = 1;
|
||||
|
||||
% initial conditions
|
||||
x0 = [2; 4];
|
||||
lam0 = -0.5;
|
||||
x = x0; lam = lam0;
|
||||
|
||||
maxIt = 100;
|
||||
|
||||
X = x0; Lam = lam0;
|
||||
Bi = eye(2);
|
||||
|
||||
for i=1:maxIt
|
||||
i
|
||||
x1 = x(1); x2 = x(2);
|
||||
|
||||
% evaluate functions
|
||||
fx = (x2-2)^2 + x1^2;
|
||||
cx = 4*x1^2 + x2^2 - 1;
|
||||
|
||||
% evaluate derivatives in x
|
||||
dfx = [2*x1; 2*(x2-2)];
|
||||
dcx = [8*x1; 2*x2];
|
||||
dL = dfx - lam * dcx;
|
||||
|
||||
% update the hessian (BFGS) - note: this does not use the full lagrangian
|
||||
if (i>1)
|
||||
Bis = Bi*s;
|
||||
y = dfx - prev_dfx;
|
||||
Bi = Bi + (y*y')/(y'*s) - (Bis*Bis')/(s'*Bis);
|
||||
end
|
||||
prev_dfx = dfx;
|
||||
|
||||
% evaluate hessians in x
|
||||
ddfx = diag([2, 2]);
|
||||
ddcx = diag([8, 2]);
|
||||
|
||||
% construct and solve CQP subproblem
|
||||
Bgn0 = dfx * dfx';
|
||||
Bgn1 = dfx * dfx' - lam * dcx * dcx'; % GN approx 1
|
||||
Bgn2 = dL * dL'; % GN approx 2
|
||||
Ba = ddfx - lam * ddcx; % analytic hessians
|
||||
|
||||
B = Bi;
|
||||
g = dfx;
|
||||
h = -cx;
|
||||
[delta lambda] = solveCQP(B, -dcx, -dcx', g, h);
|
||||
|
||||
% update
|
||||
s = 0.1*delta;
|
||||
x = x + s
|
||||
lam = lambda
|
||||
|
||||
|
||||
% save
|
||||
X = [X x];
|
||||
Lam = [Lam lam];
|
||||
|
||||
end
|
||||
|
||||
% verify
|
||||
xstar = [0; 1];
|
||||
lamstar = -1;
|
||||
display(fx)
|
||||
display(cx)
|
||||
final_error = norm(x-xstar) + norm(lam-lamstar)
|
||||
|
||||
% draw
|
||||
figure(1);
|
||||
clf;
|
||||
ezcontour('(x2-2)^2 + x1^2');
|
||||
hold on;
|
||||
ezplot('4*x1^2 + x2^2 - 1');
|
||||
plot(X(1,:), X(2,:), 'r*-');
|
|
@ -1,59 +0,0 @@
|
|||
% Set up a small SLAM example
|
||||
% Christian Potthast, Frank Dellaert
|
||||
|
||||
clear;
|
||||
close all;
|
||||
|
||||
n = 100;
|
||||
m = 20;
|
||||
|
||||
% have the robot move in this world
|
||||
trajectory = random_walk([0.1,0.1],5,m);
|
||||
plot(trajectory(1,:),trajectory(2,:),'b+');
|
||||
axis([0 100 0 100]);axis square;
|
||||
|
||||
% Set up the map
|
||||
mappingArea=max(trajectory,[],2);
|
||||
map = create_random_landmarks(n, mappingArea);
|
||||
figure(1);clf;
|
||||
plot(map(1,:), map(2,:),'g.'); hold on;
|
||||
axis([0 mappingArea(1) 0 mappingArea(2)]);axis square;
|
||||
|
||||
% Check visibility and plot this on the problem figure
|
||||
visibility = create_visibility(map, trajectory,20);
|
||||
gplot(visibility,[map trajectory]');
|
||||
|
||||
% simulate the measurements
|
||||
measurement_sigma = 1;
|
||||
odo_sigma = 0.1;
|
||||
[measurements, odometry] = simulate_measurements(map, trajectory, visibility, measurement_sigma, odo_sigma);
|
||||
|
||||
% create a configuration of all zeroes
|
||||
config = create_config(n,m);
|
||||
|
||||
% create the factor graph
|
||||
factorGraph = create_gaussian_factor_graph(config, measurements, odometry, measurement_sigma, odo_sigma, n);
|
||||
|
||||
% create an ordering
|
||||
ord = create_ordering(n,m);
|
||||
|
||||
% show the matrix
|
||||
figure(2); clf;
|
||||
ijs = factorGraph.sparse(ord);
|
||||
A=sparse(ijs(1,:),ijs(2,:),ijs(3,:));
|
||||
spy(A);
|
||||
|
||||
% optimizing a BayesNet is not possible from MATLAB as
|
||||
% GaussianBayesNet is a typedef not a real class :-(
|
||||
% BayesNet = factorGraph.eliminate_(ord);
|
||||
% optimal = BayesNet.optimize;
|
||||
|
||||
% However, we can call the optimize_ method of a GaussianFactorGraph
|
||||
optimal = factorGraph.optimize_(ord);
|
||||
|
||||
% plot the solution
|
||||
figure(3);clf;
|
||||
plot_config(optimal,n,m);hold on
|
||||
plot(trajectory(1,:),trajectory(2,:),'b+');
|
||||
plot(map(1,:), map(2,:),'g.');
|
||||
axis([0 mappingArea(1) 0 mappingArea(2)]);axis square;
|
|
@ -1,15 +0,0 @@
|
|||
% Christian Potthast
|
||||
% create a configuration
|
||||
|
||||
function config = create_config(n,m)
|
||||
|
||||
config = Simulated2DConfig();
|
||||
origin = Point2;
|
||||
|
||||
for i = 1:m
|
||||
config.insertPose(i, origin);
|
||||
end
|
||||
|
||||
for j = 1:n
|
||||
config.insertPoint(j, origin);
|
||||
end
|
|
@ -1,46 +0,0 @@
|
|||
% Christan Potthast
|
||||
% create linear factor graph
|
||||
|
||||
function lfg = create_gaussian_factor_graph(config, measurements, odometry, measurement_sigma, odo_sigma, n)
|
||||
|
||||
m = size(measurements,2);
|
||||
|
||||
% create linear factor graph
|
||||
lfg = GaussianFactorGraph();
|
||||
|
||||
% Point2 at origin
|
||||
origin = Point2;
|
||||
|
||||
% create prior for initial robot pose
|
||||
model0_2 = SharedDiagonal([0.2;0.2]);
|
||||
prior = Simulated2DPosePrior(origin,model0_2,1);
|
||||
lf = prior.linearize(config);
|
||||
lfg.push_back(lf);
|
||||
|
||||
% add prior for landmarks
|
||||
model1000 = SharedDiagonal([1000;1000]);
|
||||
for j = 1:n
|
||||
prior = Simulated2DPointPrior(origin,model1000,j);
|
||||
lf = prior.linearize(config);
|
||||
lfg.push_back(lf);
|
||||
end
|
||||
|
||||
% add odometry factors
|
||||
odo_model = SharedDiagonal([odo_sigma;odo_sigma]);
|
||||
for i = 2 : size(odometry,2)
|
||||
odo = Point2(odometry{i}(1),odometry{i}(2));
|
||||
nlf = Simulated2DOdometry(odo, odo_model, i-1, i);
|
||||
lf = nlf.linearize(config);
|
||||
lfg.push_back(lf);
|
||||
end
|
||||
|
||||
% add measurement factors
|
||||
measurement_model = SharedDiagonal([measurement_sigma;measurement_sigma]);
|
||||
for k = 1 : size(measurements,2)
|
||||
measurement = measurements{k};
|
||||
point = Point2(measurement.z(1),measurement.z(2));
|
||||
nlf = Simulated2DMeasurement(point, measurement_model, measurement.i, measurement.j);
|
||||
lf = nlf.linearize(config);
|
||||
lfg.push_back(lf);
|
||||
end
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
% Christian Potthast
|
||||
% create an elimination ordering
|
||||
|
||||
function ord = create_good_ordering(n,m,measurements)
|
||||
|
||||
ord = Ordering();
|
||||
j=1;
|
||||
pose=1;
|
||||
mes=size(measurements,2);
|
||||
while (pose<=m)&&(j<=mes)
|
||||
ord.push_back(sprintf('x%d',pose));
|
||||
while (j<n)&&(measurements{j}.i==pose)
|
||||
ord.push_back(sprintf('l%d',j));
|
||||
j=j+1;
|
||||
end
|
||||
pose=pose+1;
|
||||
end
|
|
@ -1,16 +0,0 @@
|
|||
% Christian Potthast
|
||||
% Create a map with random landmarks
|
||||
|
||||
function map = create_random_landmarks(visibilityTh, mappingArea, steps)
|
||||
map=[];
|
||||
points1=1:visibilityTh:mappingArea(1);
|
||||
points2=1:visibilityTh:mappingArea(2);
|
||||
for i=1:size(points1,2)
|
||||
map=[map,[points1(1,i)-steps;points2(1,i)],[points1(1,i);points2(1,i)-steps]];
|
||||
end
|
||||
|
||||
% for i=1:size(points1,2)
|
||||
% for j=1:size(points2,2)
|
||||
% map=[map,[points1(1,i);points2(1,j)]];
|
||||
% end
|
||||
% end
|
|
@ -1,14 +0,0 @@
|
|||
% Christian Potthast
|
||||
% create an elimination ordering
|
||||
|
||||
function ord = create_ordering(n,m)
|
||||
|
||||
ord = Ordering();
|
||||
|
||||
for j = 1:n
|
||||
ord.push_back(sprintf('l%d',j));
|
||||
end
|
||||
|
||||
for i = 1:m
|
||||
ord.push_back(sprintf('x%d',i));
|
||||
end
|
|
@ -1,8 +0,0 @@
|
|||
% Christian Potthast
|
||||
% Create a map with random landmarks
|
||||
|
||||
function map = create_random_landmarks(numberOfLandmarks, mappingArea)
|
||||
|
||||
points = rand(2,numberOfLandmarks);
|
||||
|
||||
map=[points(1,:)*mappingArea(1);points(2,:)*mappingArea(2)];
|
|
@ -1,20 +0,0 @@
|
|||
% Christian Potthast
|
||||
% create visibility matrix
|
||||
|
||||
function V = create_visibility(map,pose,threshold)
|
||||
|
||||
n = size(map,2);
|
||||
m = size(pose,2);
|
||||
V = sparse([],[],[],n+m,n+m);
|
||||
|
||||
for t = 1:m
|
||||
% find measurements within Manhattan range
|
||||
js = find(2==sum(abs(map-pose(:,t)*ones(1,n))<[threshold;threshold]*ones(1,n)));
|
||||
for j = js
|
||||
V(j,t+n)=1;
|
||||
end
|
||||
% add in odometry links
|
||||
if t>1
|
||||
V((t+n)-1,t+n)=1;
|
||||
end
|
||||
end
|
|
@ -1,19 +0,0 @@
|
|||
% Christian Potthast
|
||||
% plot a configuration
|
||||
|
||||
function plot_config(config,n,m)
|
||||
|
||||
hold on;
|
||||
|
||||
for j = 1:n
|
||||
key = sprintf('l%d',j);
|
||||
mj = config.get(key);
|
||||
plot(mj(1), mj(2),'r*');
|
||||
end
|
||||
|
||||
for i = 1:m
|
||||
key = sprintf('x%d',i);
|
||||
xi = config.get(key);
|
||||
plot(xi(1), xi(2),'rx');
|
||||
end
|
||||
|
|
@ -1,20 +0,0 @@
|
|||
% Christian Potthast
|
||||
% random walk from a robot
|
||||
|
||||
function pose = random_walk(initial, velocity, steps)
|
||||
|
||||
pose(:,1) = initial;
|
||||
bearing = 1;
|
||||
|
||||
|
||||
for step = 2:steps
|
||||
|
||||
bearing = bearing + 0.05*randn();
|
||||
|
||||
pose(1,step) = pose(1,step-1) + sin(bearing) * velocity;
|
||||
pose(2,step) = pose(2,step-1) + cos(bearing) * velocity;
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
|
@ -1,23 +0,0 @@
|
|||
% Christian Potthast
|
||||
% simulate measurements
|
||||
|
||||
function [measurements,odometry] = simulate_measurements(map, pose, visibility, noise_sigma, odo_sigma)
|
||||
m = size(pose,2);
|
||||
n = size(map,2);
|
||||
measurements = {};
|
||||
odometry = {};
|
||||
k =1;
|
||||
for i = 1:m
|
||||
js = find(visibility(1:n,i+n));
|
||||
if size(js ,1) > 0
|
||||
for j = js'
|
||||
z = map(:,j)-pose(:,i)+randn(2,1)*noise_sigma;
|
||||
measurement = struct('z',z,'i',i,'j',j);
|
||||
measurements{k}=measurement;
|
||||
k = k+1;
|
||||
end
|
||||
end
|
||||
if i>1
|
||||
odometry{i}= pose(:,i)-pose(:,i-1)+randn(2,1)*odo_sigma;
|
||||
end
|
||||
end
|
|
@ -1,16 +0,0 @@
|
|||
function [delta lambda] = solveCQP(B, A, At, g, h)
|
||||
|
||||
n = size(B,1);
|
||||
p = size(A,2);
|
||||
|
||||
% form the KKT matrix system
|
||||
G = [B A; At zeros(p,p)];
|
||||
rhs = -[g; h];
|
||||
|
||||
% solve with LDL
|
||||
[L D] = ldl(G);
|
||||
approx_error = norm(G - L*D*L'); %% verify error
|
||||
sol = L'\(D\(L\rhs));
|
||||
|
||||
delta = sol(1:n);
|
||||
lambda = sol(n+1:size(sol));
|
|
@ -1,16 +0,0 @@
|
|||
% Test example for simple Constrained Quadratic Programming problem
|
||||
|
||||
A = [-1 -1;
|
||||
-2 1;
|
||||
1 -1];
|
||||
At = A';
|
||||
B = 2*eye(3,3);
|
||||
|
||||
b = [4; -2];
|
||||
g = zeros(3,1);
|
||||
|
||||
[delta lambda] = solveCQP(B, A, At, g, b);
|
||||
|
||||
expX = [2/7 10/7 -6/7]';
|
||||
|
||||
state_error = norm(expX-delta)
|
|
@ -1,20 +0,0 @@
|
|||
% Christian Potthast
|
||||
% random walk from a robot
|
||||
|
||||
function pose = walk(initial, velocity, steps)
|
||||
|
||||
pose(:,1) = initial;
|
||||
bearing = 0.7854; % 45?
|
||||
|
||||
|
||||
for step = 2:steps
|
||||
|
||||
%bearing = bearing + 0.05;
|
||||
|
||||
pose(1,step) = pose(1,step-1) + sin(bearing) * velocity;
|
||||
pose(2,step) = pose(2,step-1) + cos(bearing) * velocity;
|
||||
|
||||
end
|
||||
|
||||
|
||||
|
|
@ -1,14 +0,0 @@
|
|||
% Matlab code to test gtsam toolbox
|
||||
%
|
||||
%
|
||||
%
|
||||
%
|
||||
clc;
|
||||
disp(' ');
|
||||
disp(' Matlab scripts to test GTSAM toolbox ');
|
||||
disp(' ');
|
||||
|
||||
path(path,genpath(pwd));
|
||||
toolboxpath = '~/toolbox/gtsam'
|
||||
addpath(toolboxpath);
|
||||
|
|
@ -1,5 +0,0 @@
|
|||
function CHECK(name,assertion)
|
||||
|
||||
if (assertion~=1)
|
||||
error(['CHECK ' name ' fails']);
|
||||
end
|
|
@ -1,5 +0,0 @@
|
|||
function DOUBLES_EQUAL(expected,actual,atol)
|
||||
|
||||
if abs(expected-actual)>atol
|
||||
error(sprintf('DOUBLES_EQUAL fails: expected %g but got %g',expected,actual));
|
||||
end
|
|
@ -1,30 +0,0 @@
|
|||
% create a linear factor graph
|
||||
% The non-linear graph above evaluated at NoisyConfig
|
||||
function fg = createGaussianFactorGraph()
|
||||
|
||||
c = createNoisyConfig();
|
||||
|
||||
% Create
|
||||
fg = GaussianFactorGraph;
|
||||
|
||||
% Create shared Noise model
|
||||
unit2 = SharedDiagonal([1;1]);
|
||||
|
||||
% prior on x1
|
||||
I=eye(2);
|
||||
f1 = GaussianFactor('x1', 10*I, [-1;-1], unit2);
|
||||
fg.push_back(f1);
|
||||
|
||||
% odometry between x1 and x2
|
||||
f2 = GaussianFactor('x1', -10*I, 'x2', 10*I, [2;-1], unit2);
|
||||
fg.push_back(f2);
|
||||
|
||||
% measurement between x1 and l1
|
||||
f3 = GaussianFactor('x1', -5*I, 'l1', 5*I, [0;1], unit2);
|
||||
fg.push_back(f3);
|
||||
|
||||
% measurement between x2 and l1
|
||||
f4 = GaussianFactor('x2', -5*I, 'l1', 5*I, [-1;1.5], unit2);
|
||||
fg.push_back(f4);
|
||||
|
||||
end
|
|
@ -1,10 +0,0 @@
|
|||
% A noise configuration
|
||||
function c = createNoisyConfig()
|
||||
v_x1 = [0.1; 0.1];
|
||||
v_x2 = [1.4; 0.2];
|
||||
v_l1 = [0.1; -1.1];
|
||||
c = VectorConfig();
|
||||
c.insert('x1', v_x1);
|
||||
c.insert('x2', v_x2);
|
||||
c.insert('l1', v_l1);
|
||||
end
|
|
@ -1,10 +0,0 @@
|
|||
% A zero delta configuration
|
||||
function c = createZeroDelta()
|
||||
v_x1 = [0; 0];
|
||||
v_x2 = [0; 0];
|
||||
v_l1 = [0; 0];
|
||||
c = VectorValues();
|
||||
c.insert('x1', v_x1);
|
||||
c.insert('x2', v_x2);
|
||||
c.insert('l1', v_l1);
|
||||
end
|
|
@ -1,4 +0,0 @@
|
|||
% run all matlab unit tests
|
||||
testGaussianFactor
|
||||
testConditionalGaussian
|
||||
testGaussianFactorGraph
|
|
@ -1,70 +0,0 @@
|
|||
%-----------------------------------------------------------------------
|
||||
% eliminate
|
||||
|
||||
% the combined linear factor
|
||||
Ax2 = [
|
||||
-5., 0.
|
||||
+0.,-5.
|
||||
10., 0.
|
||||
+0.,10.
|
||||
];
|
||||
|
||||
Al1 = [
|
||||
5., 0.
|
||||
0., 5.
|
||||
0., 0.
|
||||
0., 0.
|
||||
];
|
||||
|
||||
Ax1 = [
|
||||
0.00, 0. % f4
|
||||
0.00, 0. % f4
|
||||
-10., 0. % f2
|
||||
0.00,-10. % f2
|
||||
];
|
||||
|
||||
% the RHS
|
||||
b2=[-1;1.5;2;-1];
|
||||
model4 = SharedDiagonal([1;1;1;1]);
|
||||
combined = GaussianFactor('x2', Ax2, 'l1', Al1, 'x1', Ax1, b2, model4);
|
||||
|
||||
% eliminate the combined factor
|
||||
[actualCG,actualLF] = combined.eliminate('x2');
|
||||
|
||||
% create expected Conditional Gaussian
|
||||
R11 = [
|
||||
11.1803, 0.00
|
||||
0.00, 11.1803
|
||||
];
|
||||
S12 = [
|
||||
-2.23607, 0.00
|
||||
+0.00,-2.23607
|
||||
];
|
||||
S13 = [
|
||||
-8.94427, 0.00
|
||||
+0.00,-8.94427
|
||||
];
|
||||
d=[2.23607;-1.56525];
|
||||
expectedCG = GaussianConditional('x2',d,R11,'l1',S12,'x1',S13,[1;1]);
|
||||
|
||||
% the expected linear factor
|
||||
Bl1 = [
|
||||
4.47214, 0.00
|
||||
0.00, 4.47214
|
||||
];
|
||||
|
||||
Bx1 = [
|
||||
% x1
|
||||
-4.47214, 0.00
|
||||
+0.00, -4.47214
|
||||
];
|
||||
|
||||
% the RHS
|
||||
b1= [0.0;0.894427];
|
||||
|
||||
model2 = SharedDiagonal([1;1]);
|
||||
expectedLF = GaussianFactor('l1', Bl1, 'x1', Bx1, b1, model2);
|
||||
|
||||
% check if the result matches
|
||||
CHECK('actualCG.equals(expectedCG,1e-5)',actualCG.equals(expectedCG,1e-4));
|
||||
CHECK('actualLF.equals(expectedLF,1e-5)',actualLF.equals(expectedLF,1e-4));
|
|
@ -1,62 +0,0 @@
|
|||
%-----------------------------------------------------------------------
|
||||
% equals
|
||||
fg = createGaussianFactorGraph();
|
||||
fg2 = createGaussianFactorGraph();
|
||||
CHECK('equals',fg.equals(fg2,1e-9));
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
% error
|
||||
zero = createZeroDelta();
|
||||
actual = fg.error(zero);
|
||||
DOUBLES_EQUAL( 5.625, actual, 1e-9 );
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
% eliminate_x1
|
||||
fg = createGaussianFactorGraph();
|
||||
actual = fg.eliminateOne('x1');
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
% eliminate_x2
|
||||
fg = createGaussianFactorGraph();
|
||||
actual = fg.eliminateOne('x2');
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
% eliminateAll
|
||||
I = eye(2);
|
||||
cg1 = GaussianConditional('x1',[-1;-1], 10*I,[1;1]);
|
||||
|
||||
sig1=0.149071;
|
||||
d2=[0; .2]/sig1;
|
||||
cg2 = GaussianConditional('l1', d2, I/sig1, 'x1', -I/sig1, [1;1]);
|
||||
|
||||
sig2 = 0.0894427;
|
||||
A21 = -0.2*I/sig2;
|
||||
A22 = -0.8*I/sig2;
|
||||
d3 =[.2; -.14]/sig2;
|
||||
cg3 = GaussianConditional('x2',d3, I/sig2, 'l1', A21, 'x1', A22, [1;1]);
|
||||
|
||||
expected = GaussianBayesNet;
|
||||
expected.push_back(cg3);
|
||||
expected.push_back(cg2);
|
||||
expected.push_back(cg1);
|
||||
|
||||
% Check one ordering
|
||||
fg1 = createGaussianFactorGraph();
|
||||
ord1 = Ordering;
|
||||
ord1.push_back('x2');
|
||||
ord1.push_back('l1');
|
||||
ord1.push_back('x1');
|
||||
actual1 = fg1.eliminate_(ord1);
|
||||
CHECK('eliminateAll', actual1.equals(expected,1e-5));
|
||||
|
||||
%-----------------------------------------------------------------------
|
||||
% matrix
|
||||
|
||||
fg = createGaussianFactorGraph();
|
||||
ord = Ordering;
|
||||
ord.push_back('x1');
|
||||
ord.push_back('x2');
|
||||
ord.push_back('l1');
|
||||
|
||||
[H,z] = fg.matrix(ord);
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
% test linearize Pose2Factor
|
||||
cov = [ 0.25, 0, 0; 0, 0.25, 0; 0, 0, 0.01];
|
||||
key1='x1';
|
||||
key2='x2';
|
||||
measured=Pose2(2,2, pi/2);
|
||||
measured.print('Pose');
|
||||
factor=Pose2Factor(key1,key2,measured, cov);
|
||||
factor.print('Factor');
|
||||
|
||||
|
||||
% test linearize Pose2Graph
|
||||
|
||||
p1=Pose2(1.1,2,pi/2); % robot at (1.1,2) looking towards y (ground truth is at 1,2, see testPose2)
|
||||
p2=Pose2(-1,4.1,pi); % robot at (-1,4) looking at negative (ground truth is at 4.1,2)
|
||||
config= Pose2Config() ;
|
||||
config.insert('x1',p1);
|
||||
config.insert('x2',p2);
|
||||
|
||||
lf = factor.linearize(config);
|
||||
lf.print('lf ');
|
||||
|
||||
factors = Pose2Graph;
|
||||
factors.push_back(factor);
|
||||
|
||||
lfg=factors.linearize_(config);
|
||||
lfg.print('lfg');
|
|
@ -1,76 +0,0 @@
|
|||
% Set up a small SLAM example in MATLAB to test the execution time
|
||||
|
||||
clear;
|
||||
clf;
|
||||
%Parameters
|
||||
noRuns=100;
|
||||
steps=1;
|
||||
m = 5;
|
||||
velocity=1;
|
||||
time_qr=[];
|
||||
time_gtsam=[];
|
||||
for steps=1:noRuns
|
||||
|
||||
%figure(1);clf;
|
||||
% robot moves in the world
|
||||
trajectory = walk([0.1,0.1],velocity,m);
|
||||
mappingArea=max(trajectory,[],2);
|
||||
%plot(trajectory(1,:),trajectory(2,:),'b+'); hold on;
|
||||
|
||||
visibilityTh=sqrt(mappingArea(1)^2+mappingArea(2)^2)/m; %distance between poses
|
||||
% Set up the map
|
||||
map = create_landmarks(visibilityTh, mappingArea,steps);
|
||||
%plot(map(1,:), map(2,:),'g.');
|
||||
%axis([0 mappingArea(1) 0 mappingArea(2)]); axis square;
|
||||
n=size(map,1)*size(map,2);
|
||||
% Check visibility and plot this on the problem figure
|
||||
visibilityTh=visibilityTh+steps;
|
||||
visibility = create_visibility(map, trajectory,visibilityTh);
|
||||
%gplot(visibility,[map trajectory]');
|
||||
|
||||
steps
|
||||
% simulate the measurements
|
||||
measurement_sigma = 1;
|
||||
odo_sigma = 0.1;
|
||||
[measurements, odometry] = simulate_measurements(map, trajectory, visibility, measurement_sigma, odo_sigma);
|
||||
|
||||
|
||||
% create a configuration of all zeroes
|
||||
config = create_config(n,m);
|
||||
|
||||
% create the factor graph
|
||||
gaussianFactorGraph = create_gaussian_factor_graph(config, measurements, odometry, measurement_sigma, odo_sigma, n);
|
||||
%
|
||||
% create an ordering
|
||||
ord = create_ordering(n,m);
|
||||
|
||||
ijs = gaussianFactorGraph.sparse(ord);
|
||||
A=sparse(ijs(1,:),ijs(2,:),ijs(3,:));
|
||||
|
||||
|
||||
runs=50; % for each graph run QR and elimination several times and average the time
|
||||
|
||||
ck_qr=cputime;
|
||||
for it=1:runs
|
||||
R_qr = qr(A);
|
||||
end
|
||||
time_qr=[time_qr,(cputime-ck_qr)/runs];
|
||||
|
||||
% eliminate with that ordering
|
||||
%time gt_sam
|
||||
for it=1:runs+1
|
||||
if it==2
|
||||
ck_gt=cputime;
|
||||
end
|
||||
BayesNet = gaussianFactorGraph.eliminate_(ord);
|
||||
end
|
||||
time_gtsam=[time_gtsam,(cputime-ck_gt)/runs];
|
||||
|
||||
clear trajectory visibility gaussianFactorGraph measurements odometry;
|
||||
m = m+5;
|
||||
velocity=velocity+1;
|
||||
steps=steps+1;
|
||||
end
|
||||
plot(time_qr,'r');hold on;
|
||||
plot(time_gtsam,'b');
|
||||
|
|
@ -1,112 +0,0 @@
|
|||
% Set up a small SLAM example in MATLAB to test the execution time
|
||||
|
||||
clear;
|
||||
|
||||
%Parameters
|
||||
|
||||
noRuns=5;
|
||||
steps=50;
|
||||
m = 5*steps;
|
||||
velocity=1*steps;
|
||||
time_qr=[];
|
||||
time_gtsam=[];
|
||||
% for steps=1:noRuns
|
||||
%
|
||||
figure(1);clf;
|
||||
% robot moves in the world
|
||||
trajectory = walk([0.1,0.1],velocity,m);
|
||||
mappingArea=max(trajectory,[],2);
|
||||
plot(trajectory(1,:),trajectory(2,:),'b+'); hold on;
|
||||
|
||||
visibilityTh=sqrt(mappingArea(1)^2+mappingArea(2)^2)/m; %distance between poses
|
||||
% Set up the map
|
||||
map = create_landmarks(visibilityTh, mappingArea,steps);
|
||||
plot(map(1,:), map(2,:),'g.');
|
||||
axis([0 mappingArea(1) 0 mappingArea(2)]); axis square;
|
||||
n=size(map,2);
|
||||
% Check visibility and plot this on the problem figure
|
||||
visibilityTh=visibilityTh+steps;
|
||||
visibility = create_visibility(map, trajectory,visibilityTh);
|
||||
gplot(visibility,[map trajectory]');
|
||||
|
||||
|
||||
% simulate the measurements
|
||||
measurement_sigma = 1;
|
||||
odo_sigma = 0.1;
|
||||
[measurements, odometry] = simulate_measurements(map, trajectory, visibility, measurement_sigma, odo_sigma);
|
||||
|
||||
|
||||
% % create a configuration of all zeroes
|
||||
config = create_config(n,m);
|
||||
|
||||
% create the factor graph
|
||||
gaussianFactorGraph = create_linear_factor_graph(config, measurements, odometry, measurement_sigma, odo_sigma, n);
|
||||
%
|
||||
% create an ordering
|
||||
%ord = create_good_ordering(n,m,measurements);
|
||||
ord = create_ordering(n,m);
|
||||
% show the matrix
|
||||
% figure(3); clf;
|
||||
%[A_dense,b] = gaussianFactorGraph.matrix(ord);
|
||||
%A=sparse(A_dense);
|
||||
|
||||
%sparse matrix !!!
|
||||
ijs = gaussianFactorGraph.sparse(ord);
|
||||
A=sparse(ijs(1,:),ijs(2,:),ijs(3,:));
|
||||
%spy(A);
|
||||
%time qr
|
||||
runs=1;
|
||||
|
||||
ck_qr=cputime;
|
||||
for i=1:runs
|
||||
R_qr = qr(A);
|
||||
end
|
||||
time_qr=(cputime-ck_qr)/runs
|
||||
%time_qr=[time_qr,(cputime-ck)];
|
||||
|
||||
%figure(2)
|
||||
%clf
|
||||
%spy(R_qr);
|
||||
|
||||
% eliminate with that ordering
|
||||
%time gt_sam
|
||||
% for i=1:runs+10
|
||||
% if i==11
|
||||
% ck_gt=cputime;
|
||||
% end
|
||||
% BayesNet = gaussianFactorGraph.eliminate(ord);
|
||||
% end
|
||||
ck_gt=cputime;
|
||||
for i=1:runs+10
|
||||
BayesNet = gaussianFactorGraph.eliminate_(ord);
|
||||
end
|
||||
time_gtsam=(cputime-ck_gt)/runs
|
||||
%time_gtsam=[time_gtsam,(cputime-ck)];
|
||||
|
||||
% clear trajectory visibility gaussianFactorGraph measurements odometry;
|
||||
% m = m+5;
|
||||
% velocity=velocity+1;
|
||||
|
||||
% end
|
||||
% %time_qr=time_qr/noRuns
|
||||
% plot(time_qr,'r');hold on;
|
||||
% plot(time_gtsam,'b');
|
||||
|
||||
|
||||
|
||||
|
||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||
% % show the eliminated matrix
|
||||
% figure(4); clf;
|
||||
% [R,d] = BayesNet.matrix();
|
||||
% spy(R);
|
||||
%
|
||||
% % optimize in the BayesNet
|
||||
% optimal = BayesNet.optimize;
|
||||
%
|
||||
% % plot the solution
|
||||
% figure(5);clf;
|
||||
% plot_config(optimal,n,m);hold on
|
||||
% plot(trajectory(1,:),trajectory(2,:),'b+');
|
||||
% plot(map(1,:), map(2,:),'g.');
|
||||
% axis([0 10 0 10]);axis square;
|
|
@ -1,23 +0,0 @@
|
|||
dataSet = 'intel';
|
||||
saveFiles = 0;
|
||||
maxID = 0;
|
||||
dim = 3;
|
||||
|
||||
[vertices,edges]=loadDataSet(dataSet,saveFiles);
|
||||
[vert, ed]=cut2maxID(maxID, vertices, edges);
|
||||
|
||||
p0 = vert(1,2:end)';
|
||||
s0 = diag([ed(1,6),ed(1,8),ed(1,9)]);
|
||||
|
||||
fprintf('Initial config...');
|
||||
config=InitialConfig(ed,dim,p0);
|
||||
|
||||
fprintf('graph2FactorGraph...');
|
||||
[A,b]=graph2FactorGraph(config,ed,dim,s0);
|
||||
|
||||
tic
|
||||
for trial=1:100
|
||||
fprintf('Trial %d\n', trial);
|
||||
x = spqr_solve(A,b);
|
||||
end
|
||||
toc
|
Loading…
Reference in New Issue