読者です 読者をやめる 読者になる 読者になる

今後のやること メモ

ブログというよりメモ帳代わりのエントリ.今後のTODO整理用.

ピッチ角推定の精度を上げる.

vDisparity からの直線抽出の精度を上げる.

取得した画像に対して,SIFT特徴量を試してみる.

SIFT特徴量でタグ付けして,検索できるようにする.
別の日時に撮影した画像に対して計算したSIFT特徴量で,前の画像を検索できるか試す.

Map座標系とOdometry座標系を紐付ける練習

特定の色のターゲットに向かってロボットを進ませるようにする.
特定の色(白)のラインをトレースするようにする.

ステレオのデータを路面に投影し2Dにして,rvizで可視化する.

ステレオのデータを路面に投影し2Dにして,マップを作る.

ステレオからGrid Mapを作成するために,Laser Scan に変換して gmapping に入力してみる.

Mapを作成するときに,生のOdometryだと誤差が乗るため,SFMとBAが使えるかどうか試してみる.

走行可能エリアを色識別

画像に強めのフィルタをかける.
HSV変換して,色毎に分ける.

走行可能エリアを直線変換をして見つける.

画像に強めのフィルタをかける.
元の画像を膨張・縮小処理してハフ変換する.
ハフ変換する?

VOを作ってみる.

FindEssentialMatを使って,GW取得データでVOを作る.
VOで関連付けたカメラ座標をバンドル調整で最適化する.

SFMで環境地図を作るアプローチが可能かどうか確認する.

PIRFを調べてみる.

rosbag record の HDD 記録が遅い理由を調査する.

Disparity を取得して,一定の面積あたりの分散を見てみる.

元の画素をLBP変換してみたらどうなる?

画像撮影時に,路面がはっきりと出る露光時間でシャッターを切る.

ブログを読んで,SLAM・SFMの違いを見る.

Map作成にSIFT特徴量を使うときに,HUEが一定のレンジにあるもののみを使って,花・葉っぱの影響を取り除けるか?

OpenCV 3.0のAPIに一通り目を通す.

Doneしたこと.

ステレオの結果を可視化するモジュールを作成.Done

ホワイトバランス調整モジュールを作成.Done

GW の成果

おはようございます.前回のアップからちょっと時間が空いてしまいました...
長かったはずの GW も残念ながら終わってしまい,社会復帰中です・・・・.
GW の成果と今後の TODO を洗い出すためにエントリを残しておきます.

GWの成果

 まず,GWの成果ですが,時間をかけた割には予定していたことの半分もできませんでした.完了したこととしては,

ステレオの視差画像から,ピッチ角を推定するロジックを作成し,ROSノード化.

 ピッチ角推定に関しては,以前から作成していた vDisparity のロジックを使いました.ただ,鳥瞰図変換に関しては角度の推定誤差に対する鳥瞰図の見え方変化が大きすぎて,ピッチ角推定結果を使って鳥瞰図を作成するのが少しむずかしいかもしれません.

原画                   鳥瞰図変換後
f:id:rkoichi2001:20170511061125p:plain f:id:rkoichi2001:20170511061301p:plain

SWEEPの台車取り付けのための部品作成.

 こちらに関しては,,,,前から欲しかったのですが買ってしまいました...3Dプリンタ.割と安いやつ(でないと買えないので...)を選んだのですが,これめちゃめちゃ便利です.今まではちょっとした取付具等も「ホームセンターに買いに行く」「DIY用品で時間をかけて加工」という繰り返しだったのですが,これなら一瞬である程度正確に部品ができます.

購入した3Dプリンタ

SWEEP取り付け後の台車
f:id:rkoichi2001:20170511064611j:plain

SWEEPと作成した取り付け器具(スキャナ搭載位置高くね?というつっこみはなしでお願いします..)
f:id:rkoichi2001:20170511064615j:plain

