ROS2: Turtlebot3のGazeboシミュレーションをHumble/Noeticで動かす
海洋ロボコンをやってた人です。
今回は、Turtlebot3のGazeboシミュレーションをROS 2 HumbleとROS Noeticで動かす手順を自身の備忘録かつ、本学の新4年生、在学生向けに記載していきます。
なぜまとめるかは以下です。
- 本学でTurtlebot3のパッケージおよびDYNAMIXELシリーズを使用しているため
- 2023年4月にROS 2 FoxyがEOL(End Of Life)になるので、Humbleに移行するため
- Gazeboを使用したシミュレーションの理解を自分も深めたいため
"もっとこうすれば簡単に使用できる" や "ここは違うのではないか"というご意見がありましたら、是非ご教授いただけますと幸いです。
また、本記事に対するコメントも積極的に募集しますので、よろしくお願いいたします。
※2023/04/23 追記:Gazebo actor not seen by sensorsで調べたことを追記しました。
※2023/10/21 追記:LDS_MODEL, install xacroを追記しました。
1: TurtleBot3とは
まず、新4年生の方はTurtleBot3(タートルボット スリー)とは何か?を知る必要があると思うので、ざっと公式から引用しておきます。
TurtleBot3(タートルボット3)は、ロボット オペレーティング システムROS及びGazeboシミュレーターの管理団体であるOpen RoboticsとロボットメーカーROBOTIS(ロボティズ)が共同開発したROS1,ROS2入門のためのコンピューターとLiDARを搭載したオープンソースの移動ロボットプラットフォームです。
無償公開のeマニュアル(Webドキュメント、チュートリアル)とサンプルプログラムによりROS1,ROS2の最新バージョンのインストールと学習・評価、応用開発が可能です。 (引用: ロボティズeショップ https://e-shop.robotis.co.jp/product.php?id=352)
端的に言えば、SLAM、ナビゲーション、Gazeboシミュレーションなどを手軽に学べるロボットです。
自己位置推定と地図作成を同時に行うSLAMや、作成した地図を使用してナビゲーションできる機能を1から作るとなると膨大なプログラム量と時間を必要としますが、TurtleBot3(以下、TB3)はオープンソースソフトウェア(OSS)なので、これらを簡単に試すことができます。
なので、移動ロボットを学ぶ、開発する上ではとても手軽なプラットフォームということになります。
この辺り、詳しくは上記引用元のQ&Aのスライド:TurtleBot3でROSを始めよう from ROBOTIS Japan を読んでいただければと思います。
また、Turtlebot3はロボットオペレーティングシステムROSを使用しているため、初学者の方または学生さんはLinux(OS)およびROS/ROS 2 を勉強する必要があります。
ROS 2 の勉強は本研究室の本棚にもある、ROS2とPythonで作って学ぶAIロボット入門 などではじめに勉強していただければと思います。
もちろん、公式のROS 2 Documentation: Humbleなどから勉強するのも良いです。
2023年3月現在は、研究室でROS 2 Foxyがメインで使われていると思いますが、サポート終了するのでHumbleで環境構築するのが良いかと思います。
一通りの勉強が終わったら、ROS/ROS 2 の扱いが分かるようになってくると思うので、次のステップとしてセンサの利用やRViz2の使い方を学んでください。
センサの利用およびRViz2の使い方はAr-Ray様が物凄く分かりやすくまとめてくださっているので、こちらで勉強して頂けるのが良いと思います。
以上、ROS/ROS 2 について理解したら、TB3のシミュレーション構築をしていきましょう。
※ 以下、必要に応じてメインPCからTB3側のマイコンにアクセスしやすいような工夫をしておくのも良いと思います。(お好みで)
sudo apt install ssh
sudo apt install onboard
2: ROS 2 HumbleでTB3のシミュレーション環境を構築する
それでは本題のROS 2 HumbleでTB3のシミュレーション環境を構築していきます。
README_tb3_big_wheel_jpを参照し、進めていきます。
以下をインストールするのは、TB3側のマイコンではなく、指令を送るパソコン側でインストールしていきます。(状況に応じて変えてください)
2.1: 必要なROS 2 パッケージのインストール
- SLAMやナビゲーションのためのパッケージをインストールします。
sudo apt-get install ros-humble-gazebo-*
sudo apt install ros-humble-cartographer
sudo apt install ros-humble-cartographer-ros
sudo apt install ros-humble-navigation2
sudo apt install ros-humble-nav2-bringup
sudo apt install ros-humble-xacro
sudo apt remove ros-humble-dynamixel-sdk
sudo apt remove ros-humble-turtlebot3-msgs
sudo apt remove ros-humble-turtlebot3
- turtlebot3のパッケージをインストールします。
mkdir -p ~/turtlebot3_ws/src
cd ~/turtlebot3_ws/src/
git clone -b humble-devel https://github.com/ROBOTIS-GIT/DynamixelSDK.git
git clone -b humble-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom.git
cd ~/turtlebot3_ws
colcon build --symlink-install
echo 'source ~/turtlebot3_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc
- GazeboでROS/ROS 2のRealsense D435データを使用できるようにパッケージをインストールします。
RealsenseをGazeboで使用するためのプラグインはブランチfoxy-develですが、Humbleでも問題なく動きました。
sudo apt-get install ros-humble-realsense2-camera
cd ~/turtlebot3_ws/src
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/realsense-ros_jp_custom
git clone -b foxy-devel https://github.com/pal-robotics/realsense_gazebo_plugin
cd ~/turtlebot3_ws
colcon build --symlink-install
realsense-ros-jp-customで以下のようなエラーが生じた場合
--- stderr: realsense2_camera
CMake Error at CMakeLists.txt:134 (message):
ROS_DISTRO is not defined.
CMakeLists.txt
で対応するROS_DISTROが定義されるように修正します。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DHUMBLE")
set(SOURCES "${SOURCES}" src/ros_param_backend_foxy.cpp)
- turtlebot3のシミュレーションパッケージをインストールします。
cd ~/turtlebot3_ws/src/
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_simulations_jp_custom
git clone https://github.com/robotics-upo/lightsfm
cd lightsfm
make
sudo make install
cd ~/turtlebot3_ws
colcon build --symlink-install
- turtlebot3のモデルを.bashrcに書き込みます。
こちらは、ターミナル起動毎にexportをしても良いですが、ここでは手間なので.bashrcに書き込むことにします。
echo "export TURTLEBOT3_MODEL=big_wheel" >> ~/.bashrc
echo "export LDS_MODEL=LDS-01" >> ~/.bashrc
source ~/.bashrc
sudo nano ~/.bashrc
TURTLEBOT3_MODELはburger, waffle, waffle_pi, pizza, big_wheelなどを指定でき、各TurtleBot3 Friendsの種類を指定できます。
turtlebot3_bringup/lanch/turtlebot3_state_publisher.launch.pyの32行目で.bashrcで定義したTURTLEBOT3_MODELを呼び出すことで、ロボットのモデル(URDF)を変更しています。
2.2: ROS 2 HumbleでCartographerを試す
上記の準備ができたら、以下を実行していきましょう。
ターミナルを開いて(Ctrl + Alt + T)、ros2コマンドを別々のターミナルで実行していきます。
実行する際は、cd ~/turtlebot3_wsのディレクトリで行い、. install/setup.bashも忘れないでください。ターミナルは計4つ開く or Terminatorで4分割して実行します。(Terminatorは使いやすければ使えばいいと思います、研究室の先輩に聞いてみてください)
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ros2 launch turtlebot3_bringup turtlebot3_state_publisher.launch.py
ros2 run turtlebot3_teleop teleop_keyboard
ros2 launch turtlebot3_cartographer cartographer.launch.py use_sim_time:=True
teleop_keyboardは
Control Your TurtleBot3!
---------------------------
Moving around:
w
a s d
x
w/x : increase/decrease linear velocity (Burger : ~ 0.22, Waffle and Waffle Pi : ~ 0.26, Pizza : ~ 0.35, Big Wheel : ~ 0.50)
a/d : increase/decrease angular velocity (Burger : ~ 2.84, Waffle and Waffle Pi : ~ 1.82, Pizza : ~ 1.49, Big Wheel : ~ 3.41)
space key, s : force stop
CTRL-C to quit
という形で表示され、書いてあるとおり、w/xを押すと直進方向に加減速(長押しでも少しずつでも良い)、a/dを押すと左右旋回、sを押すと停止になります。
ただ加速しているときに急停止するとロボットの高さや構造によっては、慣性でロボットが倒れる可能性があるのであまり現実では行いたくないことだと思います。(移動ロボット専門でないので、間違っていたらご指摘ください)
また、ROS 2 Humbleのインストールしたパッケージでは、ロボットのモデルがRviz上で表示されないので、turtlebot3_state_publisher.launch.pyを起動し、/robot_descriptionトピックでRobotModelを表示しています。
(Rviz左下Add > RobotModel > Description Topic > /robot_description)
robot_descriptionの表示を毎回Rviz2上で表示するのが大変な場合は、rviz下のxxx.rvizファイルにrobot_descriptionをデフォルトで表示するような記述を追加してください。
こちらは、私の方でもまとめていますので、ご参考までに
以上を用いて、SLAMを行ってみるとこんな感じになります。
他にもマッピングの手法は様々ありますし、LaserScanからオドメトリを求めるパッケージなどもあります。
私も、少しまとめたものがあるので良ければこちらも参考にしてください。
マッピングできたら、そのマップを保存しナビゲーションのデモンストレーションも試してみましょう。
以下のコマンドで作成したマップを保存します。
ros2 run nav2_map_server map_saver_cli -f ~/map
カメラやLidarが動いておらず、マップが更新されていないと保存されずFailedとなります。
そのため、map_saver_cliを実行してからもマップが更新されているかの確認と、タイムアウト時間を長くする解決策が考えられます。
ros2 run nav2_map_server map_saver_cli -f ~/map --ros-args -p save_map_timeout:=1000
なにか、根本的な理由等ご存知の方がいましたら、是非ご教授お願いいたします。
Gazeboを強制的に終了させたい場合は、以下を実行してください。
killall gzclient
2.3: ROS 2 HumbleでNavigation2を試す
上記で保存したマップを元に、ナビゲーションも試していきます。
コマンドは上記と同じように3つのターミナルで実行します。
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py
ros2 launch turtlebot3_bringup turtlebot3_state_publisher.launch.py
ros2 launch turtlebot3_navigation2 navigation2.launch.py use_sim_time:=True map:=$HOME/map.yaml
Navigation2では、最初にRvizのヘッダー?にある「2D Pose Estimate」でロボットの位置と方向を定め、「2D Nav Goal」で目的値を決めて手動で動かします。
2.4: Actorを使った動的環境下でのシミュレーション
移動ロボットを研究および開発するに当たり、複数の歩行者が行き交うような動的環境下でのシミュレーションを行いたい場合があると思います。
GazeboではActorと呼ばれる人が動くモデルがあり、Social Force Model(SFM)プラグインを使用してGazebo内で歩行者の動きを決めることができます。
SLAMの際に、呼び出すworldファイルを変えると、動的環境下でのシミュレーションも可能となっています。
ros2 launch turtlebot3_gazebo turtlebot3_jp_world_dynamic.launch.py
2.5: 実機メモ
Raspberry Pi Model Bを起動後、必要なセットアップを済ませ、以下のパッケージをインストールしていく
詳細はTurtlebot3 e-manual SBC Setupなどを参照にしていただけるのが良いが、ここでは必要なコマンドのみを記載していく。
に従って、Arduino IDE側にOpenCRの準備も必要
sudo apt update
sudo apt install -y libudev-dev
mkdir -p ~/turtlebot3_ws/src && cd ~/turtlebot3_ws/src
# TODO Chose ROS 2 branch packages
# git clone -b foxy-devel https://github.com/ROBOTIS-GIT/turtlebot3.git
git clone -b humble-devel https://github.com/ROBOTIS-GIT/DynamixelSDK.git
git clone -b humble-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom.git
git clone -b ros2-devel https://github.com/ROBOTIS-GIT/ld08_driver.git
# git clone -b foxy-devel https://github.com/ROBOTIS-GIT/hls_lfcd_lds_driver.git
cd ~/turtlebot3_ws/src/turtlebot3
rm -r turtlebot3_cartographer turtlebot3_navigation2
cd ~/turtlebot3_ws
colcon build
echo 'export LDS_MODEL=LDS-01' >> ~/.bashrc
source ~/.bashrc
sudo dpkg --add-architecture armhf
sudo apt update
sudo apt -y install libc6:armhf
export OPENCR_PORT=/dev/ttyACM0
export OPENCR_MODEL=burger
rm -rf ./opencr_update.tar.bz2
wget https://github.com/ROBOTIS-GIT/OpenCR-Binaries/raw/master/turtlebot3/ROS2/latest/opencr_update.tar.bz2
tar -xvf ./opencr_update.tar.bz2
sudo rm -r opencr_update.tar.bz2
cd ~/opencr_update
./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr
OpenCRのプログラム変更後は、アップデートを行う
export OPENCR_PORT=/dev/ttyACM0
export OPENCR_MODEL=burger
cd ~/opencr_update
./update.sh $OPENCR_PORT $OPENCR_MODEL.opencr
上記実行後、ドレミファの音が鳴ればOKだと思います。
実機での起動コマンドたち ( Turtlebot3 e-Manual 4.SLAMを参照 )
ssh ubuntu@192.168.11.89
cd ~/turtlebot3_ws
export TURTLEBOT3_MODEL=burger
. install/setup.bash
ros2 launch turtlebot3_bringup robot.launch.py
cd ~/turtlebot3_ws
export TURTLEBOT3_MODEL=burger
. install/setup.bash
ros2 run turtlebot3_teleop teleop_keyboard
cd ~/turtlebot3_ws
export TURTLEBOT3_MODEL=burger
. install/setup.bash
ros2 launch turtlebot3_cartographer cartographer.launch.py
Turtlebot3 familyは、LiPoバッテリーを使用しているため、以下資料の「充電に関して」, 「保管に関して」, 「Li-Po電池の充電方法」などを予めご覧ください。
Reference
3: ROS NoeticでTB3のシミュレーション環境を構築する
続いて、ROS NoeticでTB3のシミュレーション環境を構築していきます。
README_tb3_big_wheel_3rs_jpを参照し、進めていきます。
Turtlebot3のモデルはtb3_big_wheel_3rsを使用しています。
以下をインストールするのは、TB3側のマイコンではなく、指令を送るパソコン側でインストールしていきます。(状況に応じて変えてください)
3.1: 必要なROSパッケージのインストール
- turtlebot3のパッケージをインストールします。
sudo apt remove ros-noetic-dynamixel-sdk
sudo apt remove ros-noetic-turtlebot3-msgs
sudo apt remove ros-noetic-turtlebot3
sudo apt install ros-noetic-gmapping
mkdir -p ~/tb3_noetic_ws/src
cd ~/tb3_noetic_ws/src
git clone -b noetic-devel https://github.com/ROBOTIS-GIT/DynamixelSDK.git
git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git
git clone -b noetic-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom.git
cd ~/tb3_noetic_ws/ && catkin_make
source ~/tb3_noetic_ws/devel/setup.bash
- Gazebo、Realsenseのパッケージをインストールします。
sudo apt-get install ros-$ROS_DISTRO-realsense2-camera
cd ~/tb3_noetic_ws/src
git clone https://github.com/ROBOTIS-JAPAN-GIT/realsense-ros_jp_custom
git clone https://github.com/pal-robotics/realsense_gazebo_plugin
git clone -b noetic-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_simulations_jp_custom
git clone https://github.com/robotics-upo/lightsfm
cd lightsfm
make
sudo make install
cd ~/tb3_noetic_ws && catkin_make
パッケージ単体をビルドするには以下を実行します。
catkin_make --only-pkg-with-deps turtlebot3_msgs
- turtlebot3のモデルを.bashrcに書き込みます。
echo "export TURTLEBOT3_MODEL=big_wheel_3rs" >> ~/.bashrc
echo "export TURTLEBOT3_PLAT=false" >> ~/.bashrc
echo "export LDS_MODEL=LDS-01" >> ~/.bashrc
source ~/tb3_noetic_ws/devel/setup.bash
3.2: ROS NoeticでGmappingを試す
ターミナルを4つ開き、それぞれ以下を実行してください。
worldファイルはpedestrian以外でも問題ありません。
roscore
roslaunch turtlebot3_gazebo turtlebot3_jp_world_corridor_pedestrian.launch
roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=gmapping
roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch
teleop_keyで動かすと、以下のようにSLAMできることが確認できます。
tb3_big_wheel_3rsはRealsenseD435を3台搭載しており、これら全ての点群データをRviz上で表示させると物凄く重くなります。
以下は、CORE i7, GEFORCE RTX3070を使用しているので3台のRealsenseの点群を描画しても30fps以上出ますが、普通のノートパソコンでは10fps以下になるので、その点は注意してください。
Humbleと同様に、Noeticでもマップの保存およびナビゲーションは以下で行うことができます。
rosrun map_server map_saver -f ~/map
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/map.yaml
以上、ROS2: turtlebot3_simulationsをHumble/Noeticで動かすメモでした。
少しでも皆さんの力になれば幸いです。
最後に、Turtlebot3でSLAMのシミュレーションする方法はGazebo以外にもUnityを使用した例や
スイスのCyberbotics社が公開しているロボットシミュレータwebotsを使用した例
などがあるので、色々試してみるのも面白いかもしれませんね。
4: Gazebo actor not seen by sensors
Gazebo内のactorがLaserscanの検出に反応しない問題
4.1: sensor type="gpu_ray"へ
Gazebo内のactorをLaserscanで検出させるには、pluginでlibgazebo_rosをインクルードしているファイル(例えば.gazebo.xacroファイル)を以下のように変更する必要があるそうです。
- <sensor type="ray" name="head_hokuyo_sensor">
+ <sensor type="gpu_ray" name="head_hokuyo_sensor">
- <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_laser.so">
+ <plugin name="gazebo_ros_head_hokuyo_controller" filename="libgazebo_ros_gpu_laser.so">
ただ、GPUの乗っていないパソコンおよびマイコンだと、データが飛ばないそうなのでactorの検出までシミュレーションする場合は、GPU搭載のPCが必要そうです。
Reference
・ Gazebo: Gazebo plugins in ROS
Discussion
2.turtlebot3のパッケージをインストールします。のセクションの部分で修正点の提案があります。
$ git clone -b humble-jp-devel https://github.com/ROBOTIS-JAPAN-GIT/turtlebot3_jp_custom
の部分なのですが、アドレス部分の".git"抜けていませんか?検討をよろしくお願いします。
まっちゃん様
ご指摘いただいた通り、.gitが抜けていましたので修正しました。
修正点の提案をいただき、ありがとうございました。