(1/5)ロボットを作成して動かしてみるに続いて、
Gazeboで仮想空間(World)を作成してみます。
といっても、SLAMを使った地図作成用なので単純な構造にします。
矩形を壁で囲って、まんなかに仕切りを入れたもの。
こんな感じです。1mの基準長を設定しておきます。
また、あまりに広くてレーザーレンジが届かないと地図作成が困難になるので、長辺は5〜6m以内にします。
机や椅子、キャビネットといった物品(アセット)は何も置きません。
ロボットのナビゲーション時に随時セットしたいので空けておきます。
また、物品(アセット)は自作もできますがデータセットとして用意されているものもあります、以下参照。
プラットフォームはJetson Nano(Jetpack 4.6)
ROSはMelodic Morenia
環境構築は以下を参照
Jetson Nano にROS1 (Melodic) をインストール(メモ)
Gazebo を起動
メニュー>EditからBuilding Edtor を選びます。
importをクリック
File をクリックして上記の間取り図…のようなものを読み込みます。
Next をクリック
設定しておいた1m基準の両端をクリックして基準長を取得してOKクリック。
Wall を選んで、壁をクリックしながら線をトレースします。とりあえずの終了は右クリック。
修正する場合は、線をクリックしてドラッグ。
終わったらメニュー>File −>Save As で名前をつけて保存しておきます(例:my_room、Location はデフォルトでいいです)。
再度、メニュー>File −>Exit Building Editoe で終了。
「一度抜けると、もう編集できないよ」というワーニングが出ますがかまわずExitします。
こんな感じです。
セルのサイズは1辺が1m。
これを仮想空間(World)として保存します。
この空間は、先に作成したmy_robotパッケージで使うので、保存先は作成済みの以下のフォルダーになります。
~/catkin_ws/src/my_robot/worlds
名前は my_room.world としておきます。
メニュー>File −>Save World As
World に手を加えてみる
上記のWorldの場合、ロボットが出現する原点が壁に近すぎるのでmy_roomの位置を変えてみます。
1 2 3 |
cd ~/catkin_ws/src/my_robot/worlds gazebo my_room.world |
メニュの十字アイコンを選んで、roomオブジェクトをクリックすると座標軸が表示されます。これはオブジェクトを移動させる機能です。
緑の軸をドラッグするとy軸方向にroomが移動します。矢印は正の方向を示しているだけなので正負どっちにも移動できます。
こんな感じ。青いz軸に注目すると移動しているのが分かります。
その他、回転や拡大・縮小、アセットの追加などもできます。
終了したら再度保存しておきます。
Worldにmy_robotを表示
my_robotについては1/5をご参照ください。
launch フォルダーに移動してmy_robot.launchファイルを作ります。
1 2 3 |
cd ~/catkin_ws/src/my_robot/launch sudo nano my_robot.launch |
1/5 を実行していた場合はもうすでにこのファイルは作成されているので、編集することになります。
以下を参照
4行目のworld_nameは、default ではなくvalue指定してmy_robotのパッケージ名でmy_room.worldをincludeしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<launch> <include file="$(find gazebo_ros)/launch/empty_world.launch"> <arg name="world_name" value="$(find my_robot)/worlds/my_room.world"/> </include> <arg name="gui" default="True"/> <param name="robot_description" command="$(find xacro)/xacro $(find my_robot)/urdf/my_robot.urdf.xacro"/> <node name="urdf_spawner" pkg="gazebo_ros" type="spawn_model" args="-urdf -model my_robot -param robot_description"/> <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" /> <node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"/> <remap from="joint_states" to="/my_robot/joint_states" /> </launch> |
起動してみます。
1 |
roslaunch my_robot my_robot.launch |
TELEOPERATIONで制御するとこんな感じ。
1 |
rosrun teleop_twist_keyboard teleop_twist_keyboard.py |
my_robotは衝突のパラメータも持っているので壁に接触すると衝撃で回転しています。
壁が十分に軽いか、車体が十分に重いなら、壁は固定していないので衝突時に動くと思います。
オブジェクトとして球や立方体、円柱がありますが、これらはある程度の質量を持っているようです。
車体(1.3kg)が衝突しても停止するわけではなく、押し相撲のように寄っていきます。おもしろいです。
Appendix
アセットを追加してみる
Gazebo のinsertで使うアセットは以下から追加できます。
ダウンロードしたら解凍後、1個ずつ個別に以下に移動させておきます。modelsフォルダーが無ければ作っておきます。
~/.gazebo/models
Leave a Reply