SWEEPの ROS Wrapper を作成し,ノード化.

 SWEEPのWrapperに関しては,Scanseから提供されている下記をベースに必要な変更を入れ込みました.
github.com

ZED Stereo Camera と SWEEP を使って大清水公園でデータ取得.

スタート地点
f:id:rkoichi2001:20170509060855j:plain

ゴール地点
f:id:rkoichi2001:20170509062411j:plain

オドメトリ計測結果
オドメトリに関しては,大清水公園一周程度なら耐えられる時もあるのですが,やはりヨー角誤差が徐々に増えていってしまいなかなか厳しいです.
f:id:rkoichi2001:20170509062123p:plain

 期待の新アイテムSWEEPですが,レンジが思っていたよりもはるかに短く,LIDAR による環境地図の作成がうまくいきませんでした....

scanse.io

 一応うたい文句としては,屋外使用想定で 40m のレンジを実現と書いてあったのですが,屋外で実験してみたところコンクリートの壁で検知距離 5m 程度でした...反射率による違いは確かにあるとしても,検知距離 5m は誤算です...一応,このレーザースキャナで gmapping による環境地図を生成して自律走行させる予定だったのですが,計画変更です...

www.hokuyo-aut.co.jp

北陽電機のレンジが広いセンサーを購入すべきかどうか悩んだのですが,価格が50万前後することもあり,あきらめました.ということで,図らずも画像だけで粘るしかなさそうです...ということで,やっぱりいろいろと予定変更を余儀なくされますね...次のエントリでやることをもう一回整理します.

4月後半と GW の目標・マイルストーン

ついに来週から GW に突入です.自分の予定はと言いますと,,,特段旅行に行くわけでもなく,ロボットと向かいあう事になるかと思います.昨年の経験からすると, GW とお盆休みが受験ならぬつくばチャレンジの天王山になるはずなので,なんとか追い込んで頑張ります.で,以前のエントリにも書きましたが,もう一度 GW 中にやることを反芻します.

とりあえず,直近の目標としては,

試走会一回目(7/8)で確認走行完了する!

です.これを必達目標として考えたときに,4月・5月・6月のマイルストーンを考えると...

4月 足回りの完成と Teb Local Planner を使った軌道生成・追従

  • Teb Local Plannerのコード読み・理解.Done
  • 低速域の制御とオドメトリ精度の向上のために,エンコーダの付け替え.Done
  • オドメトリフレーム内でのロボットの制御.Done
  • Zed Stereo Camera の使い方勉強.Done
  • Zed Stereo Camera の ROS ノード作成.
  • 地図生成用台車(以降,Mapper) への Zed Stereo Camera の取り付け.
  • Sweep Lidar の使い方勉強.
  • Sweep Lidar の ROS ノード作成.
  • Mapper への Sweep Lidar の取り付け.

5月 レーザースキャナ・ステレオカメラを用いた環境地図の作成

  • gmapping のコード読み・理解.
  • gmapping を用いて環境地図が生成できるようにする.
  • 清水公園に mapper を持っていき,Stereo と Lidar のデータ取得.(マップ作成用,自己位置推定用)
  • 取得データから大清水公園の環境地図作成.
  • ステレオカメラの depth 情報を scan に変換し,地図作成に使えないかどうか検討する.

6月 限定区間・静的環境での自律走行トライ

  • amcl のコード読み・理解.
  • 5月取得のデータを用いて,amclを実行.
  • スキャナ・カメラをロボットに搭載し,自律走行トライ.

ひとまず,5月頭に大清水公園で実験データを取得することも目標に,下記のアイテムを重点的に取り組みます.

  • Zed Stereo Camera の ROS ノード作成.
  • 地図生成用台車(以降,Mapper) への Zed Stereo Camera の取り付け.
  • Sweep Lidar の使い方勉強.
  • Sweep Lidar の ROS ノード作成.
  • Mapper への Sweep Lidar の取り付け.
  • gmapping のコード読み・理解.
  • gmapping を用いて環境地図が生成できるようにする.

