fkanehiro / hrpsys-base

Basic RT components and utilities to control robots using OpenRTM
Other
40 stars 87 forks source link

hrpsys-simulatorが動いているようにみえて、activate状態にならない #20

Closed fkanehiro closed 10 years ago

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 27, 2012 16:58:12

金広さん 東京大学の野沢です。 お世話になっております。

hrpsys-simulatorを使用させていただいております。 シミュレータ自体は走っていて、RTCとしてactivate されていない状況になっており、ご相談させていただきたく存じます。

実行は ubuntu 10.04 (32bit, 64bit)で、rtm-ros-roboticsの roslaunch hrpsys hrp4c.launch を実行しております。

症状は、hrpsys Viewerがたちあがり、Fps およびTimeの数値が動いており、 シミュレーション自体はされているように見えます。 一方、rtm.pyをimportしたpythonスクリプトで rtm.serializeComponents([sim, seq, sh, log, hgc]) sim.start() # simがsimulatorのインスタンです のようにすると、start()関数が返ってきません。 止まっている箇所は while self.isInactive(): time.sleep(0.01) の部分で、hrpsys-simulatorがactivateしても active状態になっていないようです。

hrp4c.launchの中でのhrpsys-simulatorの実行の際の引数と出力を以下に付します。 気になるのは、出力の中で factory name for HRP4C(Robot)0 is not defined と一行でています。

他にチェックすべき項目・送るべきエラーメッセージ等ございましたらご連絡ください。 よろしくお願いいたします。

Original issue: http://code.google.com/p/hrpsys-base/issues/detail?id=20

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 27, 2012 06:00:37

いくつか確認させてください。 ・hrpsys-baseはどのディレクトリ(trunk, tags/3.1.3)のどのリビジョンでしょうか? ・active状態になっていないのは何という名前のコンポーネントでしょうか? ・simというのはSimulatorコンポーネントでしょうか?だとするとhrpsys-simulator自体がシミュレータなので不要なはずです ・HRP4C.xmlに次のような行はありますか?

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 27, 2012 06:32:07

金広さん、返信ありがとうございます。

・hrpsys-baseはどのディレクトリ(trunk, tags/3.1.3)のどのリビジョンでしょうか? tags/3.1.3を使用しております。

・HRP4C.xmlに次のような行はありますか? はい、ございます。 したがって、hrpsys-simulatorがHRP4C(Robot)0という名前で立ち上がっております。

・simというのはSimulatorコンポーネントでしょうか?だとすると いえ、これはSimulatorコンポーネントでなく、 HRP4C(Robot)0のインスタンスです。 hrpsys-simulatorが立ち上がった後に、 rtm.pyを使用したpythonスクリプトで

  1. HRP4C(Robot)0をfindRTCする (sim)
  2. SequencePlayer, StateHolderなどをマネージャ上(hrpsys-simulator上)にloadとcreateする (seq, sh)
  3. rtm.serializeComponents([sim, seq, sh, log, hgc]) してそれぞれstartする を実行しておりましたが、こちらの手順は 以前のバージョン(Simulatorコンポーネント使用時のバージョン)の ままになっており、もしかすると使用方法を誤っているかもしれません。

具体的なコードは以下です。 http://code.google.com/p/rtm-ros-robotics/source/browse/trunk/rtmros_common/hrpsys/scripts/hrpsys.py > ・active状態になっていないのは何という名前のコンポーネントでしょうか? activateになっていないのは、 HRP4C(Robot)0、SequencePlayer, StateHolder、DataLoggerです。 rtshellやrtsystem editorで参照およびactivateしてみましたが かわりませんでした。

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 27, 2012 06:42:37

まずはpythonスクリプトを実行せずにhrpsys-simulatorだけ実行した場合はどうか確認してください。 それと(これは関係があるか分かりませんが)HGcontrollerがhrpsys-simulatorへの引数によって生成されるものと、pythonスクリプトからは新たに生成せずにfindRTC()してHGcontroller0を取得して使用するようにしてください。

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 27, 2012 06:52:33

pytonスクリプトを使用せずhrpsys-simulatorのみ起動した状態では、 HGcontrollerがactiveでHRP4C(Robot)0はactiveではなく、 HRP4C(Robot)0はactivateもできませんでした。

それと(これは関係があるか分かりませんが)HGcontrollerがhrpsys-simulatorへの引数によって生成されるものと、pythonスクリプトからは新たに生成せずにfindRTC()してHGcontroller0を取得して使用するようにしてください。 ご指摘ありがとうございます。 pytonスクリプト内のHGcontrollerもcreateでなくfindRTCにしてみましたが、 HRP4C(Robot)0と同様、同じ実行コンテクスト上にcreateされて RTC群(SequencePlayer, Stateholderなど)のstartができませんでした。 原因は、rtm.pyレベルではRTCがactivateにならないためで同様でした。

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 27, 2012 06:56:46

妙ですね。 HRP4C.xmlは特にいじってないでしょうか?

という行はありますか?

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 27, 2012 07:06:42

はい、

の記載はあります。

