Unitree Go1のLow level制御が手軽に体験できるサンプルの紹介

1. 概要

Unitree社のgithubに掲載されている「unitree_guide」を実行してみました。

unitree_guideには、Unitree社が発行している四足歩行ロボットの教科書に対応したプログラムが格納されており、四足で立った姿勢を保持するバランスコントローラや、12個のモータを制御して歩行パターンを生成する処理などを、low level APIを使って実現しています。

これらを動かすことで、gazebo上でのシミュレーションはもとより、実ロボットをlow level APIを使って歩行させることもできます。

まずは実行してシミュレータ上でのlow level制御を体験してみましょう。

 

2. Unitree Go1のlow level制御とは?

Unitree社の四足歩行ロボットには、ユーザの作成するプログラムから歩行をコントロールするためのAPIとして、「High level API」と「Low level API」の2種類が用意されています。

High level APIは、ロボット本体を前後左右に動かしたり、静止しているロボット本体の姿勢を変えるといった比較的分かりやすい切り口であり、これを使ってロボットを所定の場所まで歩かせるといった動きが比較的簡単に実現できるものです。

一方、Low level APIは、ロボットの各脚の関節に付けられている3個×4脚=12個のモータの動きを直接指定するものであり、モータをどのように操れば歩行やダンスなどの複雑な動きができるかは、直感的には分からない切り口です。

通常、モータの動きは、ロボットを歩行させるための運動学に基づいて指定する必要があり、うまく指定しないと歩行や姿勢が維持できず転倒してしまいます。ですが、Low level APIを使った制御(Low level 制御)を使いこなすことが出来れば、アクロバット的な動きが可能となったり、効率的な動きをしてバッテリーの消費を抑えた長時間歩行が可能となったり、バランスを崩しても転倒しにくい制御が可能になるなど、実用範囲が広がります。

また、最近では、シミュレータ上で機械学習によりモータの動きを学習させて、運動学によらない新たな歩行方法やバランス制御などを実現している例もあり、制御理論だけでなくAI研究の対象にもなるなど、Low level 制御を利用したいというユーザも増えつつあります。

 

3. 実行環境

ここでは、windows PC上でWSL2を使ってubuntu linuxを立ち上げ、その中でROSの環境を整備してunitree_guideを実行する手順について述べます。