ということで,Zed Stereo Camera の ROS ノード作成に取り掛かります!

Zed Stereo Camera 事始め2

前回のエントリからの続きです.前回のエントリまでで,とりあえずサンプルコードが動くところまではできたので,今回はいよいよサンプルコードを実行します.

提供されているサンプルコード一覧

  • ZED_Camera_Control : カメラの制御変数変更や簡単な動作確認.
  • ZED_Positional_Tracking : カメラの位置トラッキング
  • ZED_SVO_Recording : ステレオを用いた Visual Odometry
  • ZED_Depth_Sensing : 視差マップ生成
  • ZED_Spatial_Mapping : 空間マッピング
  • ZED_with_OpenCV : OpenCV を用いた画像の表示

ということで,視差マップの生成をまず試してみました.

原画
f:id:rkoichi2001:20170422130903p:plain

視差マップ
f:id:rkoichi2001:20170422130922p:plain

うーん.撮影している風景が近距離すぎるのか,思ったほどでもないような...OpenCVの SGBM とそんなに大きく変わらないような気もします.
実際に外で撮影してどのくらい綺麗に Depth が取れるかどうかが大事なのでもう少しいじってみます.いずれにしても,同期レベルの高い2つのフレームを取得
できるようになったことは進歩かと思います.

Zed Stereo Camera 事始め1

ということで,足回りの目処が立ったので Zed Stereo Camera の環境構築にとりかかります.

ZED Stereo Camera

Stereo Camera に付属している SDK に視差マップを生成してくれるソフトが付いているのですが,どうやらこれが NVIDIAGPU がないと動かないみたいで...
ロボットにつけている Intel NUC には GPU がついてないので,どうしようかな....と思ってます.ひとまず, NVIDIAGPU が付いているノートパソコンに環境を作って動かすことにしました.

1.ZED SDK のダウンロード

 まず, ZED の SDK を下記リンクからダウンロードします.
ZED SDK 1.2 - Developer Center

2.ZED SDK のインストール

$ ./ZED_SDK_Linux_Ubuntu16_v2.0.0.run

3.Cuda8.0 のダウンロード

developer.nvidia.com

4.Cuda8.0 のインストール

 下記ドキュメントの必要なとこだけ拾っていけば,割とすんなりとインストールできました.
docs.nvidia.com

5.OpenCV3.1 のビルド・インストール

 最後, OpenCV3.1 のダウンロードとインストールです.ROSとの兼ね合いもあるので,個別の OpenCV のシステムディスクへのインストールは避けたく,ローカルに適当なインストールフォルダを作ってそこに共有ライブラリのパスを設定します.

OpenCV のダウンロード,3.1.0へのブランチ切り替え,opencv_contribのダウンロード
$ git clone https://github.com/opencv/opencv.git opencv-3.1.0
$ git checkout 3.1.0
$ git clone https://github.com/opencv/opencv_contrib.git opencv_contrib

なお,Cuda8.0との兼ね合いで一部ソースコードを変更しないとビルドが通りませんでした.
"/modules/cudalegacy/src/graphcuts.cpp"のL46の記述を下記のように変更します.

Before :

#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER)

After :

// GraphCut has been removed in NPP 8.0
+#if !defined (HAVE_CUDA) || defined (CUDA_DISABLER) || (CUDART_VERSION >= 8000)
cmake のコンフィグレーション設定
cmake -DCMAKE_INSTALL_PREFIX=/installpath/reps/opencv-3.1.0/install -DBUILD_EXAMPLES=ON -DINSTALL_C_EXAMPLES=ON -DWITH_OPENGL=ON -DWITH_V4L=ON -DWITH_QT=ON -DOPENCV_EXTRA_MODULES_PATH=/installpath/reps/opencv-3.1.0/opencv_contrib/modules ..
ビルド実行 & インストール
make -j8
make install
OpenCVの共有ライブラリ設定

