ロボット制御実験 環境構築ガイド (Windows 版)

このガイドは、システム同定から強化学習までの全実験に必要なソフトウェア環境を、Windows PC に構築するための手順を説明する。主な構成要素は Webots シミュレータと Anaconda (Python) である。

1. Webots シミュレータのインストール

強化学習の実験 (第6回) で使用するロボットシミュレータ Webots をインストールする。

ダウンロード:
  • Webots 公式サイトにアクセスし、「Download」セクションへ進む。
  • お使いの OS (Windows) に対応した最新の安定版 (Stable Release) をダウンロードする。
インストール:
  • ダウンロードしたインストーラーを実行し、画面の指示に従ってインストールを進める。(通常はデフォルト設定のままで問題ない)
確認: インストール後、Webots アプリケーションを起動し、サンプルワールドなどが開けることを確認する。

2. Anaconda (Python 環境) のインストール

全ての実験で使用する Python スクリプトを実行するために、Anaconda または Miniconda を使用して Python 環境を管理する。(すでにインストール済みの場合はこのセクションをスキップし、セクション3に進むこと)

ダウンロード (未インストールの場合):
  • Anaconda (推奨): データサイエンス関連のライブラリが多く含まれる。Anaconda Distribution からダウンロード。
  • Miniconda: より軽量なインストーラー。必要なライブラリは後で追加する。Miniconda Documentation からダウンロード。
インストール (未インストールの場合):
  • ダウンロードしたインストーラーを実行し、指示に従う。
  • インストール中、「Advanced Options」画面で「Add Anaconda3 to my PATH environment variable」にチェックを入れると、通常のコマンドプロンプトや PowerShell から直接 conda コマンドが使えるようになるため便利である。
    (注意: Anaconda は他の Python 環境との競合を避けるため、このオプションのチェックを非推奨としている。もし他の Python を多用する場合は競合のリスクを理解した上でチェックするか、チェックせずに Anaconda Prompt を使用すること。)
  • チェックしない場合は、Windows スタートメニューから「Anaconda Prompt」を起動して conda コマンドを使用するのが基本となる。
【補足】インストール後に conda コマンドが見つからない場合
  • インストール時に「Add Anaconda3 to my PATH...」にチェックを入れなかった場合:
    これは想定通りの動作である。Windows のスタートメニューから 「Anaconda Prompt」 を検索して起動し、そのウィンドウ内で conda コマンドを使用すること。
  • インストール時にチェックを入れたはずなのに conda が認識されない場合:
    • まず PC を再起動してみる。
    • それでも認識されない場合、環境変数 PATH が正しく設定されていない可能性がある。環境変数を手動で設定する方法もあるが、手順がやや複雑になる。不明な場合は、一度 Anaconda をアンインストールし、再度インストール(PATH オプションのチェックを確認して)を試すのが比較的確実である。
    • (手動設定する場合の参考パス例: 通常は C:\Users\YourName\anaconda3\Scripts, C:\Users\YourName\anaconda3\Library\bin, C:\Users\YourName\anaconda3\condabin などが必要になるが、具体的なパスはインストール場所やバージョンにより異なる。)
【推奨】専用 Conda 環境の作成:

実験に必要なライブラリを他の Python プロジェクトと分離し、バージョンの衝突を防ぐために、専用の環境を作成することを強く推奨する。

  1. Anaconda Prompt (または PATH設定済みのコマンドプロンプト/PowerShell) を開く。
  2. 以下のコマンドを実行して、control_lab という名前で Python 3.9 (推奨例) の環境を作成する: conda create --name control_lab python=3.9 (作成を確認するプロンプトが出たら `y` を入力して Enter)
  3. 作成した環境を有効化(アクティベート)する: conda activate control_lab (プロンプトの先頭に (control_lab) と表示されれば成功だ)

以降の Python パッケージのインストールは、必ずこの control_lab 環境がアクティブな状態で行うこと。

3. 必要な Python パッケージのインストール

実験で使用するライブラリをインストールする。

