Visual SLAMについての知識はまださほどない状態です.
こちらのサイト(https://qiita.com/tohruk/items/43667dbd327c3d3a5b95)にORB-SLAMを用いて動画からカメラ軌跡と点群マップの推定を行うMATLABの例が紹介されており,ひとまず実行してみたのですがいくつかエラーが出てしまい,順に解決していったものの,下記の箇所が解決できずにいる状態です.
関数 'range' の呼び出し内に、不足している引数または正しくない引数データ型がないかを確認してください。
エラー: helperCheckLoopClosure (line 53)
range(loopKeyFrameIds(1:minNumCandidates)) <= maxRange
エラー: vs (line 316)
[isDetected, validLoopCandidates] = helperCheckLoopClosure(vSetKeyFrames, currKeyFrameId, ...

3 commentaires

Kenta
Kenta le 14 Août 2020
こんにちは、補助関数helpeerCheckLoopClosureでエラーを返していますね。ひとまずエラー文を見ながらどの行でエラーがでているか、そしてどのようなコードかを調べて見てはいかがでしょうか。
normalize関数が入っている気がするのでしょうがどうですか?また調べてみて、その状況を教えていただけると幸いです。
ST
ST le 15 Août 2020
ご回答ありがとうございます.
Kentaさんが仰る通り,補助関数helpeerCheckLoopClosureでエラーを返しています.
補助関数helpeerCheckLoopClosureの中身とエラーの位置は以下の通りです.
エラーは少しわかりにくいのですが,下から7行目の箇所です.
こういった場合,補助関数の方に問題があるのでしょうか.
もしくは,掲載されていた方に修正が必要なのでしょうか.
一度に多くの質問をしてしまい,すみません.
function [isDetected, loopKeyFrameIds] = helperCheckLoopClosure(vSetKeyFrames, ...
currKeyframeId, imageDatabase, currImg, imageDatabaseViewIds)
%helperCheckLoopClosure detect loop candidates key frames by retrieving
% visually similar images from the feature database.
%
% This is an example helper function that is subject to change or removal
% in future releases.
% Copyright 2019 The MathWorks, Inc.
% Retrieve all the visually similar key frames
[candidateIds, similarityscores] = retrieveImages(currImg, imageDatabase);
% Compute similarity between the current key frame and its strongly-connected
% key frames. The minimum similarity score is used as a baseline to find
% loop candidate key frames, which are visually similar to but not connected
% to the current key frame
covisViews = connectedViews(vSetKeyFrames, currKeyframeId);
covisViewsIds = covisViews.ViewId;
isStrong = helperSelectStrongConnections(vSetKeyFrames.Connections, ...
covisViewsIds, currKeyframeId, 50);
strongCovisViewIds = covisViewsIds(isStrong);
[~, viewIds] = intersect(imageDatabaseViewIds, strongCovisViewIds, 'stable');
% Retrieve the top 10 similar connected key frames
[~,~,scores] = evaluateImageRetrieval(currImg, imageDatabase, viewIds, 'NumResults', 10);
minScore = min(scores);
% Convert from ImageID in ImageDatabase to ViewId in imageviewset
candidateViewIds = imageDatabaseViewIds(candidateIds);
[loopKeyFrameIds,ia] = setdiff(candidateViewIds, covisViewsIds, 'stable');
% Scores of non-connected key frames
candidateScores = similarityscores(ia); % Descending
if ~isempty(ia)
bestScore = candidateScores(1);
% Score must be higher than the 75% of the best score
isValid = candidateScores > max(bestScore*0.75, minScore);
loopKeyFrameIds = loopKeyFrameIds(isValid);
else
loopKeyFrameIds = [];
end
% Loop candidates need to be consecutively detected
minNumCandidates = 3; % At least 3 candidates are found
maxRange = 10;
if size(loopKeyFrameIds,1) >= minNumCandidates && ...
range(loopKeyFrameIds(1:minNumCandidates)) <= maxRange %%%%%%%この行でエラーが発生%%%%%%%
loopKeyFrameIds = loopKeyFrameIds(1:minNumCandidates);
isDetected = true;
else
isDetected = false;
end
end
Kenta
Kenta le 15 Août 2020
Modifié(e) : Kenta le 15 Août 2020
こんにちは、詳細を教えていただき、ありがとうございます。
「こういった場合,補助関数の方に問題があるのでしょうか.
もしくは,掲載されていた方に修正が必要なのでしょうか.」
とのことですが、掲載されてた方のバージョンや環境では正しく動いていて、そこでは正しくコーディングなどがされていたのだと思います。
ただ、この例は複雑なので、今はどこかで予期せぬエラーが起きているのだと思います。
こちらのドキュメントがお試しになっている例の公式なページと思うのですが、こちらをお試しになりましたか?もしかしたらこちらでやってみるとうまくいくかもしれません。

Connectez-vous pour commenter.

 Réponse acceptée

Kenta
Kenta le 15 Août 2020

0 votes

KOUさん、コメントのほうありがとうございます。
こちらにある質問文中のURLの記事の作者様のファイルをそのまま保存し、実行してみてください。
コメントのほうで私が「normalize関数が入っている気がするのでしょうが」と言ってしまったのですが、
range関数の間違いです、失礼しました。range関数のエラーはもしかしたらstatistics and machine learning toolboxが
入っていないからではないでしょうか?もしそれが入っておらず、かつ手軽にインストールできる状態であればアドオンから入れてみてください。もし、ない場合はnormalize関数などで書き換えることができます。
また、normalizeを使わずとも今回の用法であれば自分で書くこともできます。
ひとまず、statistics and machine learning toolboxが手軽に入手可能な環境にあれば、そちらで試していただけると幸いです。

4 commentaires

ST
ST le 17 Août 2020
Kentaさん,コメントありがとうございます.
アドバイスを元に色々と試した結果が以下の通りです.
【実行できたパターン】
・補助関数helpeerCheckLoopClosureのrangeの箇所を書き換える→エラーなし
・ダウンロードしたデータファイルに問題があるかもしれないと思い,一度ファイルを削除して再ダウンロード(補助関数helpeerCheckLoopClosureのrangeの箇所を書き換えない元の状態で)→エラーなし
【実行できなかったパターン】
・補助関数helpeerCheckLoopClosureのrangeの箇所を書き換えない元の状態で,statistics and machine learning toolboxをインストールした状態で実行→エラー発生
関数 'range' の呼び出し内に、不足している引数または正しくない引数データ型がないかを確認してください。
と同じエラーが発生してしまいました.
・URLの記事の作者様のファイル(https://raw.githubusercontent.com/mathworks/MATLAB-IPCV-Eval-Kit-JP/master/demo_files/I4_09_7_ORB_SLAM.m)のもので実行→エラー発生
--------------------------------------------------------------------------------------------------------------------------------------------------
一通りエラーは出ることなく実行できるようになりました,ありがとうございます.
ただ,結果が掲載されているものと大きくずれてしまっているため,そこは原因がわからないです.
Kenta
Kenta le 17 Août 2020
丁寧なご報告ありがとうございます。 ひとまず、一歩進んだようでよかったです。ちなみに私の場合は想定した通りの綺麗な結果が出ています。 ちなみにnormalizeで書き換えた場合は、’range’と指定していますか?なにもないと平均0で標準偏差1の正規化をしてしまいます。
一度ファイルを削除して再ダウンロードしたときですが、一部のファイルはその前と同じコードを使っているので、書き換えたrange関数を再び再利用している、という可能性はないですかね?いま手元で動かせないので間違ってるかもしれませんが、その場合はダウンロードし直してもその前と同じ結果を返すと思います。
他に考えられることはバージョンですが、最新のものをお使いですか?または2020bのプレリリースを使ったり、matlabオンラインを使うとうまく動くかもしれません。range関数で私も以前は2020aで予期せぬエラーを返したことがあります。
ST
ST le 17 Août 2020
何度もコメントいただきありがとうございます.
わからないことだらけで,一度に多くのことをお尋ねしてしまいすみません.
私の認識があっているのか不安なのですが,
range(loopKeyFrameIds(1:minNumCandidates)) <= maxRange
は、loopKeyFrameIds(1)とloopKeyFrameIds(minNumCandidates)の範囲(値の大きさの違い)ということで大丈夫でしょうか.
normalizeでの書き換えがわからなかったため
(loopKeyFrameIds(minNumCandidates)-loopKeyFrameIds(1)) <= maxRange
としてしまったのですが…
再ダウンロードの箇所ですが,書き換えた場合と再ダウンロードした場合での結果が異なっていました.
もう一度こちらの(https://qiita.com/tohruk/items/43667dbd327c3d3a5b95)ものをペーストして実行したところ,先ほどの結果よりもかなり良いものが出ました.
(とても近い結果にはなったのですが,同じにはなっておりません…)
こちらのサイトのものではrng(123)となっていますが,私はrng(114)で最も近い結果が出ました.
やはりバージョンや環境によるものなのでしょうか.
以下が現在のバージョンです.
MATLAB バージョン: 9.8.0.1417392 (R2020a) Update 4
オペレーティング システム: Mac OS X Version: 10.15.6 Build: 19G73
Java バージョン: Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
Kenta
Kenta le 18 Août 2020
こんにちは、
range(loopKeyFrameIds(1:minNumCandidates)) <= maxRange
は、loopKeyFrameIds(1)とloopKeyFrameIds(minNumCandidates)の範囲(値の大きさの違い)ということで大丈夫でしょうか.」
少し違っていそうです。まずは、rangeの方法を調べてみてはいかがでしょう。おそらくこの部分がちがうため結果があわないのだと思います。まずは、簡単な値で、normalizeを使って、rangeと同様の正規化ができるように練習してみて、それができてからここに反映してはいかがでしょうか。

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Marine and Underwater Vehicles dans Centre d'aide et File Exchange

Question posée :

ST
le 12 Août 2020

Commenté :

le 18 Août 2020

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!