/etc/ld.so.conf.d/opencv.conf ファイルを作成し,先ほどインストールしたパスを記述します.つまり,自分の場合だとファイルの中身は下記のようになります.

/installpath/reps/opencv-3.1.0/install/lib

で,ldconfigを実行すれば,上記のパスを共有ライブラリの探索パスとして登録してくれます.
ここまでくれば,ZED SDK のサンプルコードを実行できるようになります.

Linux コマンド ldd, ldconfig

Linux のコマンドのお勉強です.(すごい基礎的で恐縮ですが...)

ldd : 共有ライブラリへの依存関係参照.

 使おうとしている実行ファイルが共有ライブラリを用いている際,実行時に動的リンクされます.つまり,実行時にメモリに読み込まれて使われます.このコマンドでは,リンクしているライブラリの一覧を調べることができます.例えば,今 ZED Stereo Camera の導入をしているんですが,その一つの実行ファイルがリンクしている共有ライブラリを調べたければ,下記のように ldd を実行すればわかります.ちょっとしたコマンドに対して ldd をやって見ると,以下に多くのライブラリが使われているのかがわかりますね.

$ ldd ZED_Camera_Control

linux-vdso.so.1 => (0x00007ffc63fe7000)
libsl_zed.so => /usr/local/zed/lib/libsl_zed.so (0x00007f48f4b53000)
libsl_core.so => /usr/local/zed/lib/libsl_core.so (0x00007f48f4912000)
・・・・

$ ldd /bin/ls

linux-vdso.so.1 => (0x00007ffef4d88000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f0275917000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f027554e000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f02752dd000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f02750d9000)
/lib64/ld-linux-x86-64.so.2 (0x0000561ed5bde000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f0274ebc000)


ldconfig : 共有ライブラリを探索するパスの設定.

 実行時に動的リンクされるライブラリの場所をシステムに把握させておく必要があります.このコマンドでは,共有ライブラリを探索するパスを指定できます.ライブラリパスは /etc/ld.so.conf.d に conf ファイルを作成し,作成後に ldconfig コマンドを実行すればライブラリパスとして設定してくれるみたいです.今回はお試しに自分のローカルで OpenCV 3.1.0 をビルドしたので,そのパスを/etc/ld.so.conf.d/opencv.confというファイルを作成してそこに記述しました.

ROS Teb Local Planner + Arduino Due + Rotary Encoder

ということで,前回のエントリから早くも一週間...
ようやくエンコーダ周りの基板作成・マイコン実装変更・ROS対応が完了しました.長かった....
エンコーダの解像度が上がったことで,低速での制御が可能になったことと,オドメトリの精度がアップしました.
あと,二つの Arduino Leonard を一つの Arduino Due にまとめたことで,ロボットのスペースがだいぶすっきりしました.

f:id:rkoichi2001:20170416215148j:plain

空いたスペースに,NVIDIA の Jetson TX2 を搭載して画像処理をしたいな~.なんて,新しいもの試したいいつものパターンにはまりつつありますが,これは時間があれば...

組み込みシステムの開発者キットとモジュール | NVIDIA Jetson | NVIDIA

先ほどようやく Teb Local Planner で軌道生成するところが完了し,ひとまず足回りは完了です.

youtu.be

上記ビデオのリンクですが,指定した複数の地点に対して Teb Local Planner を使って軌道生成してます.一つの緑のガムテープのマス目が 50cm なので,割と厳しめの経路になっているかと.要求しているパスポイントは,下記のとおりです.

(x, y, theta) : (0, 0, 0) -> (0.5, 0, 0) -> (1.0, 0.5, 0) -> (1.5 0.0, -90deg) -> (1.0 -0.5, -180deg)

経路生成とその追従に関しては,カメラやLidarなどのセンサーとくっつけたときにまだまだ課題が出てくると思うのですが,ひとまず明日からは Zed Stereo Camera をパソコンで使えるようにします.