【パッケージのインストール】
  1. Anaconda Prompt (または PATH設定済みのコマンドプロンプト/PowerShell) を開き、必ず control_lab 環境を有効化すること: conda activate control_lab
  2. 以下のコマンドを実行して、基本的な科学計算ライブラリをインストールする (Anaconda を使っていれば既に一部入っている可能性もある): conda install numpy scipy matplotlib (インストールを確認されたら `y` を入力)
  3. 次に、強化学習とハードウェア通信に必要なライブラリを `pip` を使ってインストールする: pip install gymnasium stable-baselines3 torch torchvision torchaudio (stable-baselines3 本体と、PyTorch 等の関連ライブラリをインストールする。もし PyTorch のインストールで問題が出る場合は、PyTorch 公式サイト の指示に従って別途インストールを試みること。)

5. 環境構築の最終確認

  1. Anaconda Prompt (または PATH設定済みのコマンドプロンプト/PowerShell) で、control_lab 環境がアクティブなことを確認する ((control_lab) が先頭に表示)。
  2. Python のバージョンを確認する: python --version
  3. インストールされた主要なパッケージを確認する: conda list (リストに表示され、バージョン情報が出ていれば OK。hidapi は別セクションでインストールする場合あり)
  4. Python インタプリタを起動し (python と入力)、ライブラリが import できるか試す: import numpy as np import matplotlib.pyplot as plt import scipy import gymnasium as gym import stable_baselines3 import torch exit() (エラーなくプロンプトに戻れば成功)
  5. Webots アプリケーションを起動できることを確認する。
【完了】 上記の確認が全て問題なければ、実験に必要な環境の準備は完了である!

6. Webots と Anaconda Python 環境の連携設定

【重要】この設定を行わないと、Webots は正しい Python 環境(control_lab)を見つけられず、コントローラースクリプトがライブラリ不足でエラーになる。

Step 1: control_lab 環境の Python パスを確認する
  1. Anaconda Prompt (または PATH設定済みのコマンドプロンプト/PowerShell) を開く。
  2. まず、作成した Conda 環境を有効化する: conda activate control_lab (プロンプト先頭に (control_lab) が表示されることを確認)
  3. 次に、現在アクティブな環境の Python 実行ファイルのフルパスを調べるコマンドを実行する:
    • Windows の場合: where python

      (もし複数のパスが表示されたら、通常は anaconda3\envs\control_lab 内のパスが対象)

      または、より確実に実行ファイルパスを得るには:

      python -c "import sys; print(sys.executable)"
  4. コマンドは、以下のようなパスを出力する(表示はあなたの環境によって異なる):
    C:\Users\YourName\anaconda3\envs\control_lab\python.exe (Windows 例)
    このフルパス(ファイルの場所全体)をコピーしておく。
Step 2: Webots の設定を変更する
  1. Webots アプリケーションを起動する。
  2. メニューバーから Tools (ツール) -> Preferences... (設定...) を選択する。
  3. 表示された Preferences ウィンドウで、General (一般) タブを選択する。
  4. Python command (Python コマンド) という名前の入力フィールドを探す。
  5. 【設定】このフィールドに、Step 1 でコピーした Python 実行ファイルのフルパスを貼り付ける。パスが正しく、ファイル名 (python.exe) まで含まれていることを確認する。
  6. OK または Apply ボタンをクリックして設定を保存し、Preferences ウィンドウを閉じる。
Webots PreferencesでPythonコマンドのパスを設定する手順のGIFアニメーション

(図:Webots 設定画面での Python パス設定手順)

【設定完了】 これで、Webots はロボットのコントローラとして Python スクリプトが指定された際に、control_lab 環境の Python を使用して実行するようになる。

もし設定後も Python ライブラリが見つからないエラーが出る場合は、パスが正しいか、Conda 環境が壊れていないかなどを再確認すること。

7. 最終動作確認: Webots と Python 環境の連携テスト

このセクションでは、Webots が正しく設定され(セクション6)、作成した Conda 環境 (control_lab) を認識し、その環境にインストールされた Python パッケージ (numpy, matplotlib, scipy, gymnasium, stable_baselines3, torch) を Webots のコントローラースクリプト内から正常に import できるかを最終確認する。

【前提】このテストを行う前に、必ずセクション6の手順を完了し、Webots の Preferences で Python パスが正しく control_lab 環境の python.exe (または相当するもの) に設定されていることを確認すること。

Step 1: テスト用 Python コードの準備
  1. 以下の折りたたみ部分を展開し、「コードをコピー」ボタンをクリックするか、手動でテスト用コード全文をコピーして、クリップボードに準備する。(ファイルとして保存する必要はない)