hrpsys-simulator で -o exec_cxt.periodic.type:SynchExtTriggerECの引数を与えて実行コンテキストを指定しない場合には、 HRP4C(Robot)0やその他RTC群のactivateができることを確認しました。

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 27, 2012 07:28:08

ちなみに/home/leus/ros/electric/rtm-ros-robotics/rtmros_common/hrpsys/share/hrpsys/samples/HRP4C/へ行って hrpsys-simulator HRP4C.xml とするとどうなりますか? 僕の環境では以下のような出力で問題なく動作します。

HGcontroller0: onInitialize() createBody(HRP4C(Robot)0,file:///home/kanehiro/openrtp313/share/hrpsys/samples/HRP4C/HRP4Cmain.wrl) Warning: Model HRP4 has empty joint ID in the valid IDs. Warning: Model HRP4 has empty joint ID in the valid IDs. Loading body customizer "/home/kanehiro/openrtp313/share/OpenHRP-3.1/customizer/libSampleCustomizer.so" for springJoint createBody(longfloor,file:///home/kanehiro/openrtp313/share/OpenHRP-3.1/sample/project/../model/longfloor.wrl) cache found for file:///home/kanehiro/openrtp313/share/OpenHRP-3.1/sample/project/../model/longfloor.wrl HGcontroller0:0.005 HRP4C(Robot)0:0.005 making a connection between HGcontroller0.qOut and HRP4C(Robot)0.qRef making a connection between HGcontroller0.dqOut and HRP4C(Robot)0.dqRef making a connection between HGcontroller0.ddqOut and HRP4C(Robot)0.ddqRef number of receivers:2 timestep = 0.005, total time = 20 HGcontroller0: onActivated(0) BodyRTC::onActivated(0)

違いは、エラーメッセージの代わりに HRP4C(Robot)0:0.005 と表示されて、その後のnumber of receiversも1から2になっています。 問題はHRP4C(Robot)0が2行目で生成されているにも関わらず、エラーメッセージが出るときにはそれが存在していないかのように見えているというところにありそうです。

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 27, 2012 20:29:51

金広さん

ちなみに/home/leus/ros/electric/rtm-ros-robotics/rtmros_common/hrpsys/share/hrpsys/samples/HRP4C/へ行って hrpsys-simulator HRP4C.xml とするとどうなりますか? 実行ディレクトリを変えても同様にうまくいきませんでした。

問題はHRP4C(Robot)0が2行目で生成されているにも関わらず、エラーメッセージが出るときにはそれが存在していないかのように見えているというところにありそうです。 おっしゃる通りこちらが怪しいと思い調べたところ、 initRTSでの初期化時にシミュレータのRTCにそもそもHRP4C(Robot)0と名前がついておらず、 かつ以降ではHRP4C(Robot)0にて名前検索するため、 うまく動いていないようでした。

以下のようにためしに該当するシミュレータにsetInstanceNameして HRP4C(Robot)0の名前を確実につけるようにすると、

HRP4C(Robot)0:0.005 や number of receivers:2 がでるようになり、HRP4C(Robot)0が正常にactivateされるようになりました。 また、同じ実行コンテキスト上でSeq等もcreate + activateして、 loadPatternなどでシミュレータ上のモデルが動くところまで確認できました。

したがってこの辺の名前の付け方に問題がありそうですが、 金広さんの環境ではProjectUtil.cppのinitWorld内のどの時点で シミュレータのRTCにHRP4C(Robot)0という名前がついてますでしょうか。

なお、こちらの環境は OpenRTM => OpenRTM-aist-1.0.0 OpenHRP3 => OpenHRP-3.1.3 hrpsys-base => tags/3.1.3 です。

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 27, 2012 21:04:20

getInstanceName()するとGLbodyRTC0が返ってきて、でもネームサーバにはHRP4C(Robot)0として登録されているという状況でしょうか。 これはOpenRTM MLの807で報告されている1.0.0のバグのように見えます。 こちらはOpenRTM-1.1.0を使っているので現象が再現できなかったのかも知れません。 OpenRTM-1.0.0は色々とバグがあるようですので1.0.2(できれば1.1.0)へ移行して確認してみてもらえないでしょうか?

fkanehiro commented 10 years ago

From nothewo...@gmail.com on July 28, 2012 05:22:14

やはり名前の問題でした。 openrtmを1.1.0にしたところ、RTCの名前がHRP4C(Robot)0となり問題なく動作しました。 こちらでも1.1.0への移行を進めたいと思います。

また、可能であれば以下のようにRTCの名前をセットするパッチを 採用していただければ、1.0.0でも動作するように思います。 1.1.0では必要ないため適切なパッチではありませんが、 ご検討いただけますと幸いです。

leus@amur:~/ros/electric/rtm-ros-robotics/rtmros_common/hrpsys/build/hrpsys-base$ svn diff lib/

Index: lib/util/ProjectUtil.cpp

--- lib/util/ProjectUtil.cpp (リビジョン 422) +++ lib/util/ProjectUtil.cpp (作業コピー) @@ -29,6 +29,9 @@ if (body){ body->setName(name); world.addBody(body);

Status: Done

fkanehiro commented 10 years ago

From fkaneh...@gmail.com on July 28, 2012 05:41:49

r424 で適用させてもらいました。