Jetson Nano + ROS で四足歩行ロボットをシミュレーションしてみる(Rviz)ではシミュレーションにMini Pupperを使いましたが、ここではSpotを使ってみます。
Mini Pupperモデルは姿勢(pose)の初期化(reset)が難しかったのと、Spotは買うと800万円くらいするらしいので、シミュレーションで動かしてみるしかないのでやってみます。
Boston Dynamics の Spot
シミュレーション用のROSパッケージCHAMPを使いますが、CHAMPには事前に仮想空間(World)が準備されています。
こんな感じ。
ごちゃついた空間なので、自前で仮想空間を作ってそこでSpotを動かしてみます。
また、SpotのconfigにはLiDARが搭載されていますので SLAM で地図を作ります。
Jetson Nano のセットアップ
ROSパッケージのCHAMPとchvmp/robotsをインストールしておきます。
詳細は以下を参照
Jetson Nano + ROS で四足歩行ロボットをシミュレーションしてみる(Rviz)
仮想空間(World)の作成
gazeboを起動
Ground PlaneとSun、ここにいろいろなアセットを置いていくことになります。
ここでは単純にアセットとしてJersey Barrier だけを置いて間仕切りした空間にします。
Spotのworldは以下に保存します。
~/catkin_ws/src/robots/configs/spot_config/worlds
既存のファイル(outdoor.world)を改名しておき、outdoor.world(SDF形式)で保存します。
Spot でGazebo 起動
1 |
roslaunch spot_config gazebo.launch |
場合によってはSpotがこけている場合があります。
その時は、
メニュー>Edit ->Reset Model Posesで 回復できます。
また、初回にこけていたり伏せの状態が回復しない場合は、Gazeboを再起動すれば何とかなることがあります。
SLAMを起動して地図作成
別ターミナルで以下を実行
1 |
roslaunch spot_config slam.launch rviz:=true |
レーザーの届く範囲がLiDARでスキャンされています。
地図を作成するには、仮想空間内でSpotを歩かせて全範囲をスキャンする必要があります。
2D Nav Goal を使って、マウスをクリックして到達点(Goal)と次の進行方向を指示します。
Gazebo 内ではSpotが歩いていますが、Jetson Nano の場合、絶望的に遅いです。
全範囲をスキャンするような場合、やはりCore i7やRTX 2080/3050 くらいのを積んだ高性能PCが望ましいです。
全スキャンが終了した場合、以下を実行して地図を作成します。
1 2 |
roscd spot_config/maps rosrun map_server map_saver |
map.pgm、map.yamlというファイルが作成されます。
ちなみに、Gazeboは建築エディタ(Building Editor)を使ってインドア空間も作れるようです。
間取り図をimportして自宅の空間を作ってみてもいいかも。
こんな感じです(Cafeのmodel)。
こういうデータセットもあります(Gazebo 7 対応みたいですが9でも使えました)。
3D Model は ~/.gazebo/models に置いて使いましょう。
Navigation
CHAMPには事前に用意された仮想空間の地図が準備されています。
これでNavigationしてみます。
以前に改名しておいたoutdoor.worldを元に戻して以下を実行。
1 |
roslaunch spot_config gazebo.launch |
この空間で事前に準備された地図を開きます。
1 |
roslaunch spot_config navigate.launch rviz:=true |
2D Nav Goal を使って歩かせてみます。
障害物の反対側にGoalを設定すると回避して大回りするようなルートが設定されます。
また、ルートの途中の障害物でスタックしたような場合、新たにルートが再設定されたり、頻繁にplanが作りなおされたりするうちにゴールをロストするというようなこともあるようです。
またchvmp/robotsの全てがうまく動くわけではないですが、champ_configやmini_cheetah_config、opendog_configなどでは正しかったのですが、Spotの場合Rvizでは正しくルートをとっていましたがGazeboでは壁を突破して移動しています。何でしょう?一歩の距離がspotと他のロボットでは違っている?
opendogの場合ですが、このように正しく対応しています。
Spotのストロークというか歩幅は、他のロボットより広いといえば確かにそうなんですが…..。
オドメトリなどの物理演算のパラメータ?よく分かりません。
*キー操作で制御
Jetson Nano + ROS で四足歩行ロボットをシミュレーションしてみる(Rviz)でやったようにキーボードで動かすこともできます。
別ターミナルで teleop_twist_keyboardを起動して
1 |
rosrun teleop_twist_keyboard teleop_twist_keyboard.py |
キーを使えばRvizのSpotやGazeboのSpotも動きます。
PS4コントローラでの制御もできるはずです。
カメラ
Spot はLiDAR以外にあご(?)の下に深度カメラを持っています。
深度カメラは3つのカメラを使っていて、左右のステレオカメラで距離を測定し、真ん中のカメラでカラー画像を取得します。
Rvizでカメラ画像を見てみます。
GazeboとRvizを起動し、RvizでDisplayパネルを開きます。
左下のAddボタンをクリック、By topic タブでdepth camera のimageを選んでOKクリック。
こんなイメージが表示されます。暗視カメラの画像みたいな感じです。
距離の表示がよく分かりませんでした。
measureしてみると、正面の物体までの距離はだいたい3mでした。仮想環境なのでよく分かりませんが、GRIDのセルサイズが1m、Spotの胴部の長さが110cmなのでだいたいそんなもんでしょう。
rgb camera のCameraを選んでみます。
カラー画像で表示されています。Spotの目線で見えているものです。Spot を動かせばカメラ画像も追従します。
関連キーワード
NVIDIA Omniverse 、Isaac Sim、Isaac ROS
AWS RoboMaker
Leave a Reply