実世界での動きをシミュレーションしますので、使用するPCはある程度以上の性能がないと、歩行の動きは飛び飛びになってしまいます。

  • PC:  Core-i7、メモリ32Gbyte以上が推奨 (Core-i5、メモリ16Gbyteでは歩行が遅く飛び飛びの動きになります)
  • ホストOS:  Windows 10 バージョン2004以上 (ビルド19041以上)
  • 仮想環境: WSL2
  • 仮想環境上のOS: Ubuntu 20.04
  • ROSバージョン: ROS noetic (ros-noetic-desktop-full)

     

    3.1 WSL2およびROSのセットアップ

    まずWindows OS上にWSL2とUbuntu 20.04をインストールします。

    さらにUbuntu 20.04にROS noeticをインストールします。

    これらの手順については、「WindowsのWSL2ROSをインストールし、MG400rviz上で動かす方法」の「3-4. ROSの環境設定」までを参照ください。

     

    3.2 unitree_guideのビルド

    ROSの環境が整ったら、次の手順でunitree_guideをビルドします。

     

    (1)ワークスペースの作成

    unitree_guideをビルドするためのワークスペース (ここではunitree_wsとします) を作成します。

    mkdir -p ~/unitree_ws/src

     

    (2)必要なリポジトリのコピー

    ワークスペース内に、Unitree社のgithubから、unitree_guideおよび必要なリポジトリをコピーします。

    git clone https://github.com/unitreerobotics/unitree_guide
    git clone https://github.com/unitreerobotics/unitree_ros
    git clone https://github.com/unitreerobotics/unitree_ros_to_real

     

    (3)必要なパッケージ・ライブラリのインストール

    ビルドに必要なROSパッケージやライブラリをインストールしておきます。

    sudo apt install ros-noetic-move-base-msgs
    sudo apt install liblcm-dev

     

    (4)unitree_guideのビルド

    準備が整ったらunitree_guideをビルドします。

    cd ~/unitree_ws
    catkin_make

     

    4. さあ、動かしてみよう

    シミュレータ上で動かすには、(1)シミュレータを起動する端末 と、(2)シミュレータ内のGo1に指示を与えるコントローラを実行する端末 の2つの端末ウィンドウが必要になります。

    それぞれ、次の手順にてプログラムを実行します。

    (1)1つめの端末での操作 (シミュレータを起動)
    cd ~/unitree_ws
    source devel/setup.bash
    roslaunch unitree_guide gazeboSim.launch
    (2)2つめの端末での操作 (コントローラを実行)
    cd ~/unitree_ws
    source devel/setup.bash
    ./devel/lib/unitree_guide/junior_ctrl

     

    1つめの端末でシミュレータを起動して下記のような画面が現れたら、2つめの端末でコントローラを実行します。

     

    シミュレータ内のGo1への指示は、2つめの端末をクリックしてアクティブになっている状態で、キーボードからキーを入力することで行うことが可能です。

    キー 動作
    ‘1’ モータOFF (L2-B相当)
    ‘2’ 立ち上がり静止 (L2-A L2-A相当)
    ‘4’ 歩行動作に移行 (START相当)
    ‘w’ 前進  

     

    キーを押すたびに加速

    ‘a’ 左横歩き
    ‘s’ 後退
    ‘d’ 右横歩き
    ‘j’ 左旋回
    ‘l’ 右旋回
    ‘ ‘ 停止 動きの値を0にリセットする

     

    操作例として、次のキーを順番に押して、ロボットを立ち上がらせて前進させてみましょう。

     '2' キー
     '4' キー
     'w' キー
     'w' キー

    次のような動きになります。

     

    このとき、2つめの端末から次のメッセージが頻繁に出る場合には、コントローラからロボットへ定期的に与える指令値の送信頻度が遅くスムースな制御ができていないことになりますので、シミュレータ上の動きもぎごちなくなっている可能性があります。

    [WARNING] The waitTime=2000 of function absoluteWait is not enough!
    The program has already cost 3588us.

     

    コントローラを介したGo1への指示は、前進や後退などHigh level制御相当のもののため、あまりlow level制御の実感がありません。しかし、例えば下記の動画のように体をひねりすぎてバランスを崩しかけている状態では、バランスコントローラの働きにより、体勢を立て直すために足踏みをする動作が見られるなど、前後左右の動きのためだけでない足踏みの様子が分かります。

     

     

    また、下記のように、~/unitree_ws/src/unitree_guide/unitree_guide/src/main.cpp の79~80行目のコメントアウトを変更してビルドすることで、クロール歩行などの別の歩行パターンをシミュレータ上で実行することができます。

     

    【変更前】

     79    ctrlComp->waveGen = new WaveGenerator(0.45, 0.5, Vec4(0, 0.5, 0.5, 0)); // Trot
     80    // ctrlComp->waveGen = new WaveGenerator(1.1, 0.75, Vec4(0, 0.25, 0.5, 0.75)); //Crawl, only for sim
     81    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.6, Vec4(0, 0.5, 0.5, 0)); //Walking Trot, only for sim
     82    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.35, Vec4(0, 0.5, 0.5, 0)); //Running Trot, only for sim
     83    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.7, Vec4(0, 0, 0, 0)); //Pronk, only for sim

     

    【変更後】

     79    // ctrlComp->waveGen = new WaveGenerator(0.45, 0.5, Vec4(0, 0.5, 0.5, 0)); // Trot
     80    ctrlComp->waveGen = new WaveGenerator(1.1, 0.75, Vec4(0, 0.25, 0.5, 0.75)); //Crawl, only for sim
     81    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.6, Vec4(0, 0.5, 0.5, 0)); //Walking Trot, only for sim
     82    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.35, Vec4(0, 0.5, 0.5, 0)); //Running Trot, only for sim
     83    // ctrlComp->waveGen = new WaveGenerator(0.4, 0.7, Vec4(0, 0, 0, 0)); //Pronk, only for sim

     

     

     

    5. 終わりに

    以上のように、Unitree社のgithubに掲載されている unitree_guide を使うことで、シミュレータ上でlow level制御による歩行が体験できます。

    さらに設定ファイルの内容を変更することで、実際のロボットをlow level制御により歩行させることも可能ですので、こちらについてはまた別記事にて。

    追記:
    メーカーのunitree_guideに関する記事も追加されていますのでこちらも併せてご参照ください。
    Algorithm_Practice – Unitree Documentation Center

     

    以上

     

     

    1件のコメント

    1. ピンバック: Unitree Go1をlow level制御で歩行させる手順の紹介 – TechShare FAQ

    コメントを残す

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