KINECTを使用してモバイル自律ロボットのマップを改善するにはどうすればよいですか


9

私の狙いの背景

私は、未知の領域の周りをナビゲートし、障害物を回避し、さまざまなタスクを実行するために音声入力を受信する必要がある移動自律ロボットを構築しています。また、顔やオブジェクトなども認識しなければなりません。Kinectセンサーとホイールオドメトリデータをセンサーとして使用しています。公式ドライバーとSDKがすぐに利用できるので、私はC#を主要言語として選択しました。ビジョンとNLPモジュールを完了し、ナビゲーション部分に取り組んでいます。

私のロボットは現在、Arduinoを通信用のモジュールとして使用し、ラップトップ上のIntel i7 x64ビットプロセッサをCPUとして使用しています。

これはロボットとその電子機器の概要です:

ロボットの概要 ロボットのエレクトロニクス


問題

エンコーダーからロボットの位置を取得するシンプルなSLAMアルゴリズムを実装し、Kinectを使用して(3D点群の2Dスライスとして)見えるものをマップに追加します。

これは私の部屋の地図が現在どのように見えるかです:

私の部屋の地図はどのように見えるか 私の部屋の別の地図

これは私の実際の部屋の大まかな表現です:

ここに画像の説明を入力してください

ご覧のとおり、それらは非常に異なり、非常に悪いマップです。

  • これは推測航法だけを使用することから予想されますか?
  • 私はそれを洗練して実装する準備ができている粒子フィルターを知っていますが、この結果を改善する方法は何ですか?

更新

私の現在のアプローチについて言及するのを忘れていました(以前は忘れていました)。私のプログラムは大まかにこれを行います:(私は動的テーブルを格納するためにハッシュテーブルを使用しています)

  • Kinectから点群を取得
  • シリアルオドメトリデータの受信を待つ
  • タイムスタンプベースの方法を使用して同期する
  • ウィキペディアの方程式とエンコーダーデータを使用してロボットのポーズ(x、y、theta)を推定する
  • 点群の「スライス」を取得する
  • 私のスライスは基本的にXおよびZパラメータの配列です
  • 次に、ロボットのポーズとXおよびZパラメータに基づいてこれらのポイントをプロットします
  • 繰り返す

回答:


1

これは予想されることですか?原則としてはい。オドメトリモデルを改善できる場合もありますが、一般的には、適切なマップを取得するには不十分です。システムの説明がないと、システムを改善する方法を説明するのは困難です。ほとんどのシステムでは、回転推定よりも平行移動推定の方が優れています。ジャイロを追加して回転を測定できます。これにより、結果が大幅に改善されます。

パーティクルフィルターを自分で実装する代わりに、たとえばopenslamからのSLAM実装を使用できます。これにより多くの時間を節約でき、より良い結果が得られるでしょう。


期待されている:Dと言って気分を良くしてくれますが、オドメトリが非常に優れていると確信しています(特に私の回転:D)。システムを簡単に説明するアップデートを追加しました(それで十分でない場合は、コードやその他の情報を提供できます)。明日はジャイロを使ってみて、結果を更新します。openslamのアルゴリズムを使用したいのですが、公式のSDKを使用できるようにC#を使用しており、そのようなタスクのほとんどのライブラリはC ++で提供されているか、ROS(linuxのみ)で提供されています。私は確かにそれらを使用したいのですが、私は鋭く見えません!
Shreyas Kapur 2013年

tinyslamは200行のcコードを使用すると主張しています。私はそれをc#に移植することはそれほど難しいことではないと思います。
ヤコブ

うわー!しかし、私はそれが粒子フィルターを使用しておらず、私がしているのと同じことをしていると思います。しかし、私はきっとそれを実装しようとするでしょう。
どうも

1

パーティクルフィルター/ EKFを試すことをお勧めします。

あなたが現在していること:

->推測航法:現在の位置を参照せずに見ています。

->継続的なローカリゼーション:地図のどこにいるかがおおまかにわかります。

参照がなく、マップ上のどこにいるかわからない場合、どのようなアクションをとっても、完全なマップを取得するのは難しいでしょう。

例:円形の部屋にいるとします。あなたは前進し続けます。あなたはあなたの最後の動きが何であったか知っています。あなたが得る地図は、構造のようなまっすぐな箱の地図になります。これは、ローカライズする方法や、マップ上の正確な位置を継続的に知る方法がない限り、継続的に発生します。

ローカリゼーションは、開始基準点がある場合、EKF /粒子フィルターを介して行うことができます。ただし、開始基準点は必須です。


答えをありがとう、確かに非常に素晴らしい例です。確かにEKFを使用しますが、問題は私が数学が得意ではないが、あまり得意ではなく、C#を使用しているため、ライブラリがなく、実装していないことです。私自身は年齢を取ります。それについて何か提案はありますか?
Shreyas Kapur 2013年

理解できずデバッグできないものを作るよりも、数学を復習していくつかのコースを受講する方がはるかに良いでしょう。それを学び、それを実装してください。将来的には間違いなく役に立ちます。
Naresh 2013年

また、githubでC#実装を探します。その作品は見た目よりも人気があります。
Naresh

提案をありがとう、きっと明日やります。私は数学を学ぶために最善を尽くしており、それを実行することを望んでおり、それが長い道のりになると確信しています。私はここでの学習のボトルネックである13歳です。私たちは学校のマトリックスさえも紹介されていません!:-(
Shreyas Kapur

私はあなたが13歳であることを知っています:)インターネットは気にしません。カーンアカデミーからマトリックスを入手できます。確率と統計も同様です。
ナレシュ2013年

1

推測航法を使用しているため、ロボットの姿勢を推定する際のエラーは時間とともに蓄積されます。私の経験から、しばらくすると、推測航法のポーズ推定は役に立たなくなります。ジャイロスコープや加速度計などの追加のセンサーを使用すると、姿勢推定が向上しますが、ある時点でフィードバックがないため、以前と同様に発散します。その結果、Kinectからの適切なデータがある場合でも、ポーズの推定が無効であるため、正確なマップを構築することは困難です。

マップを構築する(SLAM!)と同時に、ロボットをローカライズする必要があります。そのため、マップが作成されている間、同じマップを使用してロボットをローカライズします。これにより、ポーズ推定が発散せず、マップの品質が向上します。したがって、いくつかのSLAMアルゴリズム(FastSLAMなど)を調べて、独自のバージョンを実装することをお勧めします。


ご回答有難うございます :-)。推測航法は間違っていると思いますが、私が作成した地図は非常に小さな縮尺でした。エラーをできるだけ少なくするためにロボットをゆっくりとゆっくりと動かしましたが、ロボットはあまり動きませんでした。私は実際にopenslamから多くのSLAMアルゴリズムを研究していますが、Nareshに言ったように、「私は数学は得意ではありませんが、あまり得意ではありません。C#を使用しているため、ライブラリも実装もしていません。私自身は年をとるでしょう。」それについて何か提案はありますか?
Shreyas Kapur 2013年

Kinectデータで後処理を行いますか?データにノイズが含まれている可能性があります。データを未処理のままにすると、マップが無効になる可能性があります。問題を単純にするようにしてください。ロボットを静止させ、その前方の壁をマッピングします。それは今どのように機能しますか?地図がはっきりしている場合は、移動のために問題が発生したことを意味します。そうでない場合、問題はより根本的なものです。
Demetris 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.