テスト用 Python コード (コピーして使用):

コードを表示/非表示 (クリックして展開/折りたたみ)

# Copyright 1996-2024 Cyberbotics Ltd.
# ... (license details) ...

"""
This controller primarily tests if required Python packages
(numpy, matplotlib, scipy, gymnasium, stable_baselines3, torch)
are installed and accessible by the Python environment used by Webots.
It incorporates the basic structure of the original 'driver' example
but focuses on the import checks first.
"""

# --- Add these import statements to test your environment ---
print("--- Starting Check: Importing Required Packages ---")
import sys  # Needed for sys.exit() on failure

all_imports_successful = True # Flag to track success

try:
   import numpy as np
   print("[ OK ] Successfully imported numpy")
   # Optional basic check:
   # _ = np.array([1, 2])
   # print("[ OK ] numpy basic functionality check passed")

   # Import matplotlib.pyplot as requested
   import matplotlib.pyplot as plt
   print("[ OK ] Successfully imported matplotlib.pyplot")
   # Note: Using plt functions directly might be complex here,
   # but the import itself tests installation.

   import scipy
   print("[ OK ] Successfully imported scipy")
   # Optional basic check:
   # from scipy import constants
   # _ = constants.pi
   # print("[ OK ] scipy basic functionality check passed")

   import gymnasium as gym
   print("[ OK ] Successfully imported gymnasium")
   # Optional basic check:
   # _ = gym.spaces.Discrete(2)
   # print("[ OK ] gymnasium basic functionality check passed")

   import stable_baselines3
   print("[ OK ] Successfully imported stable_baselines3")
   # Optional basic check:
   # _ = stable_baselines3.A2C
   # print("[ OK ] stable_baselines3 basic functionality check passed")

   import torch
   print("[ OK ] Successfully imported torch")
   # Optional basic check:
   # _ = torch.tensor([1.0, 2.0])
   # print("[ OK ] torch basic functionality check passed")

   print("\n--- Check Complete: All specified packages imported successfully! ---")

except ImportError as e:
   all_imports_successful = False # Mark failure
   print(f"\n!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")
   print(f"[FAIL] FAILED TO IMPORT A REQUIRED PACKAGE: {e}")
   print(f"       Error Type: {type(e)}")
   # e.name often holds the name of the failed module
   module_name = getattr(e, 'name', 'Unknown')
   print(f"       Failed Module: '{module_name}'")
   print(f"       -> Check if '{module_name}' is installed in the Python environment")
   print(f"          that Webots is configured to use.")
   print(f"       -> Verify Path: Webots > Tools > Preferences > Python command")
   print(f"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n")
   # Exit the controller script if an import fails - prevents running Supervisor code
   sys.exit(f"ImportError: Required package '{module_name}' not found or import failed.")
# --- End of added import test section ---


# --- Original Webots example script structure (optional, runs only if imports succeed) ---
# --- This part might produce warnings if the world doesn't match the example exactly ---
if all_imports_successful:
   print("\n[INFO] Imports successful, proceeding with Supervisor initialization (if applicable).")
   from controller import Supervisor
   # Make sure 'common.py' exists if you are using the original example structure, otherwise define dummy
   try:
       # This specific example might not need common.py, adjust if needed
       pass # from common import common_print
   except ImportError:
       # Define a dummy function if needed
       # def common_print(msg): print(f"Dummy common_print: {msg}")
       print("[WARN] 'common.py' not found or not needed for this basic test.")


   class Driver (Supervisor):
       timeStep = 128 # Or get from world basicTimeStep

       def __init__(self):
           super(Driver, self).__init__()
           self.keyboard = None # Initialize to None
           self.timeStep = int(self.getBasicTimeStep()) # Use world timestep

           # Safely try to get keyboard (may not exist)
           try:
               self.keyboard = self.getKeyboard() # Get keyboard device
               if self.keyboard: # Check if keyboard was found
                   self.keyboard.enable(self.timeStep) # Enable keyboard reading
                   print("[INFO] Keyboard enabled for optional interaction.")
               else:
                   print("[WARN] Keyboard device not found in this world.")

           except Exception as e:
               print(f"[WARN] Could not initialize keyboard device: {e}")

       def run(self):
           print("[INFO] Controller 'run' method started.")
           print("[INFO] Primary goal (import tests) already passed.")
           print("[INFO] This controller will now run passively.")
           if self.keyboard:
                print("[INFO] You can press keys (if defined below) but main focus was imports.")
           # Passive loop to keep controller alive and show simulation running
           while self.step(self.timeStep) != -1:
               # Optionally add key checks here if needed for further testing
               # k = self.keyboard.getKey() if self.keyboard else -1
               # if k == ord('I'): print("Info key pressed")
               pass # Just keep stepping

           print("[INFO] Driver run loop finished or simulation stopped.")

   # --- Script execution ---
   if all_imports_successful:
       print("[INFO] Initializing Driver controller...")
       controller = Driver()
       print("[INFO] Starting controller run loop (passive)...")
       controller.run()
       print("[INFO] Controller run loop exited.")
   else:
       print("[INFO] Script halted due to import errors. Supervisor code was not executed.")

else:
    print("[INFO] Script halted before Supervisor initialization due to import errors.")
Step 2: Webots でテストを実行する
  1. Webots アプリケーションを起動する。
  2. メニューから File -> Open Sample World... を選択する。
  3. 表示されるウィンドウで、フォルダを次のように辿って examples.wbt を選択し、開く:
    • languagespythonexamples.wbt
    (このワールドには、Python コントローラーの基本的な使用例が含まれている。)
  4. ワールドがロードされると、ウィンドウ右側にテキストエディタが表示され、driver.py の内容が自動的に開かれる。(スクリーンショットで示されている通りである)
  5. テキストエディタ内で以下の操作を行う:
    • エディタ内の既存のコードを全て選択する (Ctrl+A またはマウスでドラッグ)。
    • 選択したコードを削除する (Delete キー または Backspace キー)。
    • Step 1 でコピーしたテスト用 Python コードをエディタ内に貼り付ける (Ctrl+V)。
    • エディタの内容を保存する。メニューの File -> Save Text File を選択するか、Ctrl+S キーを押す。
  6. Webots の上部に「World file has been modified...」やリロードを促すメッセージが表示されたら、「Reload」ボタンまたは回転矢印アイコンをクリックする。(保存後に自動でリロードされる場合もある)
  7. シミュレーション実行ボタン (▶ アイコン) をクリックして、シミュレーションを開始する。
Step 3: Webots コンソールの出力を確認する
  1. シミュレーションが開始されると、Webots ウィンドウの下部にあるコンソール(Console)にメッセージが出力される。
  2. 【成功の場合】 以下のように、テストコード内で指定した全てのライブラリについて [ OK ] Successfully imported ... というメッセージが表示され、最後に --- Check Complete: All specified packages imported successfully! --- が表示されていれば、連携は成功である!
    --- Starting Check: Importing Required Packages ---
    [ OK ] Successfully imported numpy
    [ OK ] Successfully imported matplotlib.pyplot
    [ OK ] Successfully imported scipy
    [ OK ] Successfully imported gymnasium
    [ OK ] Successfully imported stable_baselines3
    [ OK ] Successfully imported torch
    
    --- Check Complete: All specified packages imported successfully! ---
    
    [INFO] Imports successful, proceeding with Supervisor initialization (if applicable).
    ... (以降のINFO/WARNメッセージ) ...
    
  3. 【失敗の場合】 もし [FAIL] FAILED TO IMPORT A REQUIRED PACKAGE: ... というエラーメッセージが表示された場合、そのライブラリの import に失敗している。エラーメッセージに表示されている `Failed Module: 'xxx'` を確認する。
    • 対処法:
      • セクション6に戻り、Webots の Preferences で設定した Python のパスが、control_lab 環境の正しい python.exe を指しているか再確認する。
      • セクション3に戻り、Anaconda Prompt で conda activate control_lab を実行した後、エラーになったパッケージ(例: `pip install torch` や `conda install scipy` など)が正しくインストールされているか確認、または再インストールしてみる。
【最終確認完了】 コンソールで全てのパッケージが [ OK ] となり、[FAIL] が表示されなければ、Webots と control_lab Python 環境の連携設定は正しく完了しており、必要なライブラリも Webots から利用可能である!これで実験を進める準備が整った。