Unitree Go1をlow level制御で歩行させる手順の紹介

1. はじめに

本稿は、前作の記事「Unitree Go1のLow level制御が手軽に体験できるサンプルの紹介」の続編です。

前作では、Unitree社のGithubにあるunitree_guideというリポジトリを使って、Go1をシミュレータ上でLow level制御で動かしました。本稿では、同じくunitree_guideを使って、Low level制御で「実際のGo1ロボット」を動かす手順をまとめています。

Low level制御で四足歩行ロボットを動かそうとすると、1からプログラミングを始めると、転倒したり想定外の動きをして、なかなか歩行させることができません。一方で、unitree_guideのような動作確認が取れているプログラムであれば、実際のロボットがLow level制御で歩行する様子をすぐに楽しめます。四足歩行ロボットの歩行制御を研究するには、きちんと歩行する状態から始める方が進めやすい場合もあることでしょう。その手助けとなるよう、手順をまとめました。

 

2. High level制御と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. 実行環境

前作と同様、ハイスペックなPCが必要となります。

また、前作と同様、プログラムをビルドする際にROSを使うため、windows PC上でWSL2を使ってubuntu linuxを立ち上げます。

  • PC:  Core-i7、メモリ32Gbyte以上が推奨 (低スペックのPCでは処理が追い付かず歩行が不安定になる可能性があります)
  • ホストOS:  Windows 10 バージョン2004以上 (ビルド19041以上)
  • 仮想環境: WSL2
  • 仮想環境上のOS: Ubuntu 20.04
  • ROSバージョン: ROS noetic (ros-noetic-desktop-full)

 

4. まずはシミュレータで動かしてみよう

前作の「3.1 WSL2およびROSのセットアップ」以降の手順に従って、シミュレータ上でLow level制御でロボットを動かしてみましょう。

シミュレータ上で動くことが確認できたら、以降の手順に従って、リアルなロボットを動かすための設定変更を行います。

 

5. リアル動作に切り替えるための設定

unitree_guideのプログラムは、制御対象をシミュレータ上のロボットにするか実際のロボットにするかを、設定ファイルで切り替えることができるようになっています。

ただし、実際のロボットを制御対象にした場合、ロボットのコントロール手段もリアルなものに置き換わって、ロボット付属のコントローラで操作することになります。

シミュレータ上で動かしていた時と同じように、PCからキーボード操作でロボットを操作したい場合には、プログラムを数行変更する必要があります。

これらについて以降で説明します。

 

5.1 設定ファイルの変更

以降では、unitree_guideをインストールしたワークスペースをunitree_wsとします。

制御対象をシミュレータ上のロボットにするか実際のロボットにするかの切り替えは、~/unitree_ws/src/unitree_guide/unitree_guide/CMakeLists.txt の8~9行目に記述されている設定を変更することでできます。SIMULATIONがONでREAL_ROBOTがOFFならシミュレータ上のロボット、SIMULATIONがOFFでREAL_ROBOTがONなら実際のロボットです。

【変更前】

  1    cmake_minimum_required(VERSION 3.14)
  2    project(unitree_guide)
  3    
  4    set(ROBOT_TYPE Go1) # The type of robot, support Go1 and A1 currently
  5    set(PLATFORM amd64) # The platform to compile, support amd64 and arm64
  6    
  7    set(CATKIN_MAKE ON) # Use CATKIN_MAKE or not, ON or OFF
  8    set(SIMULATION ON) # Use Gazebo or not, ON or OFF
  9    set(REAL_ROBOT OFF) # Link real robot or not, ON or OFF
 10    set(DEBUG OFF) # Use debug functions or not, ON or OFF
 11    set(MOVE_BASE OFF) # Need move_base or not, ON or OFF

 

【変更後】

  1    cmake_minimum_required(VERSION 3.14)
  2    project(unitree_guide)
  3    
  4    set(ROBOT_TYPE Go1) # The type of robot, support Go1 and A1 currently
  5    set(PLATFORM amd64) # The platform to compile, support amd64 and arm64
  6    
  7    set(CATKIN_MAKE ON) # Use CATKIN_MAKE or not, ON or OFF
  8    set(SIMULATION OFF) # Use Gazebo or not, ON or OFF
  9    set(REAL_ROBOT ON) # Link real robot or not, ON or OFF
 10    set(DEBUG OFF) # Use debug functions or not, ON or OFF
 11    set(MOVE_BASE OFF) # Need move_base or not, ON or OFF

 

5.2 キーボード入力に変更

前述の設定ファイルの変更により制御対象を実際のロボットに切り替えると、入出力を司るプログラムが ~/unitree_ws/src/unitree_guide/unitree_guide/src/interface/IOROS.cpp から ~/unitree_ws/src/unitree_guide/unitree_guide/src/interface/IOSDK.cpp に切り替わります。

これにより、Low level APIの出力先が、シミュレータとのROS通信から実際のロボットとのUDP通信に置き換わると同時に、ロボット操作の読み取り先も、PCのキーボードからロボット付属のコントローラに切り替わります。ロボット付属のコントローラの値は、ロボットを経由してLow level APIから取得でき、この値に応じてロボットの操作が決定されます。

 

Low level APIの出力先は実際のロボットのままで、操作の入力をキーボードから行うようにするには、IOSDK.cppを次のように変更します。

(8行目に追加し、もとの14行目を変更)

