feat(slam): add rtabmap_ros
This commit is contained in:
@@ -0,0 +1,69 @@
|
||||
function [CS DU] = updateCommonSignature(Mem, Dict)
|
||||
%UPDATECOMMONSIGNATURE Update the common signature (virtual place)
|
||||
% [CS DU] = updateCommonSignature(Mem, Dict)
|
||||
%
|
||||
% CS = common signature
|
||||
% DU dictionary updated
|
||||
% Mem : the memory (Mem = [signId1 WordRefIds...; signId2 WordRefIds...; ...])
|
||||
% Dict : the visual words dictionary (Dict = [wordId1 SignRefIds...; wordId2 SignRefIds...; ...])
|
||||
|
||||
CS = Mem(1,:);
|
||||
CSid = Mem(1,1);
|
||||
|
||||
% Clear references to the virtual place
|
||||
for i=2:length(CS)
|
||||
index = find(Dict(:,1) == CS(i));
|
||||
if isempty(index) ~= 1
|
||||
indexes = find(Dict(index, :) == CSid);
|
||||
for j=1:length(indexes)
|
||||
Dict(index,indexes(j)) = 0;
|
||||
end
|
||||
end
|
||||
end
|
||||
%clear words in the common signature
|
||||
CS = CS(1);
|
||||
|
||||
%How many words we want... take the average of words by signature
|
||||
nbCommonWords = 0;
|
||||
memSize = size(Mem,1)-1; %Don't count the virtual place
|
||||
if(memSize > 0)
|
||||
totalActiveRef = sum(sum(Dict(:,2:end) ~= 0));
|
||||
nbCommonWords = floor(totalActiveRef / memSize);
|
||||
end
|
||||
if nbCommonWords>0
|
||||
%get common words
|
||||
list = [(sum(Dict(:,2:end)' ~= 0)') Dict(:,1)];
|
||||
list = sortrows(list)
|
||||
wordsAdded=0;
|
||||
for i=size(list,1):-1:1
|
||||
if i ~= size(list,1) && length(CS)>1
|
||||
ratio = floor(list(i+1,1)/list(i,1));
|
||||
len = length(CS);
|
||||
for j=2:ratio
|
||||
for k=2:len
|
||||
CS = [CS CS(k)];
|
||||
wordsAdded = wordsAdded + 1;
|
||||
if wordsAdded >= nbCommonWords
|
||||
break;
|
||||
end
|
||||
end
|
||||
if wordsAdded >= nbCommonWords
|
||||
break;
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
if wordsAdded < nbCommonWords
|
||||
CS = [CS list(i,2)];
|
||||
wordsAdded = wordsAdded + 1;
|
||||
end
|
||||
if wordsAdded >= nbCommonWords
|
||||
break;
|
||||
end
|
||||
end
|
||||
CS = [CS zeros(1,size(Mem,2) - length(CS))];
|
||||
% add references
|
||||
DU = updateDictionary(Dict, CS);
|
||||
else
|
||||
DU = Dict;
|
||||
end
|
||||
Reference in New Issue
Block a user