TurtleBot3 はROBOTIS社の製品ですが2輪走行型ロボットの標準のようなものです。
TurtleBot3 e-Manual のSimulation パッケージをインストールしてシミュレーション環境を使ってみます。
このシミュレーション環境もある種標準のようなもので、自作のロボットやセンサーがどういう動きをするか見るのに絶好の環境になっています。
で、この環境で自作の空間(my_room.world)の地図を作成してみます。
(3/5)地図の作成ではgmapping slam という手法を使いましたが、ここではhector slam を使って地図を作成します。
ROS1(Melodic) の環境に 事前に以下をインストールしておきます。
gmappingなど先行ページと重複するものもありますが、気にしない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
sudo apt-get install -y ros-melodic-joy ros-melodic-teleop-twist-joy \ ros-melodic-teleop-twist-keyboard ros-melodic-laser-proc \ ros-melodic-rgbd-launch ros-melodic-depthimage-to-laserscan \ ros-melodic-rosserial-arduino ros-melodic-rosserial-python \ ros-melodic-rosserial-server ros-melodic-rosserial-client \ ros-melodic-rosserial-msgs ros-melodic-amcl ros-melodic-map-server \ ros-melodic-move-base ros-melodic-urdf ros-melodic-xacro \ ros-melodic-compressed-image-transport ros-melodic-rqt* \ ros-melodic-gmapping ros-melodic-navigation ros-melodic-interactive-markers sudo apt-get install ros-melodic-dynamixel-sdk sudo apt-get install ros-melodic-turtlebot3-msgs sudo apt-get install ros-melodic-turtlebot3 -y sudo apt-get install ros-melodic-hector-mapping sudo apt-get install ros-melodic-slam-gmapping sudo apt-get install ros-melodic-dwa-local-planner |
rospkgはpip3を使ってインストールを行います。pip3がまだの場合は以下を実行。
1 2 3 |
sudo apt install python3-pip -y sudo python3 -m pip install --upgrade pip |
インストール
1 |
pip3 install rospkg |
シミュレーションパッケージをインストールします。
1 2 3 4 5 6 7 8 9 10 |
cd ~/catkin_ws/src/ git clone -b melodic-devel https://github.com/ROBOTIS-GIT/turtlebot3_simulations.git cd ~/catkin_ws && catkin_make echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc source ~/.bashrc |
TurtleBot3はWaffleというモデルを使います。my_robotはだいたいこのサイズで作成しています。
1 |
export TURTLEBOT3_MODEL=waffle |
各ターミナルを開くごとに必要になるので、~/.bashrc に追記しておいたらいいかもしれません。
1 |
echo "export TURTLEBOT3_MODEL=waffle" >> ~/.bashrc |
キーボードを使ってTurtleBot3を動かしてみます
Gazeboに表示
まずはデフォルトで用意されている仮想空間を使ってみます。
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_world.launch |
turtlebot3_worldという亀の形をした変な仮想空間にTurtleBot3が置かれています。
移動にはキーボード制御用のteleoperationを使います。このtelopはBot3シミュレーション用に用意されているものです。
別ターミナルで以下を実行
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch |
ターミナルを前面に出してフォーカスした状態でキーを押せばTurtleBot3が前後左右に移動します。sキーで停止。
最初はゆっくりでしか動きませんが、何回か押下すれば速度が上がります。
何もない空間で動かす場合は以下を実行
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_empty_world.launch |
Rvizで表示
Waffleを起動して動かしてみます。
turtlebot3_fakeパッケージを使用します。turtlebot3_fakeは、実際のロボットがなくても実行できる非常に単純なシミュレーションノードです。
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_fake turtlebot3_fake.launch |
赤い矢印はodometryです。TFにチェックを入れればBot3の車輪やLiDARの座標系(frame)が表示されます。
odometryを消して、TFにチェックを入れてteleoperationで動かしてみてください。
Bot3に搭載されているLiDARのレーザースキャンの様子をみてみます
レーザースキャンは届く周囲にある物体を赤い点群で表示します。
ちょっと見づらいですが、壁が赤くスキャンされています。
Gazebo 起動
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_world.launch |
visualize Simulation data(RViz)起動
1 |
roslaunch turtlebot3_gazebo turtlebot3_gazebo_rviz.launch |
teleoperationでBot3を動かしてもいいですが、 自律動作をさせてみてます。Bot3は「前進ー>接近ー>回転」の3つがループしながら部屋の中を動き回り、障害物や壁への衝突を回避します。
おまじない
1 |
source ~/.bashrc |
起動
1 |
roslaunch turtlebot3_gazebo turtlebot3_simulation.launch |
なお、回転角はある範囲内でランダムに取られるようです。
また途中に突然障害物が出現しても、それがスキャンされたら回避行動を行います。
かなり見辛いですが、スキャンされるものが変化しています。障害物の先にあるものはスキャンされていません。
TurtleBot3のシミュレーション環境で地図作成
gmapping slamやhector slamなどが可能です。
ここではhector slamをやってみます。
対象の空間は2/5で作成した空間。
turtlebot3_my_room.launchを作成
1 2 3 |
cd ~/catkin_ws/src/turtlebot3_simulations/turtlebot3_gazebo/launch sudo nano turtlebot3_my_room.launch |
自作空間(my_room.world)でTurtleBot3を使います。worldファイルはmy_robotパッケージのフォルダーに入れてますので、includeは以下(8行目)のようになります。
2/5で作成した空間ですので、worldファイルは ~/catkin_ws/src/my_robot/worlds に格納されているはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<launch> <arg name="model" default="$(env TURTLEBOT3_MODEL)" doc="model type [burger, waffle, waffle_pi]"/> <arg name="x_pos" default="0.0"/> <arg name="y_pos" default="0.0"/> <arg name="z_pos" default="0.0"/> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot)/worlds/my_room.world"/> <arg name="paused" value="false"/> <arg name="use_sim_time" value="true"/> <arg name="gui" value="true"/> <arg name="headless" value="false"/> <arg name="debug" value="false"/> </include> <param name="robot_description" command="$(find xacro)/xacro $(find turtlebot3_description)/urdf/turtlebot3_$(arg model).urdf.xacro" /> <node name="spawn_urdf" pkg="gazebo_ros" type="spawn_model" args="-urdf -model turtlebot3 -x $(arg x_pos) -y $(arg y_pos) -z $(arg z_pos) -param robot_description" /> </launch> |
起動
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_my_room.launch |
別ターミナルで以下を実行してteleoperationを起動
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_teleop turtlebot3_teleop_key.launch |
前面に出して常にフォーカスして使います。
さらに別ターミナルでhector slam を実行
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_slam turtlebot3_slam.launch slam_methods:=hector |
ちなみに、gmapping slamをやりたい場合はhector の代わりに gmapping を指定します。
teleoperationで満遍なく移動して地図を完成させます。
完成した地図を保存
1 2 |
mkdir ~/maps rosrun map_server map_saver -f ~/maps/my_room_hector_map |
2つのファイルが作成されます。
my_room_hector_map.pgm
my_room_hector_map.yaml
地図に汚れがある場合
こんなふうに、余計な線のような汚れがあると障害物と誤認されることがあります。
地図のpgm画像から、GIMPなどで消去してしまいましょう。
TurtleBot3でナビゲーション
TurtlBot3 をどの仮想空間で使うのか決めます。
上記で作成した独自空間(my_room.world)用のlaunchを使ってみます。
1 2 |
export TURTLEBOT3_MODEL=waffle roslaunch turtlebot3_gazebo turtlebot3_my_room.launch |
どの地図を使うのか決めます。hector slam で作った地図を使ってみます。
navigationを起動します。
roslaunch turtlebot3_navigation turtlebot3_navigation.launch map_file:=$HOME/maps/my_room_hector_map.yaml
2D Nav Goal を選択
マウスクリックで到達点(Goal)とその後の姿勢を設定
最適経路が策定されて、ナビゲーションが開始されます。
また、策定後に経路の途中に障害物が置かれてもレーザーレンジの範囲外の場合は途中まで策定済みの経路を進みますが、スキャンされて新たな障害物が発見されれば経路が再策定されて障害物を回避します。
Leave a Reply