Cainiao College:最初から最後まで独自のSLAMシステムを作成します(複製、自分でSLAMを作成するのは良いことだと思います)

転載元:https//blog.csdn.net/qq_29797957/article/details/98661883?utm_medium = distribute.pc_relevant.none-task-blog-baidujs_title-0 &spm = 1001.2101.3001.4242

Cainiao College:最初から最後まで独自のSLAMシステムを作成する

RobotSlamApplicationプロジェクト2:小さなSLAMシステム

研究の背景:以前はもっと衝動的だったので、いつも他の人のライブラリを調べてテストするのが好きです。効果が良ければ、それを使って修正や修正を行い、テストに使います。以前はシステムの作成に集中していませんでしたが、今回は最初から最後までSLAMシステムを作成しましたが、作成プロセスは非常に簡単ではなく、作成後の方がはるかに快適です。

I.はじめに

RGB-Dカメラ(構造化光深度カメラ)の長所と短所

利点:

  1. 照明が不十分でテクスチャが不足しているシーンでの使用に適しています。
  2. 一定の範囲内で高い測定精度を実現できます。
  3. 技術は成熟しており、深度画像はより高い解像度を実現できます。

短所:

  1. 基本的に屋外環境では使用できません。
  2. 測定距離は比較的近いです。
  3. 滑らかな表面からの反射の影響を受けやすいです。

第二に、カメラのポーズ推定

ORB特徴点法(この方法は多くの専門家によって議論されているため、ここでは詳しく説明しません)に基づいて、画像の異なるフレーム間の変換を取得します。これには、主に次の部分が含まれます。

1.特徴点の抽出とマッチング:

画像データをリアルタイムで取得する過程で、このリンクは画像フレームの取得に注意を払う必要があります。ここでのフレームには、現在のフレームと参照フレーム(つまり、前の瞬間の画像フレーム)が含まれます。画像のマッチングを計算するには、隣接するフレーム間の画像変換を計算するために、現時点で異なるフレームを区別する必要があります。

つまり、最初に現在のフレームが参照フレームに割り当てられ、次にカメラモーショントラッキングプロセスで、各画像のマッチングと追跡が実行された後、現在のフレームが変換されて参照フレームに割り当てられ、達成する必要があります。 「フレーム」のアップデート。

		case INITIALIZING:
	    {
			state_ = OK;
			curr_frame = ref_frame = frame;
			....
			break;
	    }
	    case OK:
	    {
			curr_frame = frame;
			....
			if ( CameraPoses is OK ... )
			{
			    curr_frame->T_c_w_ = T * ref_frame->T_c_w_; 
			    ref_frame = curr_frame;
				....
			}
			else 
			{
				.....
			}
		}

2.カメラポーズの推定。

