前々回に机の上という狭い範囲でSLAMを行ってみましたが、電源ケーブルも取り外して広々と動けるようになったので広い範囲でSLAMを行い、環境地図情報を作成したのちにNAV2で目的地までの自律走行を行ってみます。
SLAMで環境地図を作成する
前々回に行った手順とほぼ同様ですが、最後に作成した環境地図の情報を保存する作業が必要です。
SBCでの操作
kobuki のRaspberry Pi 4にsshでログインして各ノードを起動します。ここではまとめて記載していますが、個々にターミナルを開いて実行します。
ros2 launch kobuki_node kobuki_node-launch.py
ros2 launch kobuki_description robot_description.launch.py
ros2 launch ydlidar_ros2_driver ydlidar_launch.py
デスクトップPCでの操作
デスクトップPCのターミナルから各ノードを起動します。ここではまとめて記載していますが、個々にターミナルを開いて実行します。
ros2 launch slam_toolbox online_async_launch.py
rviz2
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap cmd_vel:=commands/velocity
環境地図の作成
kobukiをキーボードで動かして、環境地図を作成していきます。
十分な環境地図ができたら別のターミナルで以下のコマンドを実行して環境地図を保存します。
ros2 run nav2_map_server map_saver_cli -f ~/map
この結果、ホームディレクトリに以下の2つのファイルが保存されます。
ocha@ocha-ubuntu:~$ ls -l map*
-rw-rw-r-- 1 ocha ocha 105687 5月 11 11:40 map.pgm
-rw-rw-r-- 1 ocha ocha 121 5月 11 11:40 map.yaml
この環境地図をもとにしてNAV2で自律走行を行います。地図の2D情報はmap.pgmに保存されており、画像ビューワーでも確認できます。今回はこのような地図が作成できました。
Nav2で自律走行してみる
SBCでの操作
Raspberry Pi 4側ではSLAMで使用したノードをそのまま使用します。
ros2 launch kobuki_node kobuki_node-launch.py
ros2 launch kobuki_description robot_description.launch.py
ros2 launch ydlidar_ros2_driver ydlidar_launch.py
Desktop PCでの操作
Navigation2は公式サイトのtutorialにあるNavigating with a Physical Turtlebot 3を参考にして動かしました。
ドキュメントに従ってターミナルからNav2を起動します。
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=False map:=$HOME/map.yaml
別のターミナルからRviz2を起動します。
ros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz
この状態で再度Nav2を立ち上げたところ、Rviz2に地図が表示されました。
トピック名を変換するノードの作成
Nav2からロボットに対して送信される移動のためのトピック名は/cmd_velですが、kobukiではこのトピック名が/commands/velocityのため、kobukiでトピックが受信できません。これを解決するにはトピック名の書き換えが必要となります。トピック名をremapしてみたのですが、書き換えてはいけないトピック名まで書き換わってしまったので、トピック名の書き換えをするノードを新たに作りました。
今回作成したkobuki_cmdvelパッケージです。ノードのソースはシンプルなものになります。
ノードの実行は以下のように行います。
ros2 run kobuki_cmdvel kobuki_cmdvel
このノードで正しくトピック名が置換されるかテストしてみました。rqt_graphで確認すると動作は一目瞭然です。購読している/cmd_velが/commands/velocityに書き換わっています。
NAV2を実行する際はこのノードを動かしておけば大丈夫なはずです。
再度、Nav2を動かしてrqt_graphで確認したところ、/cmd_velトピックがkobuki_cmdvel_subscriberノードによって/commands/velocityトピックに変換されkobukiノードが購読していることが確認できました。
自律走行の確認
この状態で再度自律走行を確認してみます。細かい手順はNavigating with a Physical Turtlebot 3のページにも掲載されていますのでそちらも参考にしてください。
SLAMの時と同様にteleop_twist_keyboardを別のターミナルから起動します。
ros2 run teleop_twist_keyboard teleop_twist_keyboard --ros-args --remap cmd_vel:=commands/velocity
まずKobukiの位置と向きを2D Pose Estimateで調整します。そのあとにteleop_twist_keyboardで本体を少しずつ回転させると地図上のkobukiの位置が調整されます。ある程度収束したところでNav2 Goalで目的地を指定するとその場所にkobukiが移動することが確認できました。
実際にNav2で移動している動画を載せておきました。Rviz2のNav2 Goalで指定したポイントと方向に動くことが確認できました。
まとめ
ROS2 humbleを使用してKobukiで自律走行ができることが確認できました。まだしばらくはROS2の実験用として活用できそうです。Kobukiの筐体には様々な機器が取り付けられるテーブルやネジ穴もありますのでRealSenseカメラなども取り付けてみようと思います。