こんにちは、しゅうです。
この度、ROS Melodic及びNoeticに対応したRaspberry Pi Mouse用のナビゲーションパッケージを公開しました。
パッケージの概要
今回ご紹介するパッケージ、rt-net/raspimouse_slam_navigation_rosについてご説明します。
こちらのパッケージは、SLAMとナビゲーションがそれぞれ行えるように実行ファイルなどがまとまったメタパッケージです。SLAMは、rt-net/raspimouse_ros_examplesと同じくgmappingを使っています。ナビゲーションでは、move_baseとamclを使用しています。
以下の動画にて、ナビゲーション(初期位置の設定や目標位置・姿勢の指示)を行なっている様子をご覧いただけます。
SLAMについては、rt-net/raspimouse_ros_examplesにて説明しているので、本記事ではナビゲーションについて詳しくお話しします。
使用するソフトウェアや機材など
対応ソフトウェアのバージョンや必要となる機材は、rt-net/raspimouse_slam_navigation_rosのREADMEを参照してください。ROS Noeticを使う場合はnoetic-develブランチ、ROS Melodicを使う場合はmelodic-develブランチを参照してください。
以下は本ブログで使用するソフトウェアと機材のリストです。
- Raspberry Pi Mouse V3
- Raspberry Pi 4 Model B
- Ubuntu 20.04
- ROS Noetic Ninjemys
- デバイスドライバ
- ROS Package:このブログでインストール方法をご紹介します
- Remote PC
- Ubuntu 20.04
- ROS Noetic Ninjemys
- ROS Package:このブログでインストール方法をご紹介します
そして、本ブログでは以下の機材を使用します。
- Raspberry Pi 4とRaspberry Pi Mouse本体を接続するためのオプションキットNo. 7
- ゲームパッド:Logicool Wireless Gamepad F710
- レーザ測域センサ:LDS-01
デバイスドライバーのインストールについては、RT Software Tutorialsをご参照ください。
また、Remote PCとRaspberry Pi Mouseが同じネットワーク上で同じROS Masterを指定している必要があります。詳しい設定方法についてもRT Software Tutorialsを参照してください。
インストール方法
Raspberry Pi Mouse V3
まずは、ロボット側で必要なソフトをインストールします。以下のコマンドを実行しましょう。
cd ~/catkin_ws/src # Clone the ROS packages git clone https://github.com/ryuichiueda/raspimouse_ros_2 git clone -b $ROS_DISTRO-devel https://github.com/rt-net/raspimouse_ros_examples git clone -b $ROS_DISTRO-devel https://github.com/rt-net/raspimouse_slam_navigation_ros # Install dependencies rosdep install -r -y --from-paths . --ignore-src # make and install cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash
Remote PC
次に、Remote PC側に必要なソフトをインストールします。以下のコマンドを実行しましょう。
cd ~/catkin_ws/src # Clone the ROS packages git clone -b $ROS_DISTRO-devel https://github.com/rt-net/raspimouse_slam_navigation_ros # Install dependencies rosdep install -r -y --from-paths . --ignore-src # make and install cd ~/catkin_ws catkin_make source ~/catkin_ws/devel/setup.bash
実行方法
SLAM
SLAMの実行方法についてはrt-net/raspimouse_ros_examplesを参照してください。
ナビゲーション
SLAMで地図を生成した後、その地図を使って自己位置推定を行い、地図上の任意の座標まで自律移動を行います。
まずはRaspberry Pi Mouse上で、次のコマンドを実行します。Raspberry Pi MouseのモータとLiDARを起動するためのノードを起動しています。
roslaunch raspimouse_navigation robot_navigation.launch lds:=true port:=/dev/ttyUSB0
Remote PC上で、次のコマンドを実行します。自己位置推定と経路生成用のノードを起動し、RVizを立ち上げます。(下記画像を参照)
引数のmap_fileパラメータには、SLAMで生成した地図(yamlファイル)を指定してください。
roslaunch raspimouse_navigation pc_navigation.launch map_file:=$(rospack find raspimouse_slam)/maps/$MAP_NAME.yaml
無事RVizが起動したら、まずは初期位置・姿勢を合わせます。RVizの画面上部の緑色の矢印2D Pose Estimateをクリックしましょう。地図上で、ロボット実機が最もらしい位置までマウスを持ってきてクリックしそのままホールドします。大きな矢印が出ている状態で、マウスを動かすと向きを指示することが可能なので、最もらしい向きに合わせてから、ボタンを離しましょう。
初期位置・姿勢の指示が完了したら、次は目標位置・姿勢を指示します。RVizの画面上部の紫色の矢印2D Nav Goalをクリックしましょう。地図上で、初期位置・姿勢を合わせた時と同様に、地図上をクリックして目標位置を、ホールドしたままマウスを動かして目標姿勢を指示しましょう。すると、ロボットが自律移動を開始します。
ロボットの停止方法について
与えた目標位置・姿勢への移動を停止したい場合は、新しいターミナルで次のコマンドを実行しましょう。RViz上には目標位置・姿勢が残りますが、ロボットは停止します。新たに、2D Nav Goalを設置すると、そちらに目標位置・姿勢が置き換わります。
rostopic pub -1 /move_base/cancel actionlib_msgs/GoalID -- {}
また、ロボットが予期しない挙動をした場合は、安全に気をつけながらRaspberry Pi Mouse V3のモータ用電源をOFFにしましょう。モータ用電源はRaspberry Pi Mouse V3に搭載されたスイッチでON / OFFできます。あるいは、次のコマンドを実行すると、ソフトウェアスイッチでモータ電源をOFFにできます。
rosservice call /motor_off
Tip: 他のナビゲーション手法を使いたい時
raspimouse_navigationパッケージでは、ナビゲーション・自己位置推定用のノードをpc_navigation.launchファイルでまとめて起動しています。
このlaunchファイルは、launch/includeフォルダにあるamcl.launchとmove_base.launchを起動しています。ここと同じ階層に別のナビゲーションや自己位置推定手法を起動するlaunchファイルを置きましょう。下記画像では、例としてimu-gps.launchというファイルを作っています。
なお、ファイル名には[手法の名前].launchとしましょう。
パラメータなどの設定ファイルも必要であれば用意しましょう。本パッケージではconfigフォルダにまとまっています。
また、それぞれのナビゲーション手法には適切なRVizの設定があります。保存したRVizの設定ファイルを参照するように、rviz_move_base.launchファイルのパラメータを変更すると、次回も同じ設定値でRVizを起動できます。

rviz_move_base.launchの一部
そして、pc_navigation.launch起動時にパラメータを追加することで、ナビゲーション手法を変更できます。下の例では
roslaunch raspimouse_navigation pc_navigation.launch localization:=imu-gps
まとめ
今回は、
- Raspberry Pi MouseとRemote PCにナビゲーション関係のソフトのインストール
- Raspberry Pi Mouseのナビゲーションサンプルを実行しました
- 他のナビゲーション手法の導入方法
についてご説明しました。
今後は、ROS 2のNavigation対応も準備中ですので、準備出来次第公開のご案内をします。