カメラのポーズを推定する方法もたくさんあります。2d-2d(エッセンシャルマトリックスとホモグラフィマトリックスによって計算および解決)、3d-2d(PnPによって解決)、3d-3d(SVD + BAによって解決)。
これらのメソッドの中で、PnPメソッドがより一般的に使用され、PnPソリューションは比較的単純であり、OpenCVメソッドを直接呼び出すことができます。

	bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
		                          InputArray cameraMatrix, InputArray distCoeffs,
		                          OutputArray rvec, OutputArray tvec,
		                          bool useExtrinsicGuess = false, int iterationsCount = 100,
		                          float reprojectionError = 8.0, double confidence = 0.99,
		                          OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );
		                          
	bool solvePnP( InputArray objectPoints, InputArray imagePoints,
		                    InputArray cameraMatrix, InputArray distCoeffs,
		                    OutputArray rvec, OutputArray tvec,
		                    bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

以下に示すようにカメラの動きの軌跡(視覚オドメーター:VO)を取得するために、tumのテストセットをテストしました

ここに画像の説明を挿入

3、地図作成1

ビジュアルオドメトリモジュールを完了したら、次のステップはマップを作成して更新することです。時間の制約があるため、SLAMシステム全体を完了したいので、マップの最適化部分の詳細なデバッグはありません。現在のところ、 、予備地図の作成と更新のみが完了しました。最初のステップは、次のように点群マップを作成することです。

ここに画像の説明を挿入
このような地図を見るのはおかしいですか?



注意深く比較してデバッグした後、現在のフレームと参照フレームの間の変換行列がうまく対応しておらず、マップポイントの投影にエラーが発生していることがわかりました。変換行列が変更すると、次のようになります。

ここに画像の説明を挿入
それほど魅力的ではありません~~~。

第四に、地図作成2

以上の手順を経て、基本的なリアルタイムマップ更新機能は完了しましたが、マップが最適化されておらず、対応するループ検出部分も最適化されていません。それでも試してみたいオクトマップマップのリアルタイム作成。さて、考えてみたところ、次のオトマップマップができました。

ここに画像の説明を挿入
OK、小さなSLAMの書き込みテストを正常に完了しました。

五、経験

上記のシステムの作成とテストを完了すると、SLAMプロセスのすべてのリンクを明確かつ正確に把握できます。これは、SLAMを使い始めたばかりの学生にとって非常に重要です。それだけでなく、SLAMの全体的なプロセスから多くのことを学ぶことができます。次に、バックエンドの最適化の部分に焦点を当てます。ループの検出は非常に重要です。

さらに、SLAMプロセスを経た後、これらの重要な部分からSLAMのディープラーニングのアプリケーションと改善に取り組み始めました、続けてください~~

参照

[1]。デプスカメラの原理

RobotSlamApplicationプロジェクト2:小さなSLAMシステム

研究の背景:以前はもっと衝動的だったので、いつも他の人のライブラリを調べてテストするのが好きです。効果が良ければ、それを使って修正や修正を行い、テストに使います。以前はシステムの作成に集中していませんでしたが、今回は最初から最後までSLAMシステムを作成しましたが、作成プロセスは非常に簡単ではなく、作成後の方がはるかに快適です。

I.はじめに

RGB-Dカメラ(構造化光深度カメラ)の長所と短所

利点:

  1. 照明が不十分でテクスチャが不足しているシーンでの使用に適しています。
  2. 一定の範囲内で高い測定精度を実現できます。
  3. 技術は成熟しており、深度画像はより高い解像度を実現できます。

短所:

  1. 基本的に屋外環境では使用できません。
  2. 測定距離は比較的近いです。
  3. 滑らかな表面からの反射の影響を受けやすいです。

第二に、カメラのポーズ推定

ORB特徴点法(この方法は多くの専門家によって議論されているため、ここでは詳しく説明しません)に基づいて、画像の異なるフレーム間の変換を取得します。これには、主に次の部分が含まれます。

1.特徴点の抽出とマッチング:

画像データをリアルタイムで取得する過程で、このリンクは画像フレームの取得に注意を払う必要があります。ここでのフレームには、現在のフレームと参照フレーム(つまり、前の瞬間の画像フレーム)が含まれます。画像のマッチングを計算するには、隣接するフレーム間の画像変換を計算するために、現時点で異なるフレームを区別する必要があります。

つまり、最初に現在のフレームが参照フレームに割り当てられ、次にカメラモーショントラッキングプロセスで、各画像のマッチングと追跡が実行された後、現在のフレームが変換されて参照フレームに割り当てられ、達成する必要があります。 「フレーム」のアップデート。

		case INITIALIZING:
	    {
			state_ = OK;
			curr_frame = ref_frame = frame;
			....
			break;
	    }
	    case OK:
	    {
			curr_frame = frame;
			....
			if ( CameraPoses is OK ... )
			{
			    curr_frame->T_c_w_ = T * ref_frame->T_c_w_; 
			    ref_frame = curr_frame;
				....
			}
			else 
			{
				.....
			}
		}

2.カメラポーズの推定。

カメラのポーズを推定する方法もたくさんあります。2d-2d(エッセンシャルマトリックスとホモグラフィマトリックスによって計算および解決)、3d-2d(PnPによって解決)、3d-3d(SVD + BAによって解決)。
これらのメソッドの中で、PnPメソッドがより一般的に使用され、PnPソリューションは比較的単純であり、OpenCVメソッドを直接呼び出すことができます。

	bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,
		                          InputArray cameraMatrix, InputArray distCoeffs,
		                          OutputArray rvec, OutputArray tvec,
		                          bool useExtrinsicGuess = false, int iterationsCount = 100,
		                          float reprojectionError = 8.0, double confidence = 0.99,
		                          OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );
		                          
	bool solvePnP( InputArray objectPoints, InputArray imagePoints,
		                    InputArray cameraMatrix, InputArray distCoeffs,
		                    OutputArray rvec, OutputArray tvec,
		                    bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

以下に示すようにカメラの動きの軌跡(視覚オドメーター:VO)を取得するために、tumのテストセットをテストしました

ここに画像の説明を挿入

3、地図作成1

ビジュアルオドメトリモジュールを完了したら、次のステップはマップを作成して更新することです。時間の制約があるため、SLAMシステム全体を完了したいので、マップの最適化部分の詳細なデバッグはありません。現在のところ、 、予備地図の作成と更新のみが完了しました。最初のステップは、次のように点群マップを作成することです。

ここに画像の説明を挿入
このような地図を見るのはおかしいですか?



注意深く比較してデバッグした後、現在のフレームと参照フレームの間の変換行列がうまく対応しておらず、マップポイントの投影にエラーが発生していることがわかりました。変換行列が変更すると、次のようになります。

ここに画像の説明を挿入
それほど魅力的ではありません~~~。

第四に、地図作成2

以上の手順を経て、基本的なリアルタイムマップ更新機能は完了しましたが、マップが最適化されておらず、対応するループ検出部分も最適化されていません。それでも試してみたいオクトマップマップのリアルタイム作成。さて、考えてみたところ、次のオトマップマップができました。

ここに画像の説明を挿入
OK、小さなSLAMの書き込みテストを正常に完了しました。

五、経験

上記のシステムの作成とテストを完了すると、SLAMプロセスのすべてのリンクを明確かつ正確に把握できます。これは、SLAMを使い始めたばかりの学生にとって非常に重要です。それだけでなく、SLAMの全体的なプロセスから多くのことを学ぶことができます。次に、バックエンドの最適化の部分に焦点を当てます。ループの検出は非常に重要です。

さらに、SLAMプロセスを経た後、これらの重要な部分からSLAMのディープラーニングのアプリケーションと改善に取り組み始めました、続けてください~~

参照

[1]。デプスカメラの原理

おすすめ

転載: blog.csdn.net/sinat_16643223/article/details/115258072