【Unitree Go1】Go1 を Gazebo上で動かす

1. はじめに

Gazeboは、ロボットの制御を3Dでシミュレーションできるツールです。Unitree 社の ROS のシミュレーションパッケージを利用して、Gazebo上でロボットのローレベル制御(トルク、位置、角速度の制御)を行うことができます。

本稿では、Unitree Go1をGazebo上で動作させる方法をご案内します。

 

2. 環境

以下の環境にて、この手順が有効であることを確認しています。

OS: Windows 10 (64bit)
WSL2: Ubuntu-20.04
ROS: Noetic
Gazebo: 11.11.0
unitree_legged_sdk: v3.8.6

 

3. 手順

3.1 ROSのインストール

本稿では、ROS Noetic を使用します。インストールの必要がある場合は、以前の記事の 3-3. ROS Noetic のインストール、3-4. ROS の環境設定をご参照ください。

3.2 依存パッケージのインストール

まず、Unitree社の unitree_legged_sdk と unitree_ros_to_real を下記のレポジトリからインストールします。

unitree_legged_sdk: https://github.com/unitreerobotics/unitree_legged_sdk/tree/go1
unitree_ros_to_real: https://github.com/unitreerobotics/unitree_ros_to_real/tree/master

3.3 ROSシミュレーションパッケージのビルド

(1) Unitree社が出している unitree_ros のレポジトリからパッケージをインストール

(2) 必要となるツールをインストールする。ターミナルで、

$ sudo apt-get install ros-noetic-controller-interface ros-noetic-gazebo-ros-control ros-noetic-joint-state-controller ros-noetic-effort-controllers ros-noetic-joint-trajectory-controller

(3) このパッケージの unitree_gazebo/worlds/stairs.world ファイルを開き、下部にある

<include>
   <uri>model:///home/unitree/catkin_ws/src/unitree_ros/unitree_gazebo/worlds/building_editor_models/stairs</uri>
</include>

のパスを個人PCでの building_editor_models/stairs のパスに変更する。たとえば、unitree_rosのパッケージが/home/username/catkin_ws/srcにある場合、

<uri>///home/username/catkin_ws/src/unitree_ros/unitree_gazebo/worlds/building_editor_models/stairs</uri>と変更。

(4) ビルド

cd ~/catkin_ws
catkin_make
3.4 Gazeboを起動

Gazeboを起動するために、ターミナルで

$ roslaunch unitree_gazebo normal.launch rname:=go1 wname:=earth

を実行。オプションの rnameではロボットの種類をlaikago(既定)aliengoa1go1の中から指定できます。wnameではワールドの種類をearth(既定), space , stairsの中から指定できます。

3.5 Go1を動かす

パッケージには、Gazebo上のロボットを制御するプログラムのサンプルが含まれています。

Gazeboを起動した後、別のターミナルで

$ rosrun unitree_controller unitree_servo

を実行すると、各関節が動きロボットが立ち上がります。

加えて、以下の2つの制御プログラムを実行することができます。

  • ロボットに外乱を加える
$ rosrun unitree_controller unitree_external_force

矢印キーでx軸正負、y軸正負から外乱の方向を決めることができ、スペースキーで一定モード (既定) または積算モードに変更できます。積算モードで外乱の力を強くしていくと、ある程度でロボットが倒れるのが観察できます。

  • ロボットの位置や姿勢を変更し、原点を中心に回らせる
$ rosrun unitree_controller unitree_move_kinetic

 

4. プログラムの応用

$ rosrun unitree_controller unitree_servoで実行される src/servo.cpp では、各12関節の角度情報を含むMotorCmdメッセージを配信するパブリッシャーを作成し、body.cpp で指定した角度へ動かしています。

各関節の名称と情報

4本の脚

  • FR: right front leg (前右脚)
  • FL: left front leg (前左脚)
  • RR: right rear leg (後ろ右脚)
  • RL: left front leg (後ろ左脚)

3つの関節とその最大最小角度[ラジアン]

  • Hip 関節: 1.047 ~ -1.047 (= 60°~-60°)
  • Thigh 関節: 2.966 ~ -0.663 (= 170°~-38°)
  • Calf 関節: -0.837 ~ -2.721 (= -48°~-156°)

 

Hip の回転軸はx軸、Thigh, Calf の回転軸はy軸となっており、正の方向は右手の法則で定められる方向です。脚が直立している状態が回転角度のゼロとして定められています。

 

動作の作成

src/body.cpp では、paramInit() 関数を呼び出しMotorCmdのmodeやKp, Kdなどの値を設定した後(既に参考値が与えられています)、stand() 関数内で立ち上がった状態の各関節の角度を入力しています。moveAllPosition() 関数では、指定された時間をかけて目標の状態まで徐々にロボットを動かしています。

pos 変数の角度の値はそれぞれ{FR_hip, FR_thigh, FR_calf, FL_hip, FL_thigh, FL_calf, RR_hip, RR_thigh, RR_calf, RL_hip, RL_thigh, RL_calf} に対応しています。

gazeboを起動したときの初期の関節の角度は、おおよそ pos[12] = {-0.35, 1.24, -2.818, 0.35, 1.24, -2.818, -0.35, 1.24, -2.818, 0.35, 1.24, -2.818}となっています。

stand() と同様に各関節の角度を指定すれば、例として以下の動作を確認することもできます。

  • 低姿勢

pos[12] = {0.0, 1.0, -2, -0.0, 1.0, -2, 0.0, 1.0, -2, -0.0, 1.0, -2}

  • ねじりの姿勢

pos[12] = {0.40, 0.65, -1.57, 0.21, 0.87, -1.3, -0.244, 0.44, -1.3, -0.44, 0.98, -1.57}

 

本稿では、Go1をGazeboシミュレータ上で動かす方法をご紹介しました。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です