このブログは、株式会社フィックスターズのエンジニアが、あらゆるテーマについて自由に書いているブログです。
アルバイトの室岡です。
現在、Fixstars Autonomous Technologiesでロボットの自律走行に向けた課題抽出に取り組んでいます。今回TurtleBot3というロボットを用いて社内の地図作成をし、ナビゲーションまでできたので報告します。
TurtleBotとは低価格なパーソナルロボットキットで、ロボットベンチャー企業であるWillow Garageが最初に作りました。Willow Garageは他にもロボット用フレームワークであるROSやパーソナルロボットであるPR2を作ってきましたが2014年に事業を停止してしまいました。
現在はROBOTISがTurtleBotを引き継ぎ、最新ではTurtleBot3がリリースされています。TurtleBot3はBurger、Waffle、Waffle Piの三種類あります。今回はその内メインコンピュータがRaspberry Pi3 Model Bを採用しているWaffle Piを使用します。
TurtleBot3はRaspberry Pi3 Model BやIntel JouleなどのコンピュータとArduinoベースの制御ボードOpenCRで構成されています。センサ・アクチュエータとしてはLiDARやカメラ、エンコーダなどのセンサに加えて移動用モータを備えています。
もちろんTurtleBotはROSに対応しており、TurtleBotの起動からSLAM、ナビゲーション、遠隔操作など多くのROSのパッケージも公開されています。今回使用したROSのバージョンはKineticです。
ソフトウェア、ハードウェアに関しては基本的にオープンになっているので自分で拡張することも可能です。
地図作成に関わる技術としてはSLAMを用います。ROSのSLAMパッケージを用いるとSLAMの知識が無くても地図作成ができ、またTurtleBot3用のROSのSLAMパッケージやマニュアルも公開されています。
TurtleBot3に搭載されているLiDARで環境の2次元スキャンをし、移動しながら地図を作っていきます。SLAMにはいくつか種類があるのですが、今回は最も有名なgmappingを使いました。gmappingの処理内容としては、パーティクルフィルタを用いて自己位置推定すると同時に、その自己位置情報をもとに地図を作成していきます。
ナビゲーションに関しても、TurtleBot3用のROSパッケージやマニュアルがあります。
ゴール位置までのナビゲーションをするために、地図やセンサ情報をもとにしたコストマップを作成し、そのコスト情報をもとに経路計画をします。これらは大域的な処理と局所的な処理に分けられます。
大域的な処理としては、予め作っておいた地図情報を元に壁や障害物があるところにコストを高くし、コストが閾値を超えないような経路を計画します。局所的な処理としては、走行時に得られたLiDARのセンサ情報から人や以前なかった障害物を検知してリアルタイムで経路を補正します。
TurtleBot3のメインコンピュータはRaspberry Pi3 Model Bであり性能はそこまで高くないのでノートパソコンをROSのマスターにします。
ロボットシステムは下記画像のようになっており、緑色のROSノードが互いにROSの規格でプロセス間通信しています。
ノートパソコンで roscore を起動したうえで、
TurtleBot上のPCで
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
ノートパソコンで
$ roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
を実行します。
そのまま遠隔操縦でTurtleBot3を動かすとSLAMにより地図が作成されます。作成された地図は画像形式で保存され、下記画像が今回作成した社内の地図です。
地図情報を格納するデータ構造はOGM(Occupancy Grid Map)を用いており、黒がOccupancy、白がFree、灰色がUnknownです。
作成したこの地図をもとにナビゲーションしてみます。
TurtleBot上のPCで
$ roslaunch turtlebot3_bringup turtlebot3_robot.launch
ノートパソコンで
$ roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
起動したRVizでまず、「2D Pose Estimate」でTurtleBot3の自己位置を教えてあげます。次に「2D Nav Goal」でゴール位置を指定すると自動で経路計画をして移動を始めます。下記画像がその様子で、小さい緑の矢印群がパーティクルフィルタによる自己位置、赤い矢印がゴール位置、黒い線が計画された経路です。TurtleBot3の周りは青色や赤色に覆われておりこれがコスト情報で、なるべく青い部分を通るように経路が計画されています。
地図を作成した時にはなかった障害物や人がそばを歩いている状況でも、それらを回避するような経路が計画されており、安全な経路計画が実現できていることが分かりました。
今回地図作成、ナビゲーションで使用したセンサは2万円にも満たないLiDARだったのですが、作成した地図もかなり綺麗でありしっかり経路も計画することができて驚きました。
今後はこの既成品のTurtleBot3にDepthカメラなどを搭載するなどカスタマイズしてより幅広い動きが実現できたらと思います。
コンピュータビジョンセミナーvol.2 開催のお知らせ - ニュース一覧 - 株式会社フィックスターズ in Realizing Self-Driving Cars with General-Purpose Processors 日本語版
[…] バージョンアップに伴い、オンラインセミナーを開催します。 本セミナーでは、...
【Docker】NVIDIA SDK Managerでエラー無く環境構築する【Jetson】 | マサキノート in NVIDIA SDK Manager on Dockerで快適なJetsonライフ
[…] 参考:https://proc-cpuinfo.fixstars.com/2019/06/nvidia-sdk-manager-on-docker/ […]...
Windowsカーネルドライバを自作してWinDbgで解析してみる① - かえるのほんだな in Windowsデバイスドライバの基本動作を確認する (1)
[…] 参考:Windowsデバイスドライバの基本動作を確認する (1) - Fixstars Tech Blog /proc/cpuinfo ...
2021年版G検定チートシート | エビワークス in ニューラルネットの共通フォーマット対決! NNEF vs ONNX
[…] ONNX(オニキス):Open Neural Network Exchange formatフレームワーク間のモデル変換ツー...
YOSHIFUJI Naoki in CUDAデバイスメモリもスマートポインタで管理したい
ありがとうございます。別に型にこだわる必要がないので、ユニバーサル参照を受けるよ...