【変更前】

  1    /**********************************************************************
  2     Copyright (c) 2020-2023, Unitree Robotics.Co.Ltd. All rights reserved.
  3    ***********************************************************************/
  4    #ifdef COMPILE_WITH_REAL_ROBOT
  5    
  6    #include "interface/IOSDK.h"
  7    #include "interface/WirelessHandle.h"
  8    #include <stdio.h>
  9    
 10    #ifdef ROBOT_TYPE_Go1
 11    IOSDK::IOSDK():_safe(UNITREE_LEGGED_SDK::LeggedType::Aliengo), _udp(UNITREE_LEGGED_SDK::LOWLEVEL, 8090, "192.168.123.10", 8007){
 12        std::cout << "The control interface for real robot" << std::endl;
 13        _udp.InitCmdData(_lowCmd);
 14        cmdPanel = new WirelessHandle();

 

【変更後】

  1    /**********************************************************************
  2     Copyright (c) 2020-2023, Unitree Robotics.Co.Ltd. All rights reserved.
  3    ***********************************************************************/
  4    #ifdef COMPILE_WITH_REAL_ROBOT
  5    
  6    #include "interface/IOSDK.h"
  7    #include "interface/WirelessHandle.h"
  8    #include "interface/KeyBoard.h"   /*追加*/
  9    
 10    #include <stdio.h>
 11    #ifdef ROBOT_TYPE_Go1
 12    IOSDK::IOSDK():_safe(UNITREE_LEGGED_SDK::LeggedType::Aliengo), _udp(UNITREE_LEGGED_SDK::LOWLEVEL, 8090, "192.168.123.10", 8007){
 13        std::cout << "The control interface for real robot" << std::endl;
 14        _udp.InitCmdData(_lowCmd);
 15        cmdPanel = new KeyBoard();  /*変更*/

 

5.3 PCのIPアドレスの設定

Go1内部のコントローラへUDP通信するためには、unitree_guideを実行するPCのネットワークアドレスを、Go1内部のネットワークと同じアドレス体系(192.168.123.x)にする必要があります。

今回は、unitree_guideを実行するPCとGo1とを、LANケーブルでつなぐことにします。そのため、PCのLANインタフェースのアドレスに、固定アドレス値を設定 (ここでは192.168.123.20 を設定) します。

固定アドレスの設定方法は、関連記事「【Unitree Go1】外部PC上でunitree_legged_sdkを実行する方法」の「2.unitree_legged_sdkのダウンロード&実行(有線接続)」の「その後、外部PCでネットワーク設定を行います:」以降の手順を参照ください。

 

6. Go1の起動

設定ファイル等の変更が完了したら、ワークスペース直下でcatkin_makeを実行します。

cd ~/unitree_ws
catkin_make

エラーなく完了したら、PCとGo1とをネットワークケーブルで接続しましょう。

Go1の電源を入れ、1~2分程度待つと、Go1が立ち上がり頬のLEDが点灯します。

これでGo1は起動完了しましたが、実はGo1内部では姿勢を制御するためのプログラムが動いています(そのため立ち上がった姿勢が維持できています)。

このままでは、Low level APIによるUDP通信が常に行われた状態となっており、これから動かそうとするLow level制御のプログラムと競合してロボットの動きがおかしくなってしまいます。そこで、ジョイスティックコントローラを使って、Go1内部で起動しているプログラムを停止させる必要があります。

ただし、いきなり停止させると、立っている状態のロボットが突然脱力してしまうため、ロボットを伏せ状態にしてからプログラムを停止させましょう。

具体的には、次の手順でジョイスティックコントローラを操作してください。これにより、シャーというモータ音がなくなり静かになります。

L2-A
L2-A
L2-B
L1-L2-START

 

7. 動かしてみよう!

いよいよ、unitree_guideのプログラムを使って、Go1をLow level制御で歩行させてみましょう。

制御プログラムの起動方法は、次の通りです。

cd ~/unitree_ws
source devel/setup.bash
./devel/lib/unitree_guide/junior_ctrl

プログラムを起動したときに、もし、次のようなエラーが出た場合には、制御プログラムを管理者権限で実行する必要があります。

[ERROR] Function setProcessScheduler failed.

このエラーを無視してロボットを操作すると、ロボットとのLow level APIによる制御に遅延が発生して、ロボットはうまく動きません。ctrl-Cで制御プログラムを止め、sudo -sで管理者(root)のシェルを起こしてから、再度、制御プログラムを実行するようにしてください。

sudo -s
source devel/setup.bash
./devel/lib/unitree_guide/junior_ctrl

 

7.1 通常歩行

制御プログラムが起動したら、PCのキーボードから次のキーを順番に押して、直進歩行をさせてみましょう。

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

次の動画のようにロボットが立ち上がり、ゆっくりと前進を始めます。

停止させるにはスペースキーを押します。

 

なお、キーと動作の割り当ては次の通りです。

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

 

キーを押すたびに加速

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

 

7.2 Crawl歩行

前作と同様、main.cppを編集して、Crawl歩行に切り替えてみましょう。変更方法は、前作の「4. さあ、動かしてみよう」の後半を参照ください。

直進歩行させたときの様子は次の動画の通りです。

なお、main.cppにコメントで記述されているように、Crawl歩行は本来はシミュレーション用の歩行パターンであり、実際に歩行させると転倒しやすいため、注意して操作しましょう。

 

 

8. 終わりに

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

このプログラムを元にしてロボットの歩行をカスタマイズしたり、機械学習に使うなど、応用を進めてください。

 

以上

 

コメントを残す

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