1. この記事の概要
私は CoppleiaSim v4.7.0 を使っていたのですが、どうしても Python から Remote API に疎通ができない事象が発生しました。
その原因について調べた結果、 CoppeliaSim の API の仕様が、あるバージョンを境に大きく変わった( Legacy API -> ZeroMQ Remote API )ため、古いソースコードでは新しい API と疎通ができなくなったようでした。
その解決策については現在模索中ではあるものの、現在判明している事項を記載していきます。
2. 問題の詳細について
2-1. Legacy API とは
ChatGPT によると、 CoppeliaSim v4.3.0 以前で使用されていたようです。
最近のバージョンの CoppeliaSim を公式 Web サイトからダウンロードすると、 ZeroMQ Remote API を使うソフトウェアしかダウンロードできません。1
Legacy API は長いので、以降この記事では「旧 API」と呼称します。
2-2. 旧 API のコードを動かすことはできる?
現時点では、旧 API のコードをそのままで動作させる方法は未確認です。私は ChatGPT にかなりしつこく質問したのですが、解決策は見つけられませんでした。
2-3. 新しい CoppeliaSim の API について
新しい API かどうかを確認する方法は簡単です。API の port 番号が違います。新しい API では 23000 や 23050 が用いられていることが確認できました。
これは新しい API (ZeroMQ Remote API) の port 番号です。
ちなみにですが、 Python のソースコード側を書き換えて、リクエスト先の port 番号だけ 19997 から 23000 や 23050 へと変更して実行もしてみましたが、結局 API アクセスには失敗しました。
3. 現状の確認方法
3-1. 旧 API を使っているコードかどうかの見分け方
旧 API を使っているコードでは、以下のような記述が見られます。
vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5) # Connect to V-REP on port 19997
見分けるポイントは以下の2点です。
-
simxStart()というメソッド名のようにsimxという prefix がついている - 接続先の port 番号が
19997
このような特徴が見られる場合は、旧 API を使っていると考えられます。
参考ですが、私が出くわしたのは以下のコードです。
これは、Learning Synergies between Pushing and Grasping with Self-supervised Deep Reinforcement Learning という論文で使用されている実装コードです。
2018年の論文ですが、それでも旧コードです。
3-2. どの port が開かれているか確認する
基本的には、 CoppeliaSim を立ち上げて UI が画面上に表示されていたら、 Remote API の port も開いています。
そのことは、普段使っているターミナルで以下のように確認できます(CoppeliaSim のターミナルじゃなくて、 Mac 備え付けの標準ターミナルでコマンドを実行すればOK)。
% nc -vz 127.0.0.1 23000
Connection to 127.0.0.1 port 23000 [tcp/inovaport1] succeeded!
% nc -vz 127.0.0.1 23050
Connection to 127.0.0.1 port 23050 [tcp/*] succeeded!
% nc -vz 127.0.0.1 19997
nc: connectx to 127.0.0.1 port 19997 (tcp) failed: Connection refused
4. 対策
まだわかっていること、整理できていることは少ないですが、徐々に追記していきます。
4-1. 必要な Python ライブラリ
新 API である ZeroMQ Remote API へアクセスするため、以下のライブラリを requirements.txt に記載しました。
# Legacy Remote API ではなく ZeroMQ Remote API を使うために必要
coppeliasim-zmqremoteapi-client==2.0.4
このライブラリを使うことで、少なくとも新 API (ZeroMQ remote API) にアクセスできることが確認できました。
が、書き換える必要のある箇所が非常に多く、元のコード全てが動く状態には至っていません。
4-2. API コネクションの作成
API への疎通は以下のように変更することで成功することが確認できました。
# old
- from simulation import vrep
-
- sim_client = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)
# new
+ from coppeliasim_zmqremoteapi_client import RemoteAPIClient
+
+ client = RemoteAPIClient(host='127.0.0.1', port=23000)
このような置き換えを、 vrep (や、simxStart で生成されたインスタンス sim_client) を使用しているところ全てに対して行っていく必要がありそうです(´・△・)
まだまだ道半ばですが、頑張ります( *`ω´*) ≡3≡3 ふんす!
4-3. simxCallScriptFunction の置き換え
見た感じかなり難航しそうなので、関連がありそうなリンクを貼っておく。
旧ライブラリのドキュメント
新ライブラリのドキュメント
これらの対応関係を解き明かす必要がありそう。
情報量が少ないけど、もしかしたらこっちのメソッドを使う必要があるかもしれない...。
参考記事
1. CoppeliaSim の「最新でない」バージョンを入手する方法
CoppeliaSim の v4.7.0 は以下の記事の方法で入手しました。
2. ZeroMQ remote API の公式ドキュメント
ZeroMQ remote API の使い方は以下に書かれている。これらを駆使して解決する必要があるということはわかる...。
3. ZmqRemoteAPI 公式リポジトリ
自動コーディングツールの Cline に問題の修正をさせているのだけど、 Cline はこのリポジトリを果敢にも果敢にも直接見に行っていた...(´;ω;`)
