ROS Nodelet, Noise Remover, Gmapping....

おはようございます.一週間更新が滞ってしまいましたが,いろいろとやってました.
先週やったこととしては,,,,

1. ROS の Nodelet 化
2. SGBM の視差マップノイズ除去部品の作成
3. depthimage_to_laserscan と gmapping を使った地図の作成

1. ROS の Nodelet 化

 まず,ROS の Nodelet 化ですが,今まで一つ一つの部品は ROSの Node として作成していたのですが,Nodeをバンバン作ってプロセスとして立ち上げると,特に画像処理回りはノード間の通信量が大きくなりすぎてしまってPCがいっぱいいっぱいになってしまうので,今までプロセスとして立ち上げていたNodeをスレッドとして立ち上げてメモリ空間を共有するようにしました.(と書くと,僕が難しいことを成し遂げたみたいですが,Nodeletを使ったので自分は大したことはしてませんが(笑))
 ただ,Nodeletを使うのが初めてだったのでちょっとはまりました.

2. SGBM の視差マップノイズ除去部品の作成

 SGBMの視差マップですが,前回のエントリで書いた通り視差画像にはどうしてもノイズが入ってしまうので,これを除去するための部品を作りました.ノイズ除去するうえで用いた仮定は,,,
「視差は画面下から上に向かうにつれて,必ず小さくなっていく.」
「地表を最低面とする」
 結局,環境の三次元構造をとらえる必要はなく,地面からのモノの生え際がわかればいいのでこれでもいいかと.結果としては,下記のようになりました.写真を見てもわかるとおり,木の構造が地面から生える一本の柱みたいになってます.

ノイズ除去前の視差画像
f:id:rkoichi2001:20170726082530p:plain

ノイズ除去後の視差画像
f:id:rkoichi2001:20170726082613p:plain

3. depthimage_to_laserscan と gmapping を使った地図の作成

 で,最もやりたかった gmapping を使った Map の作成ですが,結果的には全然ダメでした(笑)やっぱりレーザースキャナとステレオ視差だとモデルが全然異なるので,もっと工夫しないと成立しないですね.自分が使っているステレオカメラの視野角がかなり広いので,10m位離れてしまうと距離の精度が50-100cm位になってしまって,全然きれいなマップができませんでした.

f:id:rkoichi2001:20170726083248p:plain
f:id:rkoichi2001:20170726084214p:plain

 うーん.やっぱりなかなかストレートにはいかないですね...ただ,SLAMのコードを自作するのはつらいので,何とかステレオからレーザースキャナの出力を生成する方法を考えてみます.今思いついているものとしては,

1. ステレオの結果をつかって, Local Map を生成.この Local Map に対して,仮想的なレーザースキャンを生成する.
2. 視差画像を鳥瞰図変換して,このLocalMapに対して仮想的なレーザースキャンを生成する.

 ということで,今週は LocalMap2LaserScan の作成に取り組みます.ということで,仕